uCOS-II移植-STM32F10x_Keil
【@.1 移植步骤】
网上关于STM32的移植工程很多,不过实际上很多移植工程其中的中断都不能用的,因为没有把STM32中断入口地址与uCOS-II的中断管理机制联系在一起。估计很多移植工程只是简单的写了些跑马灯就好了,没有具体写中断函数测试。这里的移植过程跟我之前做过的LPC2119移植过程类似,也是改文件,改函数名,但是还是那句话,如果你不了解CPU的内核机制,中断机制,以及OS的任务调度原理,照着别人的移植工程不求甚解,是得不到提升的。
工程目录建立参考LPC2119,拷贝文件来源于官方移植工程Micrium_STM32xxx_uCOS-II.exe。具体的详细步骤我有机会再详细写写,包括STM32中与ARM7的中断方式的差异。移植时主要注意一下三个关键即可:
关键1:stm32中的Systick中断的替换OS中的ticker
关键2:PendSV中断的替换成OS中的OSCtxSw()
关键3:所有外设中断入口需重写(先经过OS调用后再进入中断服务程序)
大致的流程如下:
1.os_cpu_a.asm 中用 PendSV_Handler 代替 OS_CPU_PendSVHandler用作PendSV中断,同时注释掉stm32f10x_it.h和stm32f10x_it.c中PendSV_Handler()函数定义,在os_cpu.h中注释掉OS_CPU_PendSVHandler()函数声明替换为PendSV_Handler()的申明。
2.注释掉os_cpu.h和os_cpu.c中OS_CPU_SysTickHandler()相关代码,将其内部代码复制到stm32f10x_it.c中的SysTick_Handler()下。注释掉os_cpu.h中OS_CPU_SysTickInit,OS_CPU_SysTickClkFreq的函数声明,这里是用移植工程中bsp中的相关函数初始化systick,之后改用标准库自己初始化。
3.中断重写,用启动代码中中断函数名代替OS移植中的BSP_IntHandlerXXX(),放在stm32f10x_it.c和stm32f10x_it.h中,源bsp.c和bsp.h中的中断管理函数BSP_IntInit,BSP_IntEn,BSP_IntDis,BSP_IntClr,BSP_IntVectSet,BSP_IntPrioSet(参考移植工程)全改为STM_Int开头,放在stm32f10x_it.c和stm32f10x_it.h中,并在stm32f10x_it.c中添加static CPU_FNCT_VOID STM_IntVectTbl[STM_INT_SRC_NBR];定义用于中断函数存放。以后irq中断的注册,enable ,pending都可用移植工程中提供的方法而不用stm stdlib 3.5库中的函数,比如调用STM_IntVectSet函数进行中断服务函数的注册。
我使用的目标开发板在另一篇博客中有介绍,移植的模板可以见最下面有下载。我在app.c中写了一个简单的测试应用,就是一个带外部中断的按键去抖操作。关于按键去抖在OS中的实现原理可以参考我的这篇文章的最后一个例子,即外部中断通过发送消息Post调度去抖任务,确认去抖之后再Resume对应的电机驱动任务。当然我在开发板中的电机驱动任务使用小灯闪烁来代替的。实际处理时我采用了动态改变中断服务函数的方法,即,当外部中断下降沿来临之后,会重新注册外部中断为上升沿触发,改变其对应的服务函数。
模板下载:STM32_uCOSPrj.7z
@.[FIN] @.date->Mar 28, 2013 @.author->apollius