|
发表于 2009-12-15 18:09:03
|
显示全部楼层
Keil C为了节省内存,局部变量没有使用栈来存储,而是使用覆盖的方法来重复使用,对没有调用关系的函数,编译器认为他们的局部变量可以覆盖,所以你在A里直接调用B是不会发用问题的,因为有调用链,编译器不会覆盖他们的局部变量,但如果A里通过一个函数指针调用其它函数,编译器没法预知这个函数指针指向哪个函数,所以有可能它指向的那个函数B,而在编译器看来B没有被A直接调用,这样,悲剧就发生了。
如果编译器智能一点,理论上是可以通过跟踪对函数指针的赋值语句分析出该指针可能指向哪些函数,然后对这些函数不进行覆盖就行了,当然,说起来易,实现起来难,因为赋值操作也可能是通过函数参数传递的,也可能是在任何其它函数里进行的,这样分析起来太难了,干脆就不管了。
3楼的方法是正规方法,不过写起来挺麻烦的,要在在Link里加选项:
例如:
MyFile.c 时有函数 FuncA(),希望FuncA用的局部变量不被其它函数覆盖
要在Link里加
OVERLAY(?PR?FuncA?MyFile ! *)
该操作可以直接加入link 命令行(如果你不用uVision的话),
在uVision里可以Project/Option for XXXX , BL51 MISC 页 ,Overlay 框内输入 ?PR?FUNA?MyFile ! * 即可。 |
|