IT业行者,行者无疆
分类: 嵌入式
2010-09-27 09:15:39
OS_CPU_S.S文件
这个文件完全是用汇编代码写的,是这次移植中代码比较难于实现的文件,也是决定移植效率的文件,对ARM指令的熟悉程度和ADS的熟悉程程度,令我对zlg 的牛人非常的佩服,呵呵,要是以后有时间,自己也做一个完整的移植代码,挑战一下自己,呵呵,好了,废话不说了,北京老是下雨。。。。。。。开始吧,come on。
;定义管理模式堆栈的大小
SVC_STACK_LEGTH
这是定义了管理模式的堆栈,因为在任务切换的时候有在管理模式下进行了一些数据的保存动作
NoInt
USR32Mode
SVC32Mode
SYS32Mode
IRQ32Mode
FIQ32Mode
;T_bit用于检测进入异常前cpu是否处于THUMB状态
T_bit
以上是定义了一些常量
这个就不用解释了吧?记住IMPORT和EXPORT关键字就行了,实在不懂就看我以前的连载吧。
StackSvc
SvcStackSpace
我把这两句放到一起来解释吧。AREA是说明这个一块数据,SWIStacks是这段数据的名称,DATA代表这是数据,不是代码段,NOINT代表这块数据没有进行初始化,就是没有清零吧,ALIGN是要求编译器必须按照字整齐排列这些数据,SPACE是预汇编宏指令,要求编译器预留一段连续的数据块,数据块的大小是SVC_STACK_LEGTH * 4,这个大小是字节为单位的,SvcStackSpace是给这段数据块的名字,就是他的句柄啦。DCD也是一个为指令,给一段数据命名,SvcStackSpace + SVC_STACK_LEGTH * 4 - 4就是这段数据块的首地址,所以StackSvc就是代表这段数据的首地址了。
;软件中断
SoftwareInterrupt
这是软件中断的唯一入口,既是当产生软件中断时,立刻程序转到这里执行,代码的开始段是管理模式
具体的手册看ARM的说明,在Thumb和Arm状态下SWI号的传递是不一样的,
SWI号的第一和第二分别单独的实现,分别是中断级任务切断函数和多任务启动函数,其他的中断号都在SWI_Exception中实现。
调用中断级任务切换函数
调用多任务启动函数
调用其他的软件中断函数
加!代表同时更新SP的值,堆栈恢复后管理模式的堆栈必须恢复,否则会产生溢出的,^代表最后恢复PC的值,就是中断返回啦。