想请问一下做过相关开发的高手,在ARM7TDMI核上跑的操作系统,线程切换(或者说是任务调度、任务切换、线程切换)时,需要保存哪些系统寄存器。阅读过ATPCS的内容,感觉好像没有提到这些,不知道要看哪些相关的资料。
------解决方案--------------------
ATPCS全称ARM-THUMB procedure call standard(即,arm-thumb过程调用约定)当然不会提到你说的那些了!
任务调度的话属于是硬性中断,所有寄存器内容都有可能在任务恢复后被使用到;所以,个人觉得应该全部保存……
即:r0-r15 及 cpsr,如果被中断任务运行于带spsr的模式,这个寄存器也应该要保存。

------解决方案--------------------
在进行任务切换的时候,现场的CPU寄存器上下文都要保存在当前被中断任务的堆栈中,对于不同体系结构的处理器,其需要保护的CPU寄存器的个数和顺序都因目标而不同,有些体系结构的编译器发生中断时将当前程序状态寄存器和断点地址的值保存在系统堆栈中,而有些处理器由于其体系结构特点中断时则将当前程序状态寄存器和断点地址的值直接保存在特殊的寄存器中并不压入堆栈,因此具体的堆栈结构需要根据目标体系的需要由用户自己定义。
------解决方案--------------------
根据ARM体系结构的特点,除快速中断模式以外,所有运行模式共用r0-r12共13个通用寄存器,每种异常模式有自己独立的物理r13(sp)一般用作堆栈指针以及用来保存断点返回地址的连接寄存器r14(lr)。而且发生中断时程序状态寄存器(CPSR)会自动保存到所进入的对应的异常模式下的备份程序状态寄存器(SPSR),因此也需要将其保护好。另外,新的任务投入运行后,有些独立于线程的环境量也需要保存,此外还取决于用户想让任务运行于什么模式,因此根据需要不同堆栈的结构也不是唯一的
--具体参考这篇文章吧:
转载自 seu_dust的专栏
www.52rd.com/Blog/Detail_RD.Blog_seu_dust_10617.html
------解决方案--------------------

------解决方案--------------------
嗯,不过在汇编调用c函数里要注意先设置好sp指针,如果sp指向一个不可写的位置,会死掉……
------解决方案--------------------
纯c怎么可能起得起来!你随便写了个c函数编译不链接看看,前面几句定然有个push,很多平台起来的时候栈指针都是空的,果断就死了!
很多低层的东西还是要汇编的!