CN_HELLO 发表于 2009-10-12 08:23:41

问个问题: 关于堆栈的保护及切换

我的问题是:

1.在中断切换任务时,真的要“把剩余的寄存器也保存”么??(问题3楼有原因,是的应该保存)
2.在任务切换时,寄存器的顺序我们随便约定一种,可以么??(还没解决,我觉得如果那几个函数全用汇编写的话,自由度完全在自己,只有c程序中生成的汇编才会做一些现场保护,再者如果全用行内汇编的话,进入与退出又C来管理,好像与我们无关)

问题很多

请指导。。。。呵呵。。。。。

usecool 发表于 2009-10-12 09:05:36

如果不必要的话,那么多OS怎么不按照你想的设计?还节约了时间。

CN_HELLO 发表于 2009-10-12 09:16:28

LS说说原因吧,你是怎么做的??

valley 发表于 2009-10-12 09:46:59

不要依赖于编译器,至少的多多了解中断函数中的编译设置;
你所说的情况,应该是编译器假设中断函数结束后会返回之前执行的地方,而不进行任务切换;
由于如此,编译器对中断函数中没有使用到的寄存器不会进行保存,而如果此时进行任务切换,则原任务中没有保存的寄存器将面临被覆盖的风险;
其它的其实还有很多问题没说清楚,楼主还是多看看书,用心体会体会吧!

ShangGuan 发表于 2009-10-12 10:19:51

上下文切换保护全部通用寄存器,并不是绝对的。

比如:
假设所有上下文切换都是在一个函数void CtxSw(void)里完成的。

CtxSw()函数调用之前,编译器认为所有通用寄存器没有保存任何有意义的数据。
CtxSw()函数调用返回,编译器认为所有通用寄存器没有保存任何有意义的数据。
(换句话说,编译器认为函数CtxSw()破坏了所有寄存器的值)

那么CtxSw()上下下文切换,不用保护任何通用寄存器。

现实中,貌似并不存在这种编译器。
不过,可以让编译器认为一个函数,破坏了其中某些固定的寄存器的值,这些寄存器的值在函数调用之前以及返回后的
值是多少,没有任何意义。上下文切换可以只保护部分通用寄存器。(这在AVRGCC,AVRIAR上实现起来非常容易)。

最大的问题在于,“所有上下文切换都是在一个函数void CtxSw(void)里完成的”,
基本上绝大部分OS都不能满足这个条件。

CN_HELLO 发表于 2009-10-12 10:31:54

非常感谢3楼的提醒:我有个地方搞混了:中断保存是对他自己来说的,呵呵。。。。。。。

那么,我们不用管中断保存了哪些东东,我们直接把所有的都保存,这后来保存的是在我们的控制之中,到时恢复该任务的时候,把我们保存的释放出来就行,当执行RETI指令(由于是行内汇编,由 C 完成),那些由中断保存的东东也会全部释放出来,如果两者保存的内容有重复的话,也没事,也就是多做了些”无用功“,但这些无用功帮助我们不用去了解编译器在中断中用了哪些东东。。。。。

CN_HELLO 发表于 2009-10-12 10:44:23

一直想给上官大侠一个建议:
把 IAR的编译器和汇编器手册翻译成书,出版。。。。。
不知你有这个打算没有??强烈支持。。。
页: [1]
查看完整版本: 问个问题: 关于堆栈的保护及切换