搜索
bottom↓
回复: 27

晕。。。我哪里有递归。。。

[复制链接]

出0入0汤圆

发表于 2012-1-18 00:42:35 | 显示全部楼层 |阅读模式
最近在改一些以前的代码,为了提高可读性和易用性,加了点东西,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;

typedef  void (*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)
{
       
}

这些代码是新添加的内容,删掉后正常

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-1-18 00:50:53 | 显示全部楼层
DB_SendString("\nError! Undefined CMD!\n");
删掉就没warning了
可是那只不过是一个串口发送函数呀。。。

我继续晕。。。

出0入0汤圆

 楼主| 发表于 2012-1-18 00:56:01 | 显示全部楼层
我还是继续coding去了。。。
他奶奶的警告就是用来无视的。。。

warning 就是用来 ignored 的。。。

出0入0汤圆

发表于 2012-1-18 01:28:12 | 显示全部楼层
确定没有调用可以不了

出0入0汤圆

发表于 2012-1-18 08:57:57 | 显示全部楼层
回复【1楼】Pony279  霍斯
db_sendstring("\nerror! undefined cmd!\n");
删掉就没warning了
可是那只不过是一个串口发送函数呀。。。
我继续晕。。。
-----------------------------------------------------------------------

是否DB_SendString()又调用了GetResponseErr()

出0入0汤圆

发表于 2012-1-18 09:10:38 | 显示全部楼层
DB_SendString是不是直接或间接地在中断中被调用了
不要轻易怀疑编译器,帮助文档中应该对RECURSIVE CALL TO FUNCTION 的各种情形有詳細说明

出0入0汤圆

 楼主| 发表于 2012-1-18 09:46:37 | 显示全部楼层
回复【4楼】usingavr  
-----------------------------------------------------------------------

这段代码是新添加的内容,有可能吗

出0入0汤圆

 楼主| 发表于 2012-1-18 10:16:56 | 显示全部楼层
回复【5楼】xrr1017
db_sendstring是不是直接或间接地在中断中被调用了
不要轻易怀疑编译器,帮助文档中应该对recursive call to function 的各种情形有詳細说明
-----------------------------------------------------------------------

我检查了下代码,暂时还木有使用到中断。。。
另外,即使是中断中调用的,那也应该是
warning: multi call to ...

出0入0汤圆

 楼主| 发表于 2012-1-18 10:33:26 | 显示全部楼层
我看了KEIL的help上的说明,说了等于没说。。。
我还是没找到

(原文件名: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 (这设置挺有用的,居然沉了。。。)
还有,如果有人嫌参与编译的东西多,可以在工程面板里面右键,

(原文件名:2.jpg)


(原文件名:3.jpg)


代码很多,我想不会有人认真看的

出0入0汤圆

发表于 2012-1-18 10:55:18 | 显示全部楼层
我把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)

出0入0汤圆

 楼主| 发表于 2012-1-18 11:04:30 | 显示全部楼层
回复【9楼】usingavr
-----------------------------------------------------------------------
谢谢,引用2楼:
“db_sendstring("\nerror! undefined cmd!\n");  
删掉就没warning了
可是那只不过是一个串口发送函数呀。。。
我继续晕。。。”

unreferenced可以暂时无视,因为这段代码只不过是一个框架

出0入0汤圆

发表于 2012-1-18 11:21:45 | 显示全部楼层
我电脑上只有以前的uv3,重装过了,用不了。
我用keil/c51/bin/下的程序,用命令行方式把所有.c都编译了,但不知道怎么用命令行链接

出0入0汤圆

 楼主| 发表于 2012-1-18 11:27:12 | 显示全部楼层
回复【11楼】usingavr
-----------------------------------------------------------------------

楼上真是有心了!

我的keil 4 是在这里下载的
www.mcu123.com
注_册机用以前的就行了

出0入0汤圆

 楼主| 发表于 2012-1-18 11:43:38 | 显示全部楼层
回复【11楼】usingavr
-----------------------------------------------------------------------

命令行我也不会

玩这个耗时间啊。。。

出0入0汤圆

发表于 2012-1-18 12:06:19 | 显示全部楼层
好像是 keil 51 要用函数指针就会这样;解决办法是人工删除、添加 overlay

出0入0汤圆

发表于 2012-1-18 12:53:43 | 显示全部楼层
楼上说得很对,就是这样!

出0入0汤圆

 楼主| 发表于 2012-1-18 13:37:19 | 显示全部楼层
回复【14楼】aureole XiaomaGee
好像是 keil 51 要用函数指针就会这样;解决办法是人工删除、添加 overlay
-----------------------------------------------------------------------

我的在8楼发的代码里有一个简单的协同式多任务内核模块,
也用到了函数指针,
不过以前测试的时候没有出现这样的警告。。。

出0入0汤圆

发表于 2012-1-18 14:17:51 | 显示全部楼层
C51是静态分配局部变量的,与标准C语言不一样。
中断函数和非中断函数不能同时调用同一个函数,否则编译器会告诉你这个是递归。

出0入0汤圆

 楼主| 发表于 2012-1-18 14:38:16 | 显示全部楼层
回复【17楼】hitler
c51是静态分配局部变量的,与标准c语言不一样。
中断函数和非中断函数不能同时调用同一个函数,否则编译器会告诉你这个是递归。
-----------------------------------------------------------------------

谢谢你的回复
首先,我现在的代码没有使用中断
第二,就算我是“中断函数和非中断函数同时调用同一个函数”,那么warning应该是munti call to ... 而不是 RECURSIVE CALL TO FUNCTION

出0入0汤圆

发表于 2012-1-18 14:48:13 | 显示全部楼层
很多年不用C51了,记得很清楚,中断和非中断函数调用同一个函数报警就是RECURSIVE CALL TO FUNCTION。
标准C语言是在堆栈中动态生成局部变量空间,所以可以递归的。
51单片机太弱了,为了提高运行效率,C51采用静态分配局部变量的方式,所以不可递归。
被中断和非中断函数调用的函数,如果在非中断状态运行,发生中断后,局部变量被破坏,中断结束后再执行就完全错误了,这个跟不能递归的原理是一样一样的,所以Keil也把他列为RECURSIVE CALL TO FUNCTION。

出0入0汤圆

 楼主| 发表于 2012-1-18 14:57:02 | 显示全部楼层
回复【19楼】hitler
-----------------------------------------------------------------------


我刚刚做了个“中断函数和非中断函数同时调用同一个函数”的测试,没有警告,可能是因为我用的是LX51 linker,

(原文件名:1.jpg)

以前用BL51 linker的时候,警告都是 multi call to function
警告我 recursive call 的还是头一次见

出0入0汤圆

 楼主| 发表于 2012-1-18 15:05:10 | 显示全部楼层
事实证明,编译器已经SB了。。。我还是重装一遍好了。。。

出0入0汤圆

 楼主| 发表于 2012-1-18 15:51:20 | 显示全部楼层
重装了一遍,结果还是一样。。。

我能不怀疑这是Keil的BUG么。。。

出0入0汤圆

发表于 2012-1-18 16:12:38 | 显示全部楼层
有BUG避开便是,没花钱的编译器,何必较真。

出0入0汤圆

 楼主| 发表于 2012-1-18 16:55:56 | 显示全部楼层
回复【23楼】lmserver
-----------------------------------------------------------------------

呵呵,
编译器是我们的开发工具,我们当然希望工具能好用一些
所以如果真的是有BUG,我一般都会e-mail那个公司,对双方都是有好处的

出0入0汤圆

发表于 2013-10-19 20:51:19 | 显示全部楼层
Pony279 发表于 2012-1-18 10:33
我看了KEIL的help上的说明,说了等于没说。。。
我还是没找到

下载了你的代码来看 感觉很厉害啊 很规范的样子  各种宏定义,嵌套, 这样子看起来我的程序就是小学生了

出0入0汤圆

发表于 2014-11-20 20:26:54 | 显示全部楼层
我也遇到这个问题,来学习一下。

出0入0汤圆

发表于 2015-10-4 22:54:08 | 显示全部楼层
楼主问题解决了吗?
我做了类似的程序,也遇到类似的问题,我已经解决了

http://blog.sina.com.cn/s/blog_82ac04b10100t25z.html
参考这个
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-6 06:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表