OVERLAY代码重入问题:自己遇到的问题
编写的测试代码如下:
#include <stdio.h>
#define BYTE unsigned char
#define BYTE unsigned char
#define BYTE unsigned char
void main(void);
void FUN2(void);
void fun1(void);
void FUN2(void);
void fun1(void);
void main(void)
{
fun1();
{
fun1();
}
void fun1(void)
{
BYTE TMP1;
FUN2();
}
void FUN2(void)
{
BYTE TMP2;
fun1();
void fun1(void)
{
BYTE TMP1;
FUN2();
}
void FUN2(void)
{
BYTE TMP2;
fun1();
}
使用keil编译会出现如下错误:
*** WARNING L13: RECURSIVE CALL TO SEGMENT
SEGMENT: ?PR?FUN1?MAIN
CALLER: ?PR?FUN2?MAIN
SEGMENT: ?PR?FUN1?MAIN
CALLER: ?PR?FUN2?MAIN
这是代码重入问题,KEIL编译器为函数分配堆栈空间的时候,局部变量和函数的参数都被覆盖了,是应为代码中出现了交叉嵌套调用导致。
解决办法:
添加.link文件,编辑文件
OVERLAY(
?PR?FUN1?MAIN
~ ?PR?FUN1?MAIN)
?PR?FUN1?MAIN
~ ?PR?FUN1?MAIN)
自递归调用同样会出现同样的问题,解决办法如上。
void foo(int someparameter)
{
if (...)
{
foo(otherparameter);
}
}
还有一些其他的keil编译器问题
void foo(int someparameter)
{
if (...)
{
foo(otherparameter);
}
}
还有一些其他的keil编译器问题
Keil使用中的若干问题
|