线程切换时需要保存哪些系统寄存器?

lr2131 2012-11-27 12:34:41
想请问一下做过相关开发的高手,在ARM7TDMI核上跑的操作系统,线程切换(或者说是任务调度、任务切换、线程切换)时,需要保存哪些系统寄存器。阅读过ATPCS的内容,感觉好像没有提到这些,不知道要看哪些相关的资料。
...全文
1048 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhujinqiang 2012-11-30
  • 打赏
  • 举报
回复
低层的东西还是要汇编的 很多开发工具允许写c的时候把汇编嵌到C里面编译.
lr2131 2012-11-29
  • 打赏
  • 举报
回复
引用 11 楼 JQGuardian 的回复:
引用 10 楼 lr2131 的回复:谢谢JQGuardian的回复。 汇编编写的代码需要程序员自己维护栈和保存寄存器的工作。 ATPCS是APCS的一个子集,这个应该算是用在汇编和C相互调用时遵循的标准是吗? 嗯,不过在汇编调用c函数里要注意先设置好sp指针,如果sp指向一个不可写的位置,会死掉……
你说的这个情况,我昨天刚遇到了。我搞错了堆栈的增长方向了,把用C开的静态存储区的低地址给了SP,一下就溢出了,很快就死了。一查SP,才发现问题了。
HMGuardian 2012-11-29
  • 打赏
  • 举报
回复
引用 13 楼 lr2131 的回复:
问题已经都解决了,还想问一下,是不是C语言不能直接操作CPU内的寄存器,例如这些R0-R15....等这些寄存器。那如果是这样的话,应该说没有哪个操作系统可以用纯C来写吧,至少现场保存这块必须是得用汇编来写的。这种理解不知道是不是对的。
纯c怎么可能起得起来!你随便写了个c函数编译不链接看看,前面几句定然有个push,很多平台起来的时候栈指针都是空的,果断就死了! 很多低层的东西还是要汇编的!
lr2131 2012-11-29
  • 打赏
  • 举报
回复
问题已经都解决了,还想问一下,是不是C语言不能直接操作CPU内的寄存器,例如这些R0-R15....等这些寄存器。那如果是这样的话,应该说没有哪个操作系统可以用纯C来写吧,至少现场保存这块必须是得用汇编来写的。这种理解不知道是不是对的。
HMGuardian 2012-11-28
  • 打赏
  • 举报
回复
引用 10 楼 lr2131 的回复:
谢谢JQGuardian的回复。 汇编编写的代码需要程序员自己维护栈和保存寄存器的工作。 ATPCS是APCS的一个子集,这个应该算是用在汇编和C相互调用时遵循的标准是吗?
嗯,不过在汇编调用c函数里要注意先设置好sp指针,如果sp指向一个不可写的位置,会死掉……
lr2131 2012-11-28
  • 打赏
  • 举报
回复
如果是汇编写的代码,就不知道编译器会不会这么“智能”了。看来想要偷懒让编译器来做这些寄存器的工作有些不放心、。总之,会用到(有的地方说破坏)的寄存器就要保存,没用到的可以不保存。所以就不管了,都保存了算了,并确保各个模式下压栈前和出栈后的全部寄存器(至少是要用到的寄存器)都和之前的一样,我想这个总该不会有问题了吧。
lr2131 2012-11-28
  • 打赏
  • 举报
回复
谢谢JQGuardian和zhujinqiang的回复。 之前看了一点ARM汇编的代码,发现用C编写的代码编译出来的汇编代码,有一些寄存器并没有保存,就有些疑问,以为存在某些寄存器在函数调用或是模式切换时不需要保存。但后来发现如果是改动了这些C编写的代码,相对之前没改的代码,可能就有一些寄存器要保存了,也肯能有一些寄存器就不保存了。这个我想应该是编译器的优化吧,由于是C编写的代码,由编译器汇编,它很清楚哪些函数里用到哪些寄存器,所以在进入另一个函数里如果不使用上一个函数的寄存器,它进到这个函数就不保存,反过来如果是用到了,就要保存。估计,这个原则也适用于模式切换时的寄存器保存。
lr2131 2012-11-28
  • 打赏
  • 举报
