N76E003初次搭建工程及遇到Keil 警告:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS时的解决方案

问题描述

初次接触N76E003开发板,主要根据以下三篇文章搭建了基本的环境:

  1. [N76E003安装环境教程] https://www.cnblogs.com/zhugeanran/p/9554822.html (本文调试遇到警告例子为该文末尾程序)
  2. [N76快速入门及常见坑] https://blog.csdn.net/qlexcel/article/details/81069808
  3. [单片机入门学习笔记:新唐单片机N76E003] https://blog.csdn.net/qq_41068712/article/details/86169439

然后项目编译 0 Error(s), 0 Warning(s),创建却提示了12个Warnings,大致都如同下面所示:

*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_TIMER3_DELAY10US?DELAY

在网上查阅资料得知,这是因为程序中有些函数例如COMPARE(或片段)以前(调试过程中)从未被调用过,或者根本没
有调用它的语句。这条警告信息里面还包含一条信息,它指示出是哪个函数导致了这一问题。

这个Warning可以置之不理,但是实际操作中却会出现其他的小问题。譬如即使程序没有调用这个函数,Keil仍然把它编译连接进整个程序。ROM充足并不用过多地担心,但在这个函数中的变量,不会被列入覆盖分析范围内,也就是说这些变量占的空间不能被回收,这对于为数不多的RAM资源可以说是巨大的浪费。

具体的解决方法就是找到Common.h和Delay.h的头文件中,找出所有定义了但未使用的函数,并为每个函数添加如下的格式:

#ifdef _函数名_

~~ 该函数 ~~

#endif

当为所有此类L16的Warning(s)全部添加了这种结构后,Warning就消失了。

然后,有出现了三个Warning(s)如下所示:

*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  _TIMER0_DELAY1MS
        MODULE:  .\Objects\main.obj (MAIN)

看到百度知道一位大神的解释最详细,还提到了其他引发错误的可能,在此附上链接:
https://zhidao.baidu.com/question/278387387.html
我这个情况出现的问题是我把我用到的一个函数也预编译掉了,去掉之前为该函数添加的冗余的预编译语句就可以了。
#ifdef Timer0_Delay1ms
#endif

//ifdef Timer0_Delay1ms
void Timer0_Delay1ms(UINT32 u32CNT)
{
    clr_T0M;                                		//T0M=0, Timer0 Clock = Fsys/12
    TMOD |= 0x01;                           		//Timer0 is 16-bit mode
    set_TR0;                              		  //Start Timer0
    while (u32CNT != 0)
    {
        TL0 = LOBYTE(TIMER_DIV12_VALUE_1ms); 		//Find  define in "Function_define.h" "TIMER VALUE"
        TH0 = HIBYTE(TIMER_DIV12_VALUE_1ms);
        while (TF0 != 1);                   		//Check Timer0 Time-Out Flag
        clr_TF0;
        u32CNT --;
    }
    clr_TR0;                              		  //Stop Timer0
}
//endif

最终,构建工程完成了。
在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页