4.2 系统的移植 移植是指使一个实时操作系统能够在某个微处理器平台上运行。每个实时嵌入式操作系统都支持很多种处理器,为了使其在具体的硬件平台上工作,必须根据具体的硬件平台完成移植工作。为了便于用户的使用,嵌入式操作系统生产商一般提供一些通用的板级支持包(Board Support Package,BSP)(有的称为硬件抽象层(Hardware Abstract Layer, HAL)),用户只需选择与自己相近的BSP进行修改,可以很容易完成移植工作。 copyright paper51.com μC/OS-II没有提供BSP,需要用户独立完成此工作。由于在设计时已经充分考虑了可移植性,移植工作并不太复杂,要根据具体硬件平台,对文件OS_CPU.H、OS_CPU_C.C和OS_CPU_A.ASM进行合理的修改。 paper51.com 要使其正常运行,处理器首先需满足以下要求: 内容来自论文无忧网 www.paper51.com ² 处理器的C编译器能产生可重入代码; 内容来自www.paper51.com ² 用C语言就可以打开和关闭中断; http://www.paper51.com ² 处理器支持中断,并且能够产生定时中断(通常在10Hz至100Hz之间); copyright paper51.com
² 处理器支持能够容纳一定数量数据(可能是几千字节)的硬件堆栈; copyright paper51.com ² 处理器有将堆栈指针和其他CPU寄存器读出和存储到堆栈或内存中的指令。 paper51.com 针对本论文论文中选用的SM5964微处理器和开发工具Keil C51 7.0,进行移植时,重点考虑函数的重入和任务栈的结构及大小的确定。对三个文件进行的修改如下。 内容来自论文无忧网 www.paper51.com 1). 设置OS_CPU.H 中与处理器和编译器相关的代码 copyright paper51.com /* 与编译器相关数据类型 */ paper51.com typedef unsigned char BOOLEAN; 内容来自论文无忧网 www.paper51.com typedef unsigned char INT8U; //无符号8位数 paper51.com typedef signed char INT8S; //有符号8位数 内容来自www.paper51.com typedef unsigned int INT16U; //无符号16位数 http://www.paper51.com typedef signed int INT16S; //有符号16位数 copyright paper51.com typedef unsigned long INT32U; //无符号32位数 copyright paper51.com
typedef signed long INT32S; //有符号32位数 copyright paper51.com typedef float FP32; //单精度浮点数 内容来自www.paper51.com typedef double FP64; //双精度浮点数 内容来自论文无忧网 www.paper51.com typedef unsigned char OS_STK; //栈单元宽度为8比特 内容来自论文无忧网 www.paper51.com / * 处理器相关代码 (大模式) */ copyright paper51.com #define OS_ENTER_CRITICAL() EA=0 //关中断 内容来自www.paper51.com #define OS_EXIT_CRITICAL() EA=1 //开中断 内容来自论文无忧网 www.paper51.com #define OS_STK_GROWTH 0 //堆栈从下往上增长 1=向下, 内容来自www.paper51.com //0=向上 内容来自论文无忧网 www.paper51.com #define OS_TASK_SW() OSCtxSw() /*因为微处理器没有软中断指令,所以用程序调用代替*/ http://www.paper51.com 2).在OS_CPU_C.C中用C语言编写6个与操作系统相关的函数 内容来自论文无忧网 www.paper51.com
在此文件中主要是完成任务初始化函数OSTaskStkInit ( )的编写,每个任务在创建时,要初始化自己的任务堆栈,任务堆栈的结构类似系统发生一次中断后的堆栈结构,在进行任务切换时,它要用来存储与本任务相关的所有信息。其它5个函数需要声明,因在此用不到, 没有实际内容。如果需要使用可以进行编程。 copyright paper51.com void *OSTaskStkInit (void(*task)(void *pd), void *ppdata, 内容来自论文无忧网 www.paper51.com void *ptos, INT16Uopt) reentrant paper51.com { 内容来自www.paper51.com OS_STK *stk; http://www.paper51.com ppdata = ppdata; http://www.paper51.com opt = opt; /*opt没被用到,保留此语句防止报警产生 */ http://www.paper51.com stk = (OS_STK *)ptos; //用户堆栈最低有效地址 内容来自论文无忧网 www.paper51.com
*stk++ = 15; //用户堆栈长度 paper51.com
*stk++ = (INT16U)task &0Xff; //任务地址低8位 paper51.com *stk++ = (INT16U)task>> 8; //任务地址高8位 内容来自www.paper51.com *stk++ = 0x00; //PSW copyright paper51.com
*stk++ = 0x0A; //ACC copyright paper51.com
*stk++ = 0x0B; //B copyright paper51.com *stk++ = 0x00; //DPL copyright paper51.com *stk++ = 0x00; //DPH http://www.paper51.com *stk++ = 0x00; //R0 内容来自www.paper51.com *stk++ = 0x01; //R1 paper51.com
*stk++ = 0x02; //R2 copyright paper51.com
*stk++ = 0x03; //R3 copyright paper51.com *stk++ = 0x04; //R4 内容来自论文无忧网 www.paper51.com *stk++ = 0x05; //R5 内容来自www.paper51.com *stk++ = 0x06; //R6 内容来自www.paper51.com
*stk++ = 0x07; //R7 内容来自论文无忧网 www.paper51.com /*不用保存SP,任务切换时根据用户堆栈长度计算得出。*/ http://www.paper51.com *stk++ = (INT16U)(ptos+MaxStkSize) >> 8; paper51.com
/*?C_XBP 仿真堆栈指针高8位*/ 内容来自论文无忧网 www.paper51.com
*stk++ = (INT16U)(ptos+MaxStkSize) & 0xFF; 内容来自www.paper51.com /*?C_XBP 仿真堆栈指针低8位*/ copyright paper51.com return ((void *)ptos); copyright paper51.com } 内容来自www.paper51.com void OSTaskCreateHook (OS_TCB *ptcb)reentrant; copyright paper51.com void OSTaskDelHook (OS_TCB *ptcb)reentrant; http://www.paper51.com void OSTaskSwHook (void) reentrant; 内容来自www.paper51.com void OSTaskStatHook (void) reentrant; 内容来自www.paper51.com
void OSTimeTickHook (void) reentrant; 内容来自论文无忧网 www.paper51.com 3). 用汇编语言编写OS_CPU_A.ASM中4个与处理器相关的函数 http://www.paper51.com ² OSStartHighRdy ( ):运行优先级最高的就绪任务 内容来自www.paper51.com
² OSCtxSw ( ) :任务级的任务切换函数 http://www.paper51.com ² OSIntCtxSw ( ):中断级的任务切换函数 内容来自www.paper51.com ² OSTickISR ( ):中断服务函数 内容来自论文无忧网 www.paper51.com
以上四个函数的具体内容见附录。 内容来自www.paper51.com 完成上述3个文件的编写之后,μC/OS-II就可以在系统的硬件平台上正常运行了。 http://www.paper51.com
|