顶 117 搂
*) 技术应严谨认真
*) 对技术问题的质疑是应该的, 当以技术回应, 而不是诉诸个人攻击。
做个技术总结(以下所述的栈均指涉及sp指针位于片内数据区idata的硬件栈):
*) 如果c51程序中没有使用汇编模块, 或者汇编模块中没有手工更改sp, 那么编译连接时不会产生额外栈段( stack segment), 即没有所谓的“模块私有栈".
*) 只有一个栈, 所有的函数调用, 中断发生以及寄存器的保护(push)都在一个以sp为指针的栈内, 别无分栈, 即使有stack segment, 也只是改变了栈底而已。
*) keil 不鼓励使用 reentrant. 无reentrant关键字的程序除了使用register外,还会使用固定地址变量来传递参数。reentrant 函数除了使用register外, 还会使用一个效率低下的“simulated stack" 来传递参数, 以达到重入。
*) 理论上, 人脑可以精确计算c51所用的最大栈深。实践上, 必须了解c51编译器的准确行为或探查所生成的汇编程序, 因而过于繁琐易错, 可操作性不高。
*) 关于自动计算最大栈深,keil 已明确表示太困难:
There is no automatic way the tools can tell you the maximum stack depth or stack utilization. Because of asynchronous events and interrupts, the automation is too difficult. |