打印
[经验分享]

[转]Keil C51编译错误总结

[复制链接]
3177|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 | 只看该作者
好东西,收藏了

使用特权

评论回复
5
David_ming| | 2010-2-21 21:44 | 只看该作者
赞一个

使用特权

评论回复
6
lovelyegle| | 2010-2-22 20:03 | 只看该作者
才两种那

使用特权

评论回复
7
麻辣鸭脖子| | 2010-2-23 12:07 | 只看该作者
Keil是干啥的?

使用特权

评论回复
8
xiaoxin1986| | 2010-2-23 20:40 | 只看该作者
总结的挺好的

使用特权

评论回复
9
suoma| | 2010-2-24 14:13 | 只看该作者
就两条啊

使用特权

评论回复
10
yidou| | 2010-2-27 14:53 | 只看该作者
7# 麻辣鸭脖子
Keil μVision是Keil公司(ARM子公司)开发的一款用于MCS-51单片机开发的应用十分广泛的编译和调试软件

使用特权

评论回复
11
ershisi| | 2010-2-28 21:02 | 只看该作者
留个印

使用特权

评论回复
12
Shadow_Song| | 2013-1-25 11:07 | 只看该作者
哇,LZ好人!!

使用特权

评论回复
13
薇儿安蓝| | 2013-1-25 13:38 | 只看该作者
谢谢

使用特权

评论回复
14
dengzhaowen| | 2013-7-2 10:20 | 只看该作者
就两点,不过是好东东。

使用特权

评论回复
15
panamatw| | 2014-8-18 09:07 | 只看该作者
謝謝

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

791

帖子

1

粉丝