Pony279 发表于 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;

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)
{
       
}

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

Pony279 发表于 2012-1-18 00:50:53

DB_SendString("\nError! Undefined CMD!\n");
删掉就没warning了
可是那只不过是一个串口发送函数呀。。。

我继续晕。。。

Pony279 发表于 2012-1-18 00:56:01

我还是继续coding去了。。。
他奶奶的警告就是用来无视的。。。

warning 就是用来 ignored 的。。。

rlogin 发表于 2012-1-18 01:28:12

确定没有调用可以不了

usingavr 发表于 2012-1-18 08:57:57

回复【1楼】Pony279霍斯
db_sendstring("\nerror! undefined cmd!\n");
删掉就没warning了
可是那只不过是一个串口发送函数呀。。。
我继续晕。。。
-----------------------------------------------------------------------

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

xrr1017 发表于 2012-1-18 09:10:38

DB_SendString是不是直接或间接地在中断中被调用了
不要轻易怀疑编译器,帮助文档中应该对RECURSIVE CALL TO FUNCTION 的各种情形有詳細说明

Pony279 发表于 2012-1-18 09:46:37

回复【4楼】usingavr
-----------------------------------------------------------------------

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

Pony279 发表于 2012-1-18 10:16:56

回复【5楼】xrr1017
db_sendstring是不是直接或间接地在中断中被调用了
不要轻易怀疑编译器,帮助文档中应该对recursive call to function 的各种情形有詳細说明
-----------------------------------------------------------------------

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

Pony279 发表于 2012-1-18 10:33:26

我看了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)


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

usingavr 发表于 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)

Pony279 发表于 2012-1-18 11:04:30

回复【9楼】usingavr
-----------------------------------------------------------------------
谢谢,引用2楼:
“db_sendstring("\nerror! undefined cmd!\n");
删掉就没warning了
可是那只不过是一个串口发送函数呀。。。
我继续晕。。。”

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

usingavr 发表于 2012-1-18 11:21:45

我电脑上只有以前的uv3,重装过了,用不了。
我用keil/c51/bin/下的程序,用命令行方式把所有.c都编译了,但不知道怎么用命令行链接

Pony279 发表于 2012-1-18 11:27:12

回复【11楼】usingavr
-----------------------------------------------------------------------

楼上真是有心了!

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

Pony279 发表于 2012-1-18 11:43:38

回复【11楼】usingavr
-----------------------------------------------------------------------

命令行我也不会

玩这个耗时间啊。。。

aureole 发表于 2012-1-18 12:06:19

好像是 keil 51 要用函数指针就会这样;解决办法是人工删除、添加 overlay

downtoearth 发表于 2012-1-18 12:53:43

楼上说得很对,就是这样!

Pony279 发表于 2012-1-18 13:37:19

回复【14楼】aureole XiaomaGee
好像是 keil 51 要用函数指针就会这样;解决办法是人工删除、添加 overlay
-----------------------------------------------------------------------

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

hitler 发表于 2012-1-18 14:17:51

C51是静态分配局部变量的,与标准C语言不一样。
中断函数和非中断函数不能同时调用同一个函数,否则编译器会告诉你这个是递归。

Pony279 发表于 2012-1-18 14:38:16

回复【17楼】hitler
c51是静态分配局部变量的,与标准c语言不一样。
中断函数和非中断函数不能同时调用同一个函数,否则编译器会告诉你这个是递归。
-----------------------------------------------------------------------

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

hitler 发表于 2012-1-18 14:48:13

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

Pony279 发表于 2012-1-18 14:57:02

回复【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 的还是头一次见

Pony279 发表于 2012-1-18 15:05:10

事实证明,编译器已经SB了。。。我还是重装一遍好了。。。
http://cache.amobbs.com/bbs_upload782111/files_50/ourdev_713685L0XIQR.jpg

Pony279 发表于 2012-1-18 15:51:20

重装了一遍,结果还是一样。。。

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

lmserver 发表于 2012-1-18 16:12:38

有BUG避开便是,没花钱的编译器,何必较真。

Pony279 发表于 2012-1-18 16:55:56

回复【23楼】lmserver
-----------------------------------------------------------------------

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

16777216 发表于 2013-10-19 20:51:19

Pony279 发表于 2012-1-18 10:33 static/image/common/back.gif
我看了KEIL的help上的说明,说了等于没说。。。
我还是没找到



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

mafeimafei 发表于 2014-11-20 20:26:54

我也遇到这个问题,来学习一下。

xiaobenyi 发表于 2015-10-4 22:54:08

楼主问题解决了吗?
我做了类似的程序,也遇到类似的问题,我已经解决了

http://blog.sina.com.cn/s/blog_82ac04b10100t25z.html
参考这个
页: [1]
查看完整版本: 晕。。。我哪里有递归。。。