晕。。。我哪里有递归。。。
最近在改一些以前的代码,为了提高可读性和易用性,加了点东西,KEIL的linker就告状说我递归了,我愣是没看明白,大伙儿帮我瞧瞧warning是:
linking...
*** WARNING L13: RECURSIVE CALL TO FUNCTION
CALLED:?CO?MMC_SD
CALLER:_GETRESPONSEERR/MMC_SD
下面是新加的内容,只是个结构,还没写完呢
code u8 response_type_list[] =
{
0
};
typedef u8 R1;
typedef union
{
R1 r1;
}response;
typedefvoid (*PTRGetResponse)(response* );
void GetResponseErr(response* p_res);
void GetResponseR1(response* p_res);
void GetResponseR2(response* p_res);
void GetResponseR3(response* p_res);
void GetResponseR4(response* p_res);
void GetResponseR5(response* p_res);
void GetResponseR6(response* p_res);
void GetResponseR7(response* p_res);
code const PTRGetResponse PTRGetResponseList[] =
{
&GetResponseErr,
&GetResponseR1,
&GetResponseR2,
&GetResponseR3,
&GetResponseR4,
&GetResponseR5,
&GetResponseR6,
&GetResponseR7
};
//说明:
// 对于没有的命令和 reserved 的命令的响应
void GetResponseErr(response* p_res)
{
p_res = NULL;
DB_SendString("\nError! Undefined CMD!\n");
}
void GetResponseR1(response* p_res)
{
}
void GetResponseR2(response* p_res)
{
}
void GetResponseR3(response* p_res)
{
}
void GetResponseR4(response* p_res)
{
}
void GetResponseR5(response* p_res)
{
}
void GetResponseR6(response* p_res)
{
}
void GetResponseR7(response* p_res)
{
}
这些代码是新添加的内容,删掉后正常 DB_SendString("\nError! Undefined CMD!\n");
删掉就没warning了
可是那只不过是一个串口发送函数呀。。。
我继续晕。。。 我还是继续coding去了。。。
他奶奶的警告就是用来无视的。。。
warning 就是用来 ignored 的。。。 确定没有调用可以不了 回复【1楼】Pony279霍斯
db_sendstring("\nerror! undefined cmd!\n");
删掉就没warning了
可是那只不过是一个串口发送函数呀。。。
我继续晕。。。
-----------------------------------------------------------------------
是否DB_SendString()又调用了GetResponseErr() DB_SendString是不是直接或间接地在中断中被调用了
不要轻易怀疑编译器,帮助文档中应该对RECURSIVE CALL TO FUNCTION 的各种情形有詳細说明 回复【4楼】usingavr
-----------------------------------------------------------------------
这段代码是新添加的内容,有可能吗 回复【5楼】xrr1017
db_sendstring是不是直接或间接地在中断中被调用了
不要轻易怀疑编译器,帮助文档中应该对recursive call to function 的各种情形有詳細说明
-----------------------------------------------------------------------
我检查了下代码,暂时还木有使用到中断。。。
另外,即使是中断中调用的,那也应该是
warning: multi call to ... 我看了KEIL的help上的说明,说了等于没说。。。
我还是没找到
http://cache.amobbs.com/bbs_upload782111/files_50/ourdev_713649IJLK6W.jpg
(原文件名:1.jpg)
另外上传我的代码,整个工程的代码很多,不过都是模块化的,大家帮我看看,这个工程是我专门用来开发各种底层代码的:
点击此处下载 ourdev_713650VUYINS.zip(文件大小:223K) (原文件名:Test.zip)
用的是KEIL UV4,另外编译的时候还要设置参考此帖4楼:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5090488&bbs_page_no=1&search_mode=3&search_text=Pony279&bbs_id=9999 (这设置挺有用的,居然沉了。。。)
还有,如果有人嫌参与编译的东西多,可以在工程面板里面右键,
http://cache.amobbs.com/bbs_upload782111/files_50/ourdev_713651UNZWQV.jpg
(原文件名:2.jpg)
http://cache.amobbs.com/bbs_upload782111/files_50/ourdev_713652I08K8X.jpg
(原文件名:3.jpg)
代码很多,我想不会有人认真看的 我把DB_SendString("\nError! Undefined CMD!\n"); 前面的"//"去掉
编译了MMC_SD.c 这一个文件,结果如下,没提到递归的事:
C51 COMPILER V7.50 - SN: K1DZP-5IUSHE
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2004
*** WARNING C280 IN LINE 124 OF MMC_SD.C: 'p_res': unreferenced local variable
*** WARNING C280 IN LINE 128 OF MMC_SD.C: 'p_res': unreferenced local variable
*** WARNING C280 IN LINE 132 OF MMC_SD.C: 'p_res': unreferenced local variable
*** WARNING C280 IN LINE 137 OF MMC_SD.C: 'p_res': unreferenced local variable
*** WARNING C280 IN LINE 142 OF MMC_SD.C: 'p_res': unreferenced local variable
*** WARNING C280 IN LINE 146 OF MMC_SD.C: 'p_res': unreferenced local variable
C51 COMPILATION COMPLETE.6 WARNING(S),0 ERROR(S) 回复【9楼】usingavr
-----------------------------------------------------------------------
谢谢,引用2楼:
“db_sendstring("\nerror! undefined cmd!\n");
删掉就没warning了
可是那只不过是一个串口发送函数呀。。。
我继续晕。。。”
unreferenced可以暂时无视,因为这段代码只不过是一个框架 我电脑上只有以前的uv3,重装过了,用不了。
我用keil/c51/bin/下的程序,用命令行方式把所有.c都编译了,但不知道怎么用命令行链接 回复【11楼】usingavr
-----------------------------------------------------------------------
楼上真是有心了!
我的keil 4 是在这里下载的
www.mcu123.com
注_册机用以前的就行了 回复【11楼】usingavr
-----------------------------------------------------------------------
命令行我也不会
玩这个耗时间啊。。。 好像是 keil 51 要用函数指针就会这样;解决办法是人工删除、添加 overlay 楼上说得很对,就是这样! 回复【14楼】aureole XiaomaGee
好像是 keil 51 要用函数指针就会这样;解决办法是人工删除、添加 overlay
-----------------------------------------------------------------------
我的在8楼发的代码里有一个简单的协同式多任务内核模块,
也用到了函数指针,
不过以前测试的时候没有出现这样的警告。。。 C51是静态分配局部变量的,与标准C语言不一样。
中断函数和非中断函数不能同时调用同一个函数,否则编译器会告诉你这个是递归。 回复【17楼】hitler
c51是静态分配局部变量的,与标准c语言不一样。
中断函数和非中断函数不能同时调用同一个函数,否则编译器会告诉你这个是递归。
-----------------------------------------------------------------------
谢谢你的回复
首先,我现在的代码没有使用中断
第二,就算我是“中断函数和非中断函数同时调用同一个函数”,那么warning应该是munti call to ... 而不是 RECURSIVE CALL TO FUNCTION 很多年不用C51了,记得很清楚,中断和非中断函数调用同一个函数报警就是RECURSIVE CALL TO FUNCTION。
标准C语言是在堆栈中动态生成局部变量空间,所以可以递归的。
51单片机太弱了,为了提高运行效率,C51采用静态分配局部变量的方式,所以不可递归。
被中断和非中断函数调用的函数,如果在非中断状态运行,发生中断后,局部变量被破坏,中断结束后再执行就完全错误了,这个跟不能递归的原理是一样一样的,所以Keil也把他列为RECURSIVE CALL TO FUNCTION。 回复【19楼】hitler
-----------------------------------------------------------------------
我刚刚做了个“中断函数和非中断函数同时调用同一个函数”的测试,没有警告,可能是因为我用的是LX51 linker,
http://cache.amobbs.com/bbs_upload782111/files_50/ourdev_713684ZFD09R.jpg
(原文件名:1.jpg)
以前用BL51 linker的时候,警告都是 multi call to function
警告我 recursive call 的还是头一次见 事实证明,编译器已经SB了。。。我还是重装一遍好了。。。
http://cache.amobbs.com/bbs_upload782111/files_50/ourdev_713685L0XIQR.jpg 重装了一遍,结果还是一样。。。
我能不怀疑这是Keil的BUG么。。。 有BUG避开便是,没花钱的编译器,何必较真。 回复【23楼】lmserver
-----------------------------------------------------------------------
呵呵,
编译器是我们的开发工具,我们当然希望工具能好用一些
所以如果真的是有BUG,我一般都会e-mail那个公司,对双方都是有好处的 Pony279 发表于 2012-1-18 10:33 static/image/common/back.gif
我看了KEIL的help上的说明,说了等于没说。。。
我还是没找到
下载了你的代码来看 感觉很厉害啊 很规范的样子各种宏定义,嵌套, 这样子看起来我的程序就是小学生了 我也遇到这个问题,来学习一下。 楼主问题解决了吗?
我做了类似的程序,也遇到类似的问题,我已经解决了
http://blog.sina.com.cn/s/blog_82ac04b10100t25z.html
参考这个
页:
[1]