KEIL编译UC/OS-II中如何做到不同任务调用同一函数而不破坏前一个任务调用函数时的寄存器的状态

kazenoai 2010-09-23 04:35:40
在KEIL平台上编译UC/OS我有这样的一个困惑,我发现任务堆栈里保存的仅仅是CPU寄存器的状态和一些函数嵌套时的PC值还有就是函数嵌套时的一些传递参数的值,但是他并没有保存函数中的局部变量,这样的话,当有一个任务正在调用一个函数的时候,切换到了另外的一个任务,而这个任务也调用了这个函数,也就是说这个函数的局部变量被从新赋值改变了,那么当回到原来的任务时,这时候不就会出现了运行错误,这样的话系统不是会很不稳定。
请教一下,在KEIL编译器中有预防这种状况的机制吗?还是UC/OS本省有预防的机制,不然系统不是随时都有可能出错,请高手指教啊。。。。。。
...全文
237 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
dgfb 2012-12-07
  • 打赏
  • 举报
回复
在keil中函数调用另外一个函数时,不仅局部变量,就连寄存器(R0-R7)等值都没有进行入栈保护。按照一般的C标准编译器,是必需保留现场的(教材上都是这么说,呵呵)。但keil编译器没有按常规出牌,这也叫编译器特性,keil编译器会在从一个函数里调用一个函数时,不会用调用子函数即子函数里的寄存器保存有用的信息,也就是编译器会假定子函数会破坏所用被调用函数的寄存器,所以keil编译代码时,如果被调函数和调用函数之间都会用到某寄存器,则编译器会在调用子函数前将该寄存器的值保存该函数作用域的存储空间中(该函数的数据段中)。

1,076

社区成员

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

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