C51编译警告: WARNING L1 WARNING L15

发布者:技术旅人最新更新时间:2016-11-07 来源: eefocus关键字:C51  编译警告 手机看文章 扫描二维码
随时随地手机看文章
1、C51编译警告“*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL” -------转载

 *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL 
    SYMBOL:  ?C_START 
    MODULE:  .STARTUP.obj (?C_STARTUP) 
 *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL 
    SYMBOL:  ?C_START 
    MODULE:  .STARTUP.obj (?C_STARTUP) 
    ADDRESS: 000DH

         如果你在用C51编译器出现上面的警告,并且找遍了网上也没能找出个究竟时,你是否觉得这个问题很难,难得以至于没人能回答呢?

        其实这个只是初学者和粗心者才会犯的错误:没把C文件添加到项目中!

       另外,还有可能是因为存在没有被调用的已经定义的函数。

 

2、WARNING L15: MULTIPLE CALL TO SEGMENT   ----------转载

*** WARNING L15: MULTIPLE CALL TO SEGMENT
说说几个小问题吧,一般我们在用KEIL的时候,只要编译器报

- 0 Error(s) 一般我们都不去管多少个 Warning(s).了,一般这样程序基本都能运行,但是其实仔细想想,这里还是有问题的,否则编译器没事吃饱了撑得,报什么警告啊~~~

今天来说说*** WARNING L15: MULTIPLE CALL TO SEGMENT这个问题!

其实这个问题应该是引起注意的,有可能引起程序冲突,但是一般时候程序运行不会有问题,但是如果出来问题,那将会是很讨厌的问题.

分析一下 产生这一警告的一个根源是:例如在主循环里调用了一个函数,而在中断服务中,你又一次调用了同样的函数。这样当主循环运行到该函数中时, 一旦产生中断,则在中断里又再次调用该函数!而使得该子函数发生了重入,这时,尽管概率很低,但是很可能出错!这样,编译器就给出了警告!告诉你*** WARNING L15: MULTIPLE CALL TO SEGMENT ,表达的意思是发生了重入!字面意思自己理解去吧~~~

想要避免这种情况的方法

一.用reentrant使函数重入

关于reentrant的说明:

1,重入函数不能传递bit类型的参数和变量;

2,重入函数建立的是模拟堆栈区,所以不使用一般函数位于存储模式默认空间的可覆盖式堆栈,而是在同一空间从顶端另行分配一个非覆盖式的重入堆栈。

     small 默认空间是 data;

     compact 默认空间是 pdata;

     largr 默认空间是 xdata;

3,由于要保存参数和局部变量,所以会消耗很大的栈空间;尽量少用这种模式;

4、    在同一程序中可以定义和使用不同存储器模式的重入函数,任意模式的重入函数不能调用不同存储器模式的重入函数,但可以调用普通函数。
5、    实际参数可以传递给间接调用的重入函数。无重入属性的间接调用函数不能包含调用参数。

二.如果空间多的话,可以定义两个同功能的函数,分别在中断和中断外调用

别的方法没研究出来,嘿嘿~~~对了 我建议用第二种方法好点,第一种有些限制,不爽~~

WARNING L15: MULTIPLE CALL TO SEGMENT

这个问题必须注意,可能引起程序冲突,假设你用于自动化领域,则可能导致信号产生尖峰。 产生这一警告的一个根源是:你在主循环里调用了一个函数(如aaa),而在中断服务函数里,你用调用了这个函数(如aaa)。这样当主循环运行到该函数中 是,一旦产生中断,则在中断里又再次调用该函数!这时,很可能出错! 避免这种情况的方法很多:如,在进中断的时候置需调用该函数的标志,而在主循环中调用该函数。
 

3、WARNING L16

*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    
SEGMENT: ?PR?_COMPARE?TESTLCD

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

关键字:C51  编译警告 引用地址:C51编译警告: WARNING L1 WARNING L15

上一篇:C51的数据类型和变量定义
下一篇:通过日期算星期的C51源程序

推荐阅读最新更新时间:2024-03-16 15:19

C51 库函数(1)
C-51软件包的库包含标准的应用程序,每个函数都在相应的头文件(.h)中有原型声明。如果使用库函数,必须在源程序中用预编译指令定义与该函数相关的头文件(包含了该函数的原型声明)。例如: #include #include 如果省掉头文件,编译器则期望标准的C参数类型,从而不能保证函数的正确执行。 3.1 CTYPE.H:字符函数 在CTYPE.H头文件中包含下列一些库函数: 函数名: isalpha 原 型: extern bit isalpha(char) 功 能: isalpha检查传入的字符是否在‘A’-‘Z’和‘a’-‘z’之间,如果为真返回 值为1,否则为0。 函数名: isalnum 原 型: extern b
[单片机]
小白自学c51笔记之独立按键
先上个单片机开发板上独立按键的图(我的有四个): 上述按键中23之间,14之间(即引脚之间距离长的)本来就是连通的,按下按键后1和2,3和4连通,如果想让按键连接两支路则可把两支路分别连到1,2或分别连到3,4(我觉得连到任两引脚都可)。 开发板原理图上独立按键模块: GND为接地即低电压,如果按键k1按下则接通相当于一条导线,那么对应的P3^1也为低电压。 抖动现象:一般持续时间为5ms~10ms 按下按键后 在程序中判断P3^1或其他三个口电压是否为低电压,即0时由于存在抖动,可能造成错误,所以要消除抖动。 为了消除抖动现象,有两种方法,一是硬件消抖,二是软件消抖。本质都是延时(这个本质是我自己方便理
[单片机]
小白自学<font color='red'>c51</font>笔记之独立按键
C51单片机对共阳极数码管的控制设计
这是共阳极数码管的电路图,其中JP3接到P0口,JP3的8-1对应数码管的a-dp引脚。 共阳极数码管的编码表如下,注意a---最低位,dp---最高位: 【0---3】0xco,0xf9,0xa4,0xb0, 【4---7】0x99,0x92,0x82,0xf8, 【8---B】0x80,0x90,0x88,0x83, 【C---F】0xc6,0xa1,0x86,0x8e。 C51程序显示数字0-9: #include #define uchar unsigned char void delay(); uchar smg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
[单片机]
<font color='red'>C51</font>单片机对共阳极数码管的控制设计
C51—模拟IIC总线实现EEPROM存取数据
- 什么是IIC总线 IIC总线是同步通信的一种特殊形式,具有接线口少、控制简单、器件封装形式小、通信速率高等特点。在主从通信中,可以有多个IIC总线器件同时连接到IIC总线上,所有与IIC兼容的器件都具有标准的接口,通过地址来识别通信对象,使他们可以经由IIC总线互相直接通信。 IIC总线由SDA数据线和SCL时钟线俩条线构成通信线路,既可发送数据也可以接收数据。在CPU和IC之间、IC与IC间都可以双向传播,每个器件都有唯一的地址,这样就可以使信息进行准确的传输。CPU发出的信号分为地址码和数据码俩部分,地址码用来选址,数据码是通信的内容。 总而言之,IIC总线就是器件之间的通信线路,主器件可以通过IIC总线向从器件发
[单片机]
<font color='red'>C51</font>—模拟IIC总线实现EEPROM存取数据
keil c51是如何启动c程序的
汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和链接。下面看看它和main()函数是如何编译的; //主函数如下; void main(void) { while (1)这是个无条件空循环。 { } } 把上面的main()函数编译后的汇编程序和反汇编代码整理后对照如下; ?C_C51STARTUPSEGMENTCODE ?PR?main?TESTMAINSEGMENT CODE ?STACKSEGMENTIDATA RSEG?STACK DS1 CSEGAT0 ?C_STARTUP:LJMPSTARTUP1 C
[单片机]
C51开发中的static, const, code关键字
static关键字 static在C里面可以用来修饰变量, 也可以用来修饰函数 static修饰变量 变量在C里面可以存在三处: 全局数据区, 栈和堆. 堆和栈是不同的. int a ; int main() { int b ; int c* = (int *)malloc(sizeof(int)); } 上面的代码中, a是全局变量, b是栈变量, c是指向堆变量的指针 static对全局变量的修饰: 限制了只能是本文件引用此变量. 有的程序由多个C文件组成, 可以互相引用变量, 但加入static修饰之后, 只能被本文件中函数引用. static对栈变量的修饰: 栈变量的生命周期延长到程序执行结束时. 一般
[单片机]
C51的基础3《关键字和标识符 》
3 关键字和标识符 3.1 关键字 所谓关键字就是已被Turbo C2.0本身使用,不能作其它用途使用的字。例如关键字不能用作变量名、函数名等。 Turbo C2.0有以下关键字: Turbo C2.0扩展的共11个 asm _cs _ds _es _ss cdecl far near huge interrupt pascal 由ANSI标准定义的共32个 auto double int struct break else long switch case enum register typedef ch
[单片机]
Keil C51中using的用法
Keil C51中using的用法 在C51中断程序中很多时候会用到using关键字,但是很多人并不明白到底是什么意思,这里转帖一篇帮助大家理解。 如果在中断服务函数 ISR 中使用寄存器,那么必须处理好 using 的使用问题:   1、中断服务函数使用 using 指定与主函数不同的寄存器组(主函数一般使用 Register bank 0)。   2、中断优先级相同的ISR 可用 using 指定相同的寄存器组,但优先级不同的 ISR 必须使用不同的寄存器组,在 ISR 中被调用的函数也要使用 using 指定与中断函数相同的寄存器组。   3、如果不用 using 指定,在 ISR 的入口,c51 默认选择寄存器组0
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved