SPARC结构与实时内核的移植
1.寄存器窗口
SPARC结构继承伯克利RISC结构,寄存器窗口是其一个重要特性。寄存器窗口又称寄存器组,且该组寄存器只对当前运行程序可见。一个寄存器窗口包含32个无浮点寄存器,根据其使用习惯通常记为g0,...,g7;l0,...l7;i0,...,i7;o0,...,o7。其中 g0,...,g7为全局寄存器,其余24个为当前窗口寄存器。如图1。
图1:寄存器窗口 |
特殊寄存器%PSR、%WIM
处理器状态(Processor State Register)寄存器。Bit0~Bit4为当前窗口指针(CWP)。Bit5为Trap开关(ET)。Bit8~Bit11为中断优先级(PIL)。其中CWP与寄存器窗口操作相关,ET与Trap处理相关,PIL与中断处理相关。
无效窗口标识(Windows Invalid Register)寄存器。Bit0~Bit7分别对应窗口0~7,当该位值为1时表示对应窗口为无效窗口。注意,%WIM只能有一位为1,即在CPU的8个寄存器窗口中只能存在一个窗口为无效窗口。
寄存器窗口的状态与相关操作
每个寄存器窗口都可以划分到以下四个状态之中:Current态、Invalid态、Used态和Unused态。假设CWP值为5,%WIM值为0x01,那么寄存器窗口组可以进行如下划分:
W0:Invalid;W1~W4:Unused;W5:Current;W6~W7:Used。
Overflow:当前语句为SAVE指令,并且CWP-1对应的窗口为无效窗口时,发生Overflow Trap。因为在程序调用时每出现一个新的子程序就对应一个SAVE语句,当子程序调用级数大于寄存器窗口数时,就会出现寄存器窗口用完的情况,从而需要进行Overflow Trap的处理,通常是将Used态的寄存器窗口的寄存器值保存在RAM中。
Underflow:当前语句为RESTORE指令,并且CWP+1对应的窗口为无效窗口时,发生Underflow Trap。通常RESTORE的内容是之前Overflow Trap处理时保存到RAM中的,当恢复到原来窗口时需要从RAM中读出到寄存器。
2.堆栈结构
堆栈帧
根据SPARC V8手册的附录D,每个程序都对应一个堆栈帧。每个帧包括四个基本组成部分。从%sp开始,第一部分大小为16个字,用来在Overflow Trap和Underflow Trap时保存当前窗口的inputs寄存器和local寄存器。第二部分大小为1个字,用来传递隐藏参数。当前子程序返回值不是一个变量,而是一个数据结构时,该参数可以是指向该数据结构的指针。第三部分大小为6个字,分别对应六个入口参数。这三部分是编译器为每个子程序的常规分配。其余的为第四部分,大小不确定,通常包含当前子程序中包含的Auto型的变量、数据结构等等。
通常%sp为栈顶指针,%fp为栈帧指针,相当于当前栈的栈底。并且%sp就是%o6,%fp就是%i6,所以编译器通常用语句(SAVE %sp,—0x148,%sp)来为新的线程分配一个新的栈帧。
图2:中断栈结构
中断堆栈
由于编译器不能在编译之初就给外部中断分配一个堆栈帧,所以需要根据常规的堆栈帧模拟一个执行中断服务程序的栈结构。由于中断存在嵌套,即在中断过程中发生更高优先级中断,并且在运行中断服务子程序的时候有可能改变被中断线程的寄存器值,所以在中断服务子程序中有必要进行“保护现场”和“恢复现场”。这样统一考虑,可以将中断的栈结构设计成图2所示的结构。其中,除了常规栈结构以外还包括具有控制信息的几个寄存器%psr,%pc,%npc, %y,%tbr。和被中断线程的另外两组寄存器,global寄存器和inputs寄存器。因为当进入中断服务子程序时,CWP已经减小了1,所以此时的inputs寄存器应该是被中断线程的outputs寄存器。%g0寄存器的值永远为0,所以就不再保存。同时这样的结构能尽量使每组寄存器的第0个寄存器,如%i0,%l0,%g2,%o0的偏移量为8的倍数,可以使用双字操作来优化寄存器保存与恢复的时间。
3.任务切换功能实现
对于一个支持多任务的实时内核,在实现移植时,最基本的任务就是用CPU支持的汇编语言实现任务切换的功能,在uC/OS中就是实现OSCtxSw( )的功能。
任务堆栈初始化
一般内核在创建新任务时都将初始化一个新的任务堆栈,其包含有该任务的入口地址信息,即在任务切换函数中需要设置的PC值。设置当前的堆栈指针(SP),当前堆栈帧指针(FP),处理器状态寄存器(PSR)中与寄存器窗口相关的值等。
任务堆栈的设计可以同中断堆栈的结构相同。由于任务切换更接近于子线程的调用,所以在进行上下文切换时只需保存PSR的值和
- SPARC微处理器综述(05-29)
- SPARC V8结构嵌入式微处理器开发环境的设计实现(09-18)
- SPARC高性能处理器集成开发环境及其编译器设计与实现(02-14)
- 基于BM3803MG与VxWorks的BSP的设计实现(08-12)
- 欧比特:首家登陆创业板的IC设计公司(09-12)
- 基于LEON3处理器动态图像边缘检测的SoC设计(04-21)