(2)、OS-CPU-A.ASM文件
在OS-CPU-A.ASM文件中包含四个汇编语言的函数:OSSTartHighRdy()、OSCtxsw()、OSIntCtxsw()、OSTickISR()。在uC/OS-II中处于就绪态的任务的堆栈结构,看起来和刚中断的情形是一样的。要想运行最高优先级任务,移植要做的是就是将所有处理器的寄存器按顺序从任务堆栈中恢复出来,并且通过一条中断返回语句来实现任务的切换。因而,OSStartHighRdy()就是使要恢复的任务堆栈指针指到任务控制块的0偏址的内存单元中。也就是要把保存在任务堆栈中的数据以及CPU寄存器,如R0、R1、R2、R3、A0、A1、SB和FB返回到系统当前的寄存器中,并把当前堆栈指针指到PC指针的位置。
在uC/OS-II中任务的切换问题是通过发软件中断命令或依靠处理器执行陷阱指令来完成的。但是中断服务例程、陷阱或异常处理例程的向量地址必须指向OSCtxSw()。在M16C62单片机中可以通过定义软件中断0来完成任务的切换。因而,在M16C62中的中断向量表中的0号软件中断地址指向OSCtxSW()。对应的中断号为0。
OSInCtxSw()用来在ISR中执行切换功能。由于这个函数本身就是在中断中被调用,因而,在中断处理时寄存器的状态已经都被正确保存了。在OSInCtxSw()函数中要进行堆栈清理工作,只有这样被中断的任务的堆栈内容才能正确返回。
OSTIckISR()这个函数时UC/OS-II所要求的时钟基准,即时钟节拍,uC/OS-II的时钟节拍频率在10到100之间,通常为了计算方便而设为整数。在M16C62中有多个定时计数器可以选择用来作为系统的时钟基准。在该系统中利用时钟定时器A0来产生频率为100的一个时钟节拍。OSTIckISR()是一个中断响应函数,因而必须在M16C62的中断向量表中,A0的中断向量应分配给OSTIckISR(),对应的中断向量号是21。
(3)、OS_CPU_C.C文件
在这个C文件中包含6个简单的C函数,而这6个函数中和移植关系最密切的OSTaskInit()函数,这个函数是用来创建一个任务堆栈。OSTaskCreat()和OSTaskExt()就是通过调用这个函数来初始化任务的堆栈结构的,由此看来,OSTaskInit()是移植的关键。在前面的OS_CPU_A.ASM文件中,任务的切换是通过调用一个软中断0来实现任务切换,通过中断的返回指令使堆栈中的数据返回到CPU寄存器,使最高优先级的任务占有CPU,因而,OSTaskInit()函数要做的就是模拟中断发生时处理器压栈的过程,把CPU的寄存器内容压到任务堆栈中。在M16C62单片机中,系统分为两个堆栈,即:用户堆栈和中断堆栈,而在uC/OS-II进行任务切换是通过软中断0来实现的,因此,uC/OS-II的任务堆栈是M16C62中的中断堆栈。在M16C62中,响应中断后堆栈的状态如图1所示: