HeP028 发表于 2012-4-9 21:36:10

关于*** WARNING L13: RECURSIVE CALL TO SEGMENT问题的解决办法!

是关于傻孩子菜单:

这些数据如果定义在data区,调用DataSetFuc函数则不会出现*** WARNING L13: RECURSIVE CALL TO SEGMENT这个警告
但是因为89C52的内存有限所以定义在Code区。这不:
*** WARNING L13: RECURSIVE CALL TO SEGMENT
    SEGMENT: ?CO?MAIN
    CALLER:?PR?_DS1302TIMEREAD?MAIN
*** WARNING L13: RECURSIVE CALL TO SEGMENT
    SEGMENT: ?CO?MAIN
    CALLER:?PR?_LCD1602WRITESTRING?MAIN
*** WARNING L13: RECURSIVE CALL TO SEGMENT
    SEGMENT: ?CO?MAIN
    CALLER:?PR?TIMESETFUC?MAIN
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?DS1302INITIAL?MAIN
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?KEYBORDSCAN?MAIN
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?TIMEDISPLAYFUC?MAIN
Program Size: data=9.2 xdata=50 code=6176
creating hex file from "CLockV1.2Project"...
"CLockV1.2Project" - 0 Error(s), 6 Warning(s).

3个递归调用的警告:

请问为什么,程序里并没有调用自己也没被中断调用的啊?该如何解决啊??

hhxb 发表于 2012-4-9 21:55:31

就是因为程序没有调用这些函数,Keil才警告你

HeP028 发表于 2012-4-9 22:41:15

hhxb 发表于 2012-4-9 21:55 static/image/common/back.gif
就是因为程序没有调用这些函数,Keil才警告你

估计你可能至从下半截开始看是的!并非你所说没有调用的哈!

hhxb 发表于 2012-4-9 22:50:39

L13错误,定义全局变量时,加上xdata就可以了。

HeP028 发表于 2012-4-9 23:06:49

------------------------------------------------------------------------
楼上的:我说的很清楚定义在DATA区是警告是没有但是AT89C52的DATA有限de !
------------------------------------------------------------------------
还有办法没?{:funk:}

hhxb 发表于 2012-4-10 10:44:25

本帖最后由 hhxb 于 2012-4-10 10:46 编辑

HeP028 发表于 2012-4-9 23:06 static/image/common/back.gif
------------------------------------------------------------------------
楼上的:我说的很清楚定义在D ...

网上说L13可能是堆栈溢出,也就是内存不足,现在的单片机基本都是52的增强型,有更多内存;干嘛非要用AT89c52;










网上前辈写的
http://hi.baidu.com/pnalson/blog/item/9e23077f8822d50229388a69.html
keil C51单片机内存优化--转
2009年11月27日 星期五 10:48
52本身有256B的数据存储区,如果没在意一些细节,很容易出现RAM超过128就报错的情况。现讲其问题解释如下:

最常见的是以下两种
① 超过变量128后必须使用compact模式编译
   实际的情况是只要内存占用量不超过 256.0 就可以用 small 模式编译
② 128以上的某些地址为特殊寄存器使用,不能给程序用.与 PC 机不同,51 单片机不使用线性编址,特殊寄存器与 RAM 使用重复的重复的地址。但访问时采用不同的指令,所以并不会占用 RAM 空间。

③是否把一些固定的代码存贮到了CODE区。如果把没变化的数据也存储到DATA去,就太浪费了!

    由于内存比较小,一般要进行内存优化,尽量提高内存的使用效率。

    以 Keil C 编译器为例,small 模式下未指存储类型的变量默认为data型,即直接寻址,只能访问低 128 个字节,但这 128 个字节也不是全为我们的程序所用,寄存器 R0-R7必须映射到低RAM,要占去 8 个字节,如果使用寄存组切换,占用的更多。

    所以可以使用 data 区最大为 120 字节,超出 120 个字节则必须用 idata 显式的指定为间接寻址,另外堆栈至少要占用一个字节,所以极限情况下可以定义的变量可占 247 个字节。当然,实际应用中堆栈为一个字节肯定是不够用的,但如果嵌套调用层数不深,有十几个字节也够有了。

theophilus 发表于 2012-4-10 13:01:34

Warning L13, 如果你确认没有递归调用, 直接忽略, 一般使用了函数指针或放入code区的字符串很容易出现这个Warning, 要么不理,要么自行添加OVERLAY, 参考:http://www.keil.com/support/docs/2379.htm
Warning L16 用REMOVEUNUSED (http://www.keil.com/support/man/docs/lx51/lx51_removeunused.htm)

qtds67 发表于 2012-4-10 13:45:20

这估计跟你的工程文件组织还有关系

HeP028 发表于 2012-4-11 12:26:49

没人愿意帮忙啊?

HeP028 发表于 2012-4-25 14:22:37

本帖最后由 HeP028 于 2012-4-25 14:23 编辑



问题还是没解决,请大大门帮个忙看下,AT89S52 + LCD1602移植的菜单,

如果将定义的菜单数据存放在CODE区就会出现*** WARNING L13: RECURSIVE CALL TO SEGMENT这样的警告。且工作不正常!

存放在内存区就不会,因为使用的89S52。所以只能存在ROM区,请大家帮帮忙看下如何能解决这个问题 完整的工程上面已上传,谢谢了!

HeP028 发表于 2012-4-25 15:52:20

人呢??

lryxr2507 发表于 2012-4-25 20:10:41

本帖最后由 lryxr2507 于 2012-4-25 20:12 编辑

回复楼主,从你的态度来看可能大家不会怎么愿意帮你的,并且有人已经帮助你了,但你不愿意详细去理解,那就只有爱莫能助了.

HeP028 发表于 2012-4-25 20:35:30

lryxr2507 发表于 2012-4-25 20:10 static/image/common/back.gif
回复楼主,从你的态度来看可能大家不会怎么愿意帮你的,并且有人已经帮助你了,但你不愿意详细去理解,那就只有 ...

敢问兄台我的态度的怎么了呢?

你怎么就知道我没就没去看?另外知识有限我自己确实解决不了。

不过我看着你这句话我确实态度好不下去不愿意帮助别人就闭上你的嘴吧!论坛像你这种人多了去了,帮不上别人呢还JJYY说别人怎么的怎么的!

farrtone 发表于 2012-4-25 20:42:39

之前遇到过,是程序里有没调用的函数

HeP028 发表于 2012-4-25 20:48:53

farrtone 发表于 2012-4-25 20:42 static/image/common/back.gif
之前遇到过,是程序里有没调用的函数

不是这个问题。没有调用是L16....
这个问题是L13警告:还是指针的问题!

fqc168 发表于 2013-9-22 20:42:35

HeP028 发表于 2012-4-25 14:22 static/image/common/back.gif
问题还是没解决,请大大门帮个忙看下,AT89S52 + LCD1602移植的菜单,

如果将定义的菜单数据存放在CODE ...

文件都是假的,晕!
页: [1]
查看完整版本: 关于*** WARNING L13: RECURSIVE CALL TO SEGMENT问题的解决办法!