SPARC结构与实时内核的移植
在切换函数执行完,中断返回时执行语句“JMP %l1;RETT %l2”将新任务的入口地址写入到CPU的PC和NPC,完成任务级切换。
中断级切换
如果内核为可抢占实时内核,任务调度(通常在中断中被调用)将高优先级的任务置为有效时,需要在当前中断中完成任务的切换,使高优先级任务尽快得到CPU使用权,并在该高优先级任务执行完,且没有其它高优先任务被响应时,继续执行之前被中断的任务。
中断级切换函数必须对被中断的任务进行“现场保护”,因为每个中断函数都有“保护现场”功能,所以这一操作不难实现。此外,中断级切换函数还需要为新任务分配一组新的寄存器窗口,即保存当前所有Used态的窗口寄存器的值到堆栈对应的帧中。可以称之为Windows_flush,这也是寄存器窗口相关的操作。最简单的flush就是在%WIM中将当前窗口置为无效窗口,通过SAVE语句将当前窗口对应的inputs和locals寄存器的值写入堆栈。通过循环控制,可以将8个寄存器窗口的值全部保存,并且SAVE指令通过将%o6的值写入%i6,能自动实现栈帧的切换。在执行 Windows_flush后,当前任务以及其中调用的各线程的堆栈帧才全部被填充,成为一个连续堆栈,这样才做好了到更高优先级切换的准备。中断级任务切换的流程图如图3。
4.系统中断
时钟节拍
对于一个多任务系统,时钟节拍是必不可少的。ERC32CPU提供2个定时器,根据系统硬件采用的晶振源频率,可通过设置对应定时器控制寄存器的计数值,通过产生一定周期的系统中断来实现时钟节拍。对于时钟节拍的处理子程序,所选内核不同,其自带子程序也不同。在定时中断到来,只需将子程序入口地址添加到中断服务子程序中即可。
中断嵌套
当在系统开发中需要不同优先级中断,并可能发生中断嵌套的情况时,需要在进入中断服务子程序之前设置中断优先级,然后打开Trap,以允许在较长的中断服务子程序中响应更高优先级的中断。在退出中断服务子程序后,关闭Trap,将该中断优先级屏蔽掉,然后退出中断。
堆栈段
在堆栈的管理上存在堆栈帧的概念,并且每个帧的分配与产生都对应一个新的窗口和一个新的线程或者中断。根据中断的栈结构和线程栈结构的不同,可在程序初始化部分分配两个堆栈段。一个堆栈段对应普通线程的堆栈分配和管理,一个对应中断栈的分配和管理。这样在每个段中各帧的大小一致,不会在 Overflow Trap和Underflow Trap时读写内存出错。可以通过增加两个变量LEVEL,SKP来协调两个堆栈段的使用。使用两个堆栈的中断嵌套服务子程序流程图如图4。
5.总结
SPARC结构中比较复杂的部分就是寄存器窗口的概念,但在使用中,效率也高很多。如果能了解寄存器窗口的工作原理,并能正确使用Window flush操作,在软件设计上将会得到高的可靠性。
本文作者的创新点为,将能实现自动控制需求的小型uC/OS内核移植到具有高可靠性SPARC结构的ERC32 CPU。ERC32 CPU是专门针对航天应用而设计的CPU,采用SPARC V7指令集。航天工程的控制不像消费电子的控制那么复杂,但在可靠性和实时性方面要求比较苛刻,能够移植满足需求的小型内核,如uC/OS到ERC32,在工程上有很大的应用价值。
参考文献:
1.The SPARC Architecture Manual Version 8,SPARC International,Inc.1998.
2.Jean J.Labro
- SPARC微处理器综述(05-29)
- SPARC V8结构嵌入式微处理器开发环境的设计实现(09-18)
- SPARC高性能处理器集成开发环境及其编译器设计与实现(02-14)
- 基于BM3803MG与VxWorks的BSP的设计实现(08-12)
- 欧比特:首家登陆创业板的IC设计公司(09-12)
- 基于LEON3处理器动态图像边缘检测的SoC设计(04-21)