实时嵌入式操作系统μC/OS-II在MPC555上的移植
表1 堆栈结构表 SP Offset Register Saved NUM Default Value 584~336
328
320~80
72
64
56
48
40
32
24
16
8
0 FP31~FP0
FPSCR
GPR31~GPR0
DAR
CTX
LR
XER
CR
SRR1
SRR0
MSR
SP(GPR1)
73~42
41
40~10
9
8
7
6
5
4
3
2
1
0 0.0
0x000020FC0000
0x0
0x00
0x00
task*0x100000000[1]
0x00
0x00
0x0000B00200000000
task*0x100000000[1]
0x0000B00200000000
0
注:堆栈所属任务代码入口地址
2 中断管理
首先,分析一下MPC555的中断结构。在MPC中有新的概念——异常(Exception)。它包含所有CPU非正常事件的出现,包括中断、总线错误、指令错误、系统调用异常、实时中断异常和复位等。MPC为异常提供了异常向量表。该表为每个异常提供一个256字节的异常处理代码空间。
所有外部中断和I/O子模块产生的中断共同作为异常的一种,占用异常向量表中的一个位置。在该异常处理程序中,软件需根据中断状态寄存器的值判断到底发生了哪个中断并进行相应处理。
在每次发生异常时,MPC自动将主状态寄存器MSR保存到SRR1中,将程序指针PC保存到SRR0中;然后PC指针指向该异常在异常向量表中的起始位置,进入异常处理程序。每次异常返回时,调用rfi指令,系统自动将SRR1中的值返回MSR中,将SRR0中的值返回PC中,即程序从SRR0指向的位置继续执行。在发生异常和异常返回之间,不自动允许新的异常和中断。所以,程序需要在保存SRR0和SRR1后允许异常,在适当的时候允许中断。
μC/OS-II的异常处理过程中,用户及OS与硬件无关的代码完成图2中①、②、③、④、⑤这五个步骤。依次完成以下任务:①给OSIntNesting加1或调用OSIntEnter(),通知OS,系统已进入中断;②分析中断源调用相应中断处理子程;③在该中断处理子程中完成清中断源;④进行其他中断处理;⑤调用OSIntExit()判断是否有更高优先级的任务被激活而需要进行任务调度,若不需要,则直接从中断返回;若需要,则调用OSIntCtxSw()完成中断级任务调度。
移植中,为了在MPC555上实现上述中断处理过程,需编写与硬件相关代码,为以上思路提供三个接口函数:进入中断、退出中断和中断级任务调度。根据MPC555的编程结构,设计的完整中断程序流程如图2。虚框Ⅰ部分写在异常向量表中每个异常的处理代码空间中,依次调用Prologue()、Exception-Routine()和Epilogue()三个函数。
其中,Exception-Routine()函数为①到⑤步中断处理子程提供调用接口。
虚框Ⅱ中为与硬件相关的函数Prologue(),它将发生中断时所有寄存器保存到当前任务的堆栈中,并处理CPU状态。是O
《实时嵌入式操作系统μC/OS-II在MPC555上的移植(第2页)》