搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2009-10-12 08:23:41 | 显示全部楼层 |阅读模式
我的问题是:

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

问题很多

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-10-12 09:05:36 | 显示全部楼层
如果不必要的话,那么多OS怎么不按照你想的设计?还节约了时间。

出0入0汤圆

 楼主| 发表于 2009-10-12 09:16:28 | 显示全部楼层
LS说说原因吧,你是怎么做的??

出0入0汤圆

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

出0入0汤圆

发表于 2009-10-12 10:19:51 | 显示全部楼层
上下文切换保护全部通用寄存器,并不是绝对的。

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

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

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

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

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

出0入0汤圆

 楼主| 发表于 2009-10-12 10:31:54 | 显示全部楼层
非常感谢3楼的提醒:我有个地方搞混了:中断保存是对他自己来说的,呵呵。。。。。。。

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

出0入0汤圆

 楼主| 发表于 2009-10-12 10:44:23 | 显示全部楼层
一直想给上官大侠一个建议:
把 IAR的编译器和汇编器手册  翻译成书,出版。。。。。
不知你有这个打算没有??强烈支持。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 17:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表