回复
谢谢JQGuardian的回复。 汇编编写的代码需要程序员自己维护栈和保存寄存器的工作。 ATPCS是APCS的一个子集,这个应该算是用在汇编和C相互调用时遵循的标准是吗?
HMGuardian 2012-11-28
  • 打赏
  • 举报
回复
引用 8 楼 lr2131 的回复:
如果是汇编写的代码,就不知道编译器会不会这么“智能”了。看来想要偷懒让编译器来做这些寄存器的工作有些不放心、。总之,会用到(有的地方说破坏)的寄存器就要保存,没用到的可以不保存。所以就不管了,都保存了算了,并确保各个模式下压栈前和出栈后的全部寄存器(至少是要用到的寄存器)都和之前的一样,我想这个总该不会有问题了吧。
明确的告诉你,汇编的函数或过程调用全是自己写的跳转语句(b, bl, mov等),而且这时候你有没有设栈指针它也不知道。所以,汇编器不会自动压栈、弹栈!所有有关栈的操作都要程序员自己处理。
zhengmeifu 2012-11-27
  • 打赏
  • 举报
回复
linux操作系统都给你做好了吧?Linux开发不用关心吧?
zhujinqiang 2012-11-27
  • 打赏
  • 举报
回复
根据ARM体系结构的特点,除快速中断模式以外,所有运行模式共用r0-r12共13个通用寄存器,每种异常模式有自己独立的物理r13(sp)一般用作堆栈指针以及用来保存断点返回地址的连接寄存器r14(lr)。而且发生中断时程序状态寄存器(CPSR)会自动保存到所进入的对应的异常模式下的备份程序状态寄存器(SPSR),因此也需要将其保护好。另外,新的任务投入运行后,有些独立于线程的环境量也需要保存,此外还取决于用户想让任务运行于什么模式,因此根据需要不同堆栈的结构也不是唯一的 --具体参考这篇文章吧: 转载自 seu_dust的专栏 www.52rd.com/Blog/Detail_RD.Blog_seu_dust_10617.html
zhujinqiang 2012-11-27
  • 打赏
  • 举报
回复
在进行任务切换的时候,现场的CPU寄存器上下文都要保存在当前被中断任务的堆栈中,对于不同体系结构的处理器,其需要保护的CPU寄存器的个数和顺序都因目标而不同,有些体系结构的编译器发生中断时将当前程序状态寄存器和断点地址的值保存在系统堆栈中,而有些处理器由于其体系结构特点中断时则将当前程序状态寄存器和断点地址的值直接保存在特殊的寄存器中并不压入堆栈,因此具体的堆栈结构需要根据目标体系的需要由用户自己定义。
HMGuardian 2012-11-27
  • 打赏
  • 举报
回复
ATPCS全称ARM-THUMB procedure call standard(即,arm-thumb过程调用约定)当然不会提到你说的那些了! 任务调度的话属于是硬性中断,所有寄存器内容都有可能在任务恢复后被使用到;所以,个人觉得应该全部保存…… 即:r0-r15 及 cpsr,如果被中断任务运行于带spsr的模式,这个寄存器也应该要保存。
lr2131 2012-11-27
  • 打赏
  • 举报
回复
引用 1 楼 hfz8867879 的回复:
WIN的话,看潘爱民那本内核,讲过的
这个“WIN”是指什么,是指Windows吗还是。这个已经指明是ARM7内核的呀,不能跑Windows的操作系统的。而且潘爱民那本内核的书讲的CPU体系结构也不适用于ARM7吧。
九州剑王 2012-11-27
  • 打赏
  • 举报
回复
WIN的话,看潘爱民那本内核,讲过的

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