μC/OS II 移植

μC/OS II 移植步骤

一.设置与处理器及编译器相关的代码[OS_CPU.H]

不同的编译器会使用不同的字节长度来表示同一数据类型,所以要定义一系列数据类型以确保移植的正确性。下面是μC/OS II定义的一部分数据类型。
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;/*无符号8位*/
typedef signed char INT8S;/*带符号8位*/
typedef unsigned int INT16U;/*无符号16位*/
typedef signed int INT16S;/*带符号16位*/
typedef unsigned long INT32U;/*无符号32位数*/
typedef signed long INT32S;/*带符号32位数*/
typedef float FP32;/*单精度浮点数*/
typedef double FP64;/*双精度浮点数*/
typedef unsigned int OS_STK;/*堆栈入口宽度*/
typedef unsigned int OS_CPU_SR;/*寄存器宽度*/
μC/OS II需要先关中断再访问临界区的代码,并且在访问完后重新允许中断。μC/OS II定义了两个宏来禁止和允许中断:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),本移植实现这两个宏的汇编代码。
#define OS_ENTER_CRITICAL()(cpu_sr=OSCPUSaveSR())/*Disable interrupts*/
#define OS_EXIT_CRITICAL()(OSCPURestoreSR(cpu_sr))/*Enable interrupts*/
EXPORT OSCPUSaveSR  OSCPUSaveSR  mrs r1,cpsr  mov r0,r1  orr r1,r1,#0xc0  msr cpsr_cxsf,r1  mov pc,lr
EXPORT OSCPURestoreSR  OSCPURestoreSR  msr cpsr_cxsf,r0  mov pc,lr

二.用C语言实现与处理器任务相关的函数[OS_CPU_C.C]

OSTaskStkInit()  OSTaskCreateHook()  OSTaskDelHook()  OSTaskSwHook()  OSTaskStatHook() OSTimeTickHook()  实际需要修改的只有OSTaskStkInit()函数,其他五个函数需要声明,但不一定有实际内容。这五个函数都是用户定义的,所以OS_CPU_C.C中没有给出代码。如果需要使用这些函数,可以将文件OS_CFG.H中的#define constant OS_CPU_HOOKS_EN设为1,设为0表示不使用这些函数。  OSTaskStkInit()函数由OSTaskCreate()或OSTaskCreateExt()调用,需要传递的参数是任务代码的起始地址、参数指针(pdata)、任务堆栈顶端的地址和任务的优先级,用来初始化任务的堆栈,初始状态的堆栈模拟发生一次中断后的堆栈结构。堆栈初始化工作结束后,OSTaskStkInit()返回新的堆栈栈顶指针,OSTaskCreate()或OSTaskCreateExt()将指针保存在任务的OS_TCB中。调用OSTaskStkInit()给任务做一个初始的任务上下文堆栈

三.处理器相关部分汇编实现、

整个μC/OS II移植实现中,只需要提供一个汇编语言文件,提供几个必须由汇编才能实现的函数。

a)OSStartHighRdy()  该函数在OSStart()多任务启动之后,负责从最高优先级任务的TCB控制块中获得该任务的堆栈指针sp,通过sp依次将CPU现场恢复,此时系统就将控制权交给用户创建的该任务的进程,直到该任务被阻塞或者被其他更高优先级的任务抢占了CPU。该函数仅仅在多任务启动时被执行一次,用来启动第一个,也就是最高优先级的任务执行。

b)OSCtxSw()  该函数是任务级的上下文切换函数,在任务因为被阻塞而主动请求与CPU调度时执行,主要工作是先将当前任务的CPU现场保存到该任务堆栈中,然后获得最高优先级任务的堆栈指针,从该堆栈中恢复此任务的CPU现场,使之继续执行,从而完成一次任务切换。

C)OSIntExit()  该函数是中断级的任务切换函数,在时钟中断ISR中发现有高优先级任务在等待时,需要在中断退出后不返回被中断的任务,而是直接调度就绪的高优先级任务执行。其目的在于能够尽快让高优先级的任务得到响应,保证系统的实时性能。

d)OSTickISR()  该函数是时钟中断处理函数,主要任务是负责处理时钟中断,调用系统实现的OSTimeTick函数,如果有等待时钟信号的高优先级任务,则需要在中断级别上调度其执行。另外两个相关函数是OSIntEnter()和OSIntExit(),都需要在ISR中执行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章