原创 C51中的reentrant(转帖)

2009-2-9 08:14 5759 9 9 分类: MCU/ 嵌入式
关于reentrant的使用keil的官方论坛上有详细的讨论.
Andy Neil(官方工程师)建议

"Are you sure that you really need to make everything reentrant?...
A reading of the Keil app notes & knowledgebase articles on this subject 
showed that it was not necessary. "

由于每一次调用被reentrant声明的函数都要把函数的参数和内部变量压栈,所以
很容易使堆栈区溢出,S52只有256Bytes的data段,一个简单的函数如果有一个参数
三个内部变量,则需要压栈4字节以上,这还不包括函数调用堆栈.

reentrant其实并不是适合低端的单片机,keil论坛上有人说对于那些有KB以上RAM的
单片机reentrant才适合.

BUTCHER提到的问题我一直很奇怪自己怎么没有出现,仔细检查代码才发现我所有的
函数都在一开始添加了EA=0;也就是屏蔽了中断,这样就绝对没有函数重载的问题!
不过这个方法也许对我们很适合,我的函数段基本都很小,而且定时器查询速度很高,
基本不需要外部中断,所以可以适当优化代码避免中断嵌套,就不会出现同一时刻
有一个函数被二次重载了.

对于BUTCHER的问题,Andy有类似的解答,"I can redo the calling tree by hand in
 order to avoid using reentrancy, but it will take some time checking and 
profiling the code." 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条