4、μCOS-Ⅱ的移植
μCOS-Ⅱ绝大部分的代码是用ANSI C编写的,可移植性好。但是用户在移植时还需要修改相应的几个文件。与应用相关部分需要用户根据自己实际应用的需要进行配置,与处理器相关的部分需要用户根据不同处理器的结构修改相应的代码,以使操作系统能够准确的进行任务的切换等[1]。主要需要修改的函数如下:
1.OS_CPU.H 它主要包括了用#define语句定义的、与处理器相关的常数、宏以及类型。比如:typedef unsigned char INT8U、#define OS_TASK_GROUTH 1以及如何处理临界代码段等。
2.OS_CPU_C.C 在这个文件中要求用户编写10个简单的C函数,但是唯一必须要修改的是OSTaskInit();这个函数初始化堆栈,应该按照中断时系统保护现场的进栈顺序来初始化堆栈结构。对于HCS08系列单片机来说,当中断发生时,依次进栈的是PCL、PCH、X、A、和CCR寄存器值。同时为了保证系统的稳定还把额外的一个变址寄存器H进栈,有时还要保存页值。初始化完成后,将栈顶位置SP保存在任务控制块TCB中。
3.OS_CPU_A.ASM 在这个文件中需要修改关键的四个函数。
(1)OSStartHighRdy() OSStart()函数调用它来是就绪任务中优先级最高的任务开始运行。这部分一般要求用户把它转化成汇编语言实现。本文中代码如下:
OSTaskSwHook();
asm lda #$01
asm sta OSRunning
asm ldhx OSTCBHighRdy
asm ldhx 0, x
asm txs
asm pulh
asm pula
asm sta PAGE
asm rti
(2)任务级切换函数OSCtxSw() 主要通过执行软中断或TRAP来实现在任务级的切换功能。其中中断向量指向OSCtxSw()函数的入口地址。在OSSched()的最后操作系统调用OS_TASK_SW执行软中断或TRAP指令,该指令找到对应的OSCtxSw()实现任务的切换。OSCtxSw()首先要保存当前运行任务的各寄存器状态到自己的堆栈中,并且保存当前栈顶位置;然后找到将要运行的任务,并且把保存该任务堆栈中的寄存器弹到CPU内部寄存器中,执行中断返回指令,这样使CPU从新的任务处执行,直到下一个任务切换的到来。执行代码如下: