uCOS操作系统移植分析
一、OS_CPU.H文件
1、处理器必须满足以下要求:
(1). 处理器的C编译器能产生可重入代码。
(2). 用C语言就可以打开和关闭中断。
(3). 处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。
(4). 处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。
(5.) 处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令
因为不同的微处理器有不同的字长,所以µ C/OS-Ⅱ的移植包括了一系列的类型定义以确保其可移植性。尤其是,µ C/OS-Ⅱ代码从不使用C的short, int和long等数据类型,因为它们是与编译器相关的,不可移植。
2、开中断:OS_ENTER_CRITICAL()与关中断:OS_EXIT_CRITICAL() µC/OS-Ⅱ需要先禁止中断再访问代码的临界段,并且在访问完毕后重新允许中断。这就使得µ C/OS- Ⅱ能够保护临界段代码免受多任务或中断服务例程(ISRs)的破坏。
3、堆栈处理OS_STK_GROWTH。 置OS_STK_GROWTH为0表示堆栈从下往上长;置OS_STK_GROWTH为1表示堆栈从上往下长。
4、OS_TASK_SW()是一个宏,它是在µ C/OS-Ⅱ从低优先级任务切换到最高优先级任务时被调用的。OS_TASK_SW()总是在任务级代码中被调用的。另一个函数OSIntExit()被用来在ISR使得更高优先级任务处于就绪状态时,执行任务切换功能。
二、OS_CPU_C.C文件
uCOS-II的移植范例要求用户编写10个简单的C函数:
OSTaskStkInit() //必须要实现的函数,OSTaskCreat()和OSTaskCreatExt()通过调用此函数来初始化任务的栈结构.
OSTaskCreatHook() //当用OSTaskCreate() 或 OSTaskCreateExt() 建立任务的时候就会调用OSTaskCreateHook()。该函数允许用户或使用用户的移植实例的用户扩展 µC/OS-Ⅱ的功能。
OSTaskSwHook() //做任务切换时,会调用此函数。不管任务切换是通过 OSCtxSw()还是OSIntCtxSw()来执行的都会调用该函数。 OSTaskSwHook()可以直接访问 OSTCBCur 和OSTCBHighRdy,因为它们是全局变量。 OSTCBCur 指向被切换出去的任务的 OS_TCB,而OSTCBHighRdy指向新任务的OS_TCB
OSTaskStatHook() //OSTaskStatHook()每秒钟都会被OSTaskStat()调用一次。用户可以用OSTaskStatHook()来扩展统计功能
OSTimeTickHook() //在每个时钟节拍都会被OSTimeTick()调用。
OSTCBInitHook() //可以做一些与初始化控制块OS_TCB有关的处理。
OSTaskIdleHook() //OSTaskIdle()函数可调用OSTaskIdleHook()函数实现CPU低功耗模式。
OSInitHookBegin //进入OSInit函数后,会此函数立即调用。
OSInitHookEnd() //功能与OSInitHooBegin相同
三、OS_CPU_A.ASM文件
µ C/OS-Ⅱ的移植实例要求用户编写四个简单的汇编语言函数:
OSStartHighRdy()
OSCtxSw()
OSIntCtxSw()
OSTickISR()
如果用户的编译器支持插入汇编语言代码的话,用户就可以将所有与处理器相关的代码放到OS_CPU_C.C文件中,而不必再拥有一些分散的汇编语言文件。
1、OSStartHighRdy() OSStart()函数调用OSStartHighRdy()来使就绪任务中优先级最高的任务开始运行。
2、OSCtxSw() 任务级的切换是通过执行软中断指令,或者依据处理器的不同,执行TRAP指令来实现的,中断服务子程序、陷阱或异常处理的向量地址必须指向OSCtxSw()。
3、OSTickISR() uCOS-II 要求用户提供一个周期性的时钟源,来实现时间的延迟和超时功能。
4、OSIntCtxSw() OSIntExit()通过调用OSIntCtxSw(),在ISR中执行任务切换功能。