基于8051嵌入式系统的GPRS终端实现
与处理器无关的代码中包含了uC/OS-II的系统函数,在进行系统移植时一般不需要对这部分进行修改;只要将UCOS-II.C文件包含在自己的项目中,即可将uC/OS-II中所有与MCU无关的代码包含到移植的代码中。
与应用相关的代码是用户根据自己的应用系统定制合适的内核服务功能,它包括两个文件:OS_CFG.H、INCLUDES.H。其中OS_CFG.H用来配置内核,用户根据需要对内核进行定制,设置系统的基本情况,例如系统可提供的最大任务数量、是否定制邮箱服务、是否需要系统提供任务挂起功能、是否提供任务优先级动态改变功能等。而INCLUDES.H则是系统头文件。
处理器相关的代码中包含了对各种不同类型MCU的支持,需要根据自己的MCU对这部分进行修改。针对Keil C51编译器和8051芯片的技术特点,uC/OS-Ⅱ的移植与三个文件相关:处理器相关C文件(OS_CPU.H、OS_CPU_C.C)和汇编文件(OS_CPU_A.ASM)。
(1)修改OS_CPU。H
文件OS_CPU.H中包括了用#define语句定义的与处理器相关的常数、宏以及类型。移植时主要修改的内容有
:
·与编译器相关的数据类型的设定。参考Keil C51编译器中的帮助文件C51.PDF,具体路径为\C51\HLP\C51.PDF。
·用#define语句定义了两个宏开关中断,具体实现为:
#define OS_ENTER_CRITICAL()EA=0//关中断
#define OS_EXIT_CRITICAL() EA=1 //开中断
·根据8051堆栈的方向定义OS_STK_GROWTH。
#define OS_STK_GROWTH 0 //8051堆栈从下向上递增
置OS_STK_GROWTH为0,表示堆栈从下(低地址)向上(高地址)递增;置OS_STK_GROWTH为1,表示堆栈从上(高地址)向下(低地址)递减。
·uC/OS-II从低优先级任务切换到高优先级任务时需要用到OS_STK_SW(),通过执行OS_STK_SW()模仿中断的产生。绝大多数CPU会提供软中断或指令陷阱(TRAP)完成这项功能。中断服务子程序或指令陷阱处理函数(也叫异常处理函数)的中断向量地址必须指向汇编语言函数OSCtxSw()。因为8051没有软中断指令,所以用程序调用代替。
#define OS_TASK_SW() OSCtxSw()
(2)修改OS_CPU_C.C
uC/OS-II的移植范例要求用户编写10个简单的C函数,其中OSTaskStklnit()是必要的,其他9个函数必须声明,但不一定包含任何代码。因为Keil C51在缺省情况下把函数编译为不可重入的结构,而多任务系统要求并发操作导致重入,所以要在每个C函数及其声明后标注reentrant关键字,使编译器生成的代码在运行中支持函数可重入。另外"pdata"、"data"在uC/OS-II中用做一些函数的形参,但它同时又是Keil C51的关键字,这样会导致编译错误。通常可把"pdata''改成"ppdala","data"改成"ddata"解决此问题。具体修改的代码如下:
void * OSTaskStkInit(void (*task)(void *pd),
void *ppdata,
void *ptos,
INT16U opt)reentrant
《基于8051嵌入式系统的GPRS终端实现(第3页)》