我们在做菜单程序或通过函数指针调用函数时,如果被调用的函数中有包含了常量字符串,那么经常会出现这样的的错误提示:"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文件,方便管理又可以避免这种错误提示.

Keil "RECURSIVE CALL TO SEGMENT"彻底解决的更多相关文章

  1. ORA-27125: unable to create shared memory segment的解决方法(转)

    ORA-27125: unable to create shared memory segment的解决方法(转) # Kernel sysctl configuration file for Red ...

  2. KEIL UV3中光标不对齐解决

    Keil uVision3与uV2相比增加了对更多型号单片机的支持,另外还对一些的方面进行了优化.不过它却优化出一个让人头疼的问题,那就是光标位置显示不正确!这一问题给程序的编写带来了许多不便.不过不 ...

  3. 【转】Keil ARM开发 error L6236E错误解决

    顺利创建了第一个Keil工程却发现不能完成链接,出现了一个下面这样的报错: .\Objects\demo_simple.sct(7): error: L6236E: No section matche ...

  4. ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT 的解决办法

    今天接着写一个单片机程序,出现这个问题,我仔细查看每一句语句,发现逻辑上没有错误,但就是出现这个问题,不能生成目标文件: *** ERROR L107: ADDRESS SPACE OVERFLOW ...

  5. keil禁止给uncalled segment分配空间

    把target options中的device页中选上"Use LX51 ...",然后在LX51 Misc页中的Misc Control中填入"REMOVEUNUSED ...

  6. keil 中报错和警告提示解决办法

    1.warning: #1-D: last line of file ends without a newline 解决办法:在文件最后一行加入一个回车. 2.error: #134: expecte ...

  7. IAR错误Error[e16]: Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition. At least 0xd more bytes needed. The problem occurred while processing the segment 的解决办法

    IAR for 8051 IDE version 9.10.1编译阿莫单片机的cc2541程序osal第一节教程出现错误如下 出错的愿意是iar设置错误.所以需修改IAR的设置. 解决办法如下: 即可 ...

  8. keil无法生成axf文件之解决方法

    参考:参考<鱼鹰单片机>https://blog.csdn.net/weixin_42876465/article/details/88356890 其实很简单 默认情况是生成 .axf ...

  9. C51函数的递归调用

    前几天在写C51程序时用到了递归,简单程序如下: void WRITE_ADD(uchar addr,uchar wbyte) { START(); //先发送起始信号 WRITE_BYTE(0xa0 ...

随机推荐

  1. 深入理解7816(5)-----关于文件DF/EF/MF/FID/AID/SFI

    刚开始接触CPU卡的时候,对于各种文件.应用的定义容易模糊不清,通常不能准确地界定什么是文件?什么是应用?DF和EF的区别真的就像计算机里的目录和文档那样吗?FID.AID.SFI这些概念都在什么时候 ...

  2. Activity被回收导致fragment的getActivity为null的解决办法

    这两天一直被这个问题困扰,假如app长时间在后台运行,再点击进入会crash,而且fragment页面有重叠现象,让我十分不爽.研究了一天,终于明白其中的原理并加以解决.解决办法如下: 如果系统内存不 ...

  3. 开始使用Logstash

    开始使用Logstash 本节将指导处理安装Logstash 和确认一切是运行正常的, 后来的章节处理增加负载的配置来处理选择的使用案例. 这个章节包含下面的主题: Installing Logsta ...

  4. js实现编码,解码

    <p><script type="text/javascript">// <![CDATA[var decToHex = function(str) ...

  5. jQuery ajax方法在Chrome浏览器下失效问题

    最近做测试时碰到一个问题,chrome下使用ajax的一些方法(如get,load等)的时候完全失效: $(function() { $("#send").click(functi ...

  6. poj2752 Seek the Name, Seek the Fame

    Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and ...

  7. 2014.7.8模拟赛【笨笨当粉刷匠】|bzoj1296 [SCOI]粉刷匠

    笨笨太好玩了,农田荒芜了,彩奖用光了,笨笨只好到处找工作,笨笨找到了一份粉刷匠的工作.笨笨有n条木板需要被粉刷.每条木板被分成m个格子,每个格子要被刷成红色或蓝色.笨笨每次粉刷,只能选择一条木板上一段 ...

  8. 借助Net-Speeder对服务器进行优化

          对于丢包情况较为严重的VPS,我们可以采用一些优化TCP协议的软件对服务器进行相应的优化操作,我在以前的文章中介绍过一款名叫锐速的软件,它可以很好的解决丢包问题,但是这个软件对于服务器内核 ...

  9. 合天网安实验室学习笔记----Linux基础

    一.Linux的发展 linux kernel的版本是:2.6.32-279.el6.x86_64,此格式为:主版本.次版本.释出版本-修改版本 次版本为奇数:测试版: 次版本为偶数:稳定版: Lin ...

  10. <php>Ajax基本格式

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...