现在的位置: 首页 > 综合 > 正文

邵贝贝译<嵌入式实时操作系统uCOS-ii>:第13章 uCOS操作系统移植分析

2013年08月03日 ⁄ 综合 ⁄ 共 1944字 ⁄ 字号 评论关闭

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中执行任务切换功能。

抱歉!评论已关闭.