keil中APPLICATION CONTAINS TOO MANY RECURSIONS 与 “RECURSIVE CALL TO SEGMENT”彻底解决(转载)

单片机相关 徐 自远 1439℃

我们在做菜单程序或通过函数指针调用函数时,如果被调用的函数中有包含了常量字符串,那么经常会出现这样的的错误提示:”RECURSIVE CALL TO SEGMENT”意思是”递归调用段”,如何解决呢,之前我没有找到很好的方法,这段时间我回过头来看keil的datasheet,找到了解决方法,当然keil手册提供的解决方法是编写一个.lin文件,我觉得麻烦,现提供我的解决方法,实例还是用keil提供的那个实例:

#pragma code symbols debug oe void func1(unsigned char *msg ) { ; } void func2( void ) { unsigned char uc; func1(“xxxxxxxxxxxxxxx”); } code void (*func_array[])() = { func2 }; void main( void ) { (*func_array[0])(); } 这样会提示:

*** WARNING 13: RECURSIVE CALL TO SEGMENT SEGMENT: ?CO?EXAMPLE1 CALLER: ?PR?FUNC2?EXAMPLE1 我的解决方法是:

把code void (*func_array[])() = { func2 };放在另外一个段,即另外一个.c文件中也就不存在同一个段递归调用情况,如下:

keilrecur.c文件

#i nclude <reg51.h>

void func2( void );

extern code void (*func_array[])();

void func1(unsigned char *msg )

{

 msg=msg;

}

void func2( void ) {

  unsigned char uc;

  uc=uc;

  func1(“xxxxxxxxxxxxxxx”);

}

 
 

void main( void ) {

  (*func_array[0])();

}

 
 

funcptr.c文件

#i nclude <reg51.h>

void func2( void );

code void (*func_array[])() = { func2 };

这样就可以解决段递归问题.

我们在做LCD菜单时,喜欢做一个KeyTab,这样也会出现”递归调用段”情况,

那么我们可以把KeyTab单独作为.c文件,方便管理又可以避免这种错误提示.

加速度 Jan.5.2010 http://blog.21ic.com/user1/6121/archives/2010/66044.html 最近一直在用KEIL写一个单片机的程序,遇到了一个很棘手的无法正常链接的问题*** FATAL ERROR L232: APPLICATION CONTAINS TOO MANY RECURSIONS 在网上搜索了大量的文章,以及网页也没找到什么有效的解决方案。看了下keil的手册,说L13警告太多,就会导致上述的结果,本来想把能找到的原文都贴出来让各位看官学习下,但是浏览器给我关了,找不到了,大家自己去google下上面那个错误,就能找到很多文章了,看看吧。下面贴出重要的找到的一段,学习下 ////////////////////////////////////////////////////////////////////////////////////////////////// [BL51连接器] 增加了RECURSIONS指令(缩写RC),它允许您指定在连接器退出前最大数量的递归调用。 默认的数字是10。 递归调用会产生下面的连接器警告信息: *** WARNING L13: RECURSIVE CALL TO SEGMENT 当超过最大数量的递归调用时,连接器用下面的错误响应: FATAL ERROR 232: APPLICATION CONTAINS TOO MANY RECURSIONS. 要使用这个指令,请在连接器命令行或μVision2的Misc框输入下面的语句: BL51 test.obj RECURSIONS (100) 注意:连接器可以运行一段很长的时间来检测所有的递归和删除基准(参考)。你你应当保留这个 默认的级别10,除非您有特殊的理由要改变这个设置。 ////////////////////////////////////////////////////////////////////////////////////////////// 这个就是重要的一段,我接着赶紧把上面那句话复制到了KEIL里面,擦还是不行,再看,我后来把RECURSIONS (100)给搞进去了,神了,好了。。呵呵。。。。这样就解决了,具体的东西呢,keil手册里面有,我不给做具体的介绍。我也就是偶然做个单片机的项目采用了这个软件,也不想去深究了,做完估计很久就不用了,各位看官留个言吧,你的鼓励是我源源不断发帖的动力。 注:此文章原来在新浪博客里面,最近本人搬家到CSDN,原来的文章下架。  

转载请注明:徐自远的乱七八糟小站 » keil中APPLICATION CONTAINS TOO MANY RECURSIONS 与 “RECURSIVE CALL TO SEGMENT”彻底解决(转载)

喜欢 (1)

苏ICP备18041234号-1 bei_an 苏公网安备 32021402001397号