ean J. Labrosse所著《MicroC / OS-II: The Real Time Kernel (Second Edition)》(一下简称“宝书”)是基于1999年发布的2.00版本,目前uC/OS-II发展到了2.90版(2010年发布),其自身已经发生了很大的变化。当移植新版本uC/OS-II时,会发现很多需要移植的声明、定义、函数等等已经不符合书中介绍的情况和方法了。在这里尝试做一个简单的比较和说明,以便能进一步简化和了解uC/OS-II的移植。本文只阐述涉及移植方面的变化,其它关于新功能、新函数以及各类优化的描述见另文。
1.uC/OS-II中断使能状态的保存
除了宝书中定义的两种方法,从2.04版开始使用了第三种方法,即将中断使能状态保存在一个临时变量cpu_sr中,并且在OS_CPU.H中定义宏如下:
#if OS_CRITICAL_METHOD == 3
#define OS_ENTER_CRITICAL() cpu_sr = OS_CPU_SR_Save())
#define OS_EXIT_CRITICAL() OS_CPU_SR_Restore(cpu_sr))
#endif
所以不要忘记实现函数OS_CPU_SR_Save()和OS_CPU_SR_Restore()。
2.新文件
和2.00版相比,uC/OS-II陆续增加了3个新文件。一个是OS_TMR.C,这是一个和处理器无关的内核文件,移植时加到工程/项目中即可。第二个是OS_DBG.C,其中定义了一系列的变量,用于内核调试器(Kernel Aware Debugger),可以按照实际使用情况决定是否包含此文件。第三个文件是APP_CFG.H,建议将用户任务级别,任务堆栈大小的定义放到这个文件中。
为了方便,uC/OS-II还提供了2个原始模板文件,OS_CFG_R.H和OS_DBG_R.C,使用时拷贝成不带_R后缀的文件,然后按照使用要求再行修改。
3.新常量
除了要按照硬件平台具体情况定义OS_TICKS_PER_SEC常量外,还要定义常量OS_TMR_CFG_TICKS_PER_SEC,它决定了timer的更新速率。建议值是10,也就是100ms更新一次timer。
4.新函数
uC/OS-II发展到2.90后,用户要自定义一系列钩子函数,当然在需要使用的情况下。
void App_TaskCreateHook(OS_TCB *ptcb);
void App_TaskDelHook(OS_TCB *ptcb);
void App_TaskIdleHook(void);
void App_TaskReturnHook(OS_TCB *ptcb);
void App_TaskStatHook(void);
void App_TaskSwHook(void);
void App_TCBInitHook(OS_TCB *ptcb);
void App_TimeTickHook(void);
void OSTaskReturnHook(OS_TCB *ptcb);
5.移植实例
移植的uC/OS-II版本号为2.91,编译环境为WinAVR-20100110
硬件平台是一个ATmega644最小系统。一个用来显示多任务运行情况的LED接到PB1,另外还利用了644的UART来输出当前CPU占用率。644外部晶振14.7456MHz,系统Timetick设置为17.7ms。
所有源程序连接如下:
http://pan.baidu.com/share/link?shareid=130984&uk=1093185800