zyjhandsome 发表于 2013-5-2 14:06:46

关于Kell中出现UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS

本帖最后由 zyjhandsome 于 2013-5-2 14:09 编辑

      近来kell中编译出现UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS的警告,是由于一些函数声明了没有调用所引起的,查阅一些资料,解决办法分享一下...
      在 Options for Target中的BL51 Misc 中 Disable Waring Numbers : 填入16即可

qllaoda1 发表于 2013-5-2 14:14:17

本帖最后由 qllaoda1 于 2013-5-2 15:12 编辑

掩耳盗铃的做法,关闭警告显示不等于问题就不在了。KEIL C51的语法要求是很低的,有些看起来虽然只是警告,但可能带来致命问题。不建议关闭这些警告,免得出了问题,连原因都分析不到。
像楼主提到的那个“UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS”,出现这类警告的时候,表示有函数定义了,但是没有被调用。没有被调用的函数,依然会被连接到最终的二进制代码里,而且函数所使用的RAM不会参与内存覆盖的优化分析,这样不仅占用了代码空间,而且浪费了内存空间。

a_2012_m 发表于 2013-5-2 14:52:41

"MULTIPLE CALL TO SEGMENT"这类警告是什么意思,如何解除?

qllaoda1 发表于 2013-5-2 15:15:14

a_2012_m 发表于 2013-5-2 14:52 static/image/common/back.gif
"MULTIPLE CALL TO SEGMENT"这类警告是什么意思,如何解除?

一个函数被普通函数调用过,又被中断函数调用过,或者被两个不同的中断函数调用过。(这里的调用包括直接调用和间接调用)。
这样就会出现一种可能,函数被普通函数调用的时候,发生了中断,而中断又调用了这个函数,即发生了函数的重入。C51的函数默认是不可重入的,如果一定要这样做,需要将函数声明为可重入。

benqme 发表于 2013-5-2 15:17:28

二楼说法正确

a_2012_m 发表于 2013-5-2 15:26:04

qllaoda1 发表于 2013-5-2 15:15 static/image/common/back.gif
一个函数被普通函数调用过,又被中断函数调用过,或者被两个不同的中断函数调用过。(这里的调用包括直接 ...

讲解的很清楚,谢谢!
再请教一下,如何将函数声明为可重入?

qllaoda1 发表于 2013-5-2 15:36:27

a_2012_m 发表于 2013-5-2 15:26 static/image/common/back.gif
讲解的很清楚,谢谢!
再请教一下,如何将函数声明为可重入?

example:
int func (char i) reentrant

NemoGu 发表于 2013-5-2 16:03:21

可重入函數,通過分配特定的可重入函數堆棧来避免可重入函數被多個函數同時調用所產生的數據覆蓋問題。
詳細說明可參考http://www.keil.com/support/man/docs/c51/c51_le_reentrantfuncs.htm

使用Linker Overlay directive也可以解決Multiple Call Waring

zyjhandsome 发表于 2013-5-3 19:32:51

这个方法只是不显示warning, 根本问题还是没有解决的...要是用iar编译就会自动不compile这些uncallied waring了.
页: [1]
查看完整版本: 关于Kell中出现UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS