[经验分享] [转]Keil C51编译错误总结

[复制链接]
4234|14
 楼主| laslison 发表于 2010-2-21 15:16 | 显示全部楼层 |阅读模式
1.第一种错误信息

***WARNING L15:  MULTIPLE CALL TO SEGMENT

SEGMENT:   ?PR?_WRITE_GMVLX1_REG?D_GMVLX1

CALLER1:   ?PR?VSYNC_INTERRUPT?MAIN

CALLER2:   ?C_C51STARTUP

***WARNING L15:  MULTIPLE CALL TO SEGMENT

SEGMENT:   ?PR?_SPI_SEND_WORD?D_SPI

CALLER1:   ?PR?VSYNC_INTERRUPT?MAIN

CALLER2:   ?C_C51STARTUP

***WARNING L15:  MULTIPLE CALL TO SEGMENT

SEGMENT:   ?PR?SPI_RECEIVE_WORD?D_SPI

CALLER1:   ?PR?VSYNC_INTERRUPT?MAIN

CALLER2:   ?C_C51STARTUP

    该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,

或者同时被多个中断服务程序调用。

    出现这种问题的原因之一是这个函数是不可重入性函数,当该函数运行时它可能会被一个中断打断,从而使得结果发生变化

并可能会引起一些变量形式的冲突(即引起函数内一些数据的丢失,可重入性函数在任何时候都可以被ISR打断,一段时间后又可以

运行,但是相应数据不会丢失)。

    原因之二是用于局部变量和变量(暂且这样翻译,arguments,[自变量,变元一数值,用于确定程序或子程序的值])的内存区被其他函数的内存区所覆盖,如果该函数被中断,则它的内存区就会

被使用,这将导致其他函数的内存冲突。

    例如,第一个警告中函数WRITE_GMVLX1_REG 在D_GMVLX1.C 或者D_GMVLX1.A51被定义,它被一个中断服务程序或者一个调用了中断

服务程序的函数调用了,调用它的函数是VSYNC_INTERRUPT,在MAIN.C中。

解决方法:

    如果你确定两个函数决不会在同一时间执行(该函数被主程序调用并且中断被禁止),并且该函数不占用内存(假设只使用寄存器),

则你可以完全忽略这种警告。

    如果该函数占用了内存,则应该使用连接器(linker)OVERLAY指令将函数从覆盖分析(overlay analysis)中除去,例如:

OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *)

   上面的指令防止了该函数使用的内存区被其他函数覆盖。如果该函数中调用了其他函数,而这些被调用在程序中其他地方也被调用,

你可能会需要也将这些函数排除在覆盖分析(overlay analysis)之外。这种OVERLAY指令能使编译器除去上述警告信息。

   如果函数可以在其执行时被调用,则情况会变得更复杂一些。这时可以采用以下几种方法:

1.主程序调用该函数时禁止中断,可以在该函数被调用时用#pragma disable语句来实现禁止中断的目的。必须使用OVERLAY指令将该函数

从覆盖分析中除去。

2.复制两份该函数的代码,一份到主程序中,另一份复制到中断服务程序中。

3.将该函数设为重入型。例如:

void myfunc(void) reentrant {

...

}

      这种设置将会产生一个可重入堆栈,该堆栈被被用于存储函数值和局部变量,用这种方法时重入堆栈必须在STARTUP.A51文件中配置。

这种方法消耗更多的RAM并会降低重入函数的执行速度。
 楼主| laslison 发表于 2010-2-21 15:17 | 显示全部楼层
2.第二种错误信息




*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS



  



SEGMENT: ?PR?_COMPARE?TESTLCD




       说明:程序中有些函数(或片段)以前(调试过程中)从未被调用过,或者根本没有调用它的语句。



       这条警告信息前应该还有一条信息指示出是哪个函数导致了这一问题。只要做点简单的调整就可以。不理它也没什么大不了的。



       解决方法:去掉COMPARE()函数或利用条件编译#if …..#endif,可保留该函数并不编译。
linhai2009 发表于 2010-2-21 15:24 | 显示全部楼层
不错,感觉总结的听全面的
xiaoxin1986 发表于 2010-2-21 18:56 | 显示全部楼层
好东西,收藏了
David_ming 发表于 2010-2-21 21:44 | 显示全部楼层
赞一个
lovelyegle 发表于 2010-2-22 20:03 | 显示全部楼层
才两种那
麻辣鸭脖子 发表于 2010-2-23 12:07 | 显示全部楼层
Keil是干啥的?
xiaoxin1986 发表于 2010-2-23 20:40 | 显示全部楼层
总结的挺好的
suoma 发表于 2010-2-24 14:13 | 显示全部楼层
就两条啊
yidou 发表于 2010-2-27 14:53 | 显示全部楼层
7# 麻辣鸭脖子
Keil μVision是Keil公司(ARM子公司)开发的一款用于MCS-51单片机开发的应用十分广泛的编译和调试软件
ershisi 发表于 2010-2-28 21:02 | 显示全部楼层
留个印
Shadow_Song 发表于 2013-1-25 11:07 | 显示全部楼层
哇,LZ好人!!
薇儿安蓝 发表于 2013-1-25 13:38 | 显示全部楼层
dengzhaowen 发表于 2013-7-2 10:20 | 显示全部楼层
就两点,不过是好东东。
panamatw 发表于 2014-8-18 09:07 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

791

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部