• 注册 / 登录
  • 切换到窄版
  • 查看: 2679|回复: 0

    华大单片机Keil MDK编译中常遇的错误和警告汇总

    [复制链接]

    665

    主题

    679

    帖子

    6476

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6476
    发表于 2022-8-14 21:47:33 | 显示全部楼层 |阅读模式

    路线栈欢迎您!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    新手入门:用华大HC32替换STM32,注意这些细节!

    在MDK的开发中编译的时候会遇到各种问题,本文把开发中遇到的问题及相应的解决办法做个汇总,希望对大家有帮助。

    说明:此颜色显示的内容为编译器提示的错误或警告;

              此颜色显示的内容为用户程序中的内容具体的实际情况中会有不同。

    error: #18: expected a ")"
    如果是出现在c文件中, 多半是因为少了一个")",或者错误行有编译器不识别的字符;
    如果出现在头文件中,错误行又是一个函数声明,多半是因为在函数声明中有编译器不认识的字符。


    error: #20: identifier "TIM2_IRQChannel" is undefined
    固件库里的库文件没有添加进工程里面,所以出现未定义的情况。
    TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中。

    warning:  #1-D: last line of file ends without a newline
    这个是由于在main函数的“}”后,没有加回车。只要在main函数的“}”后加回车键,此警告信息即可消除。

    error:#65:expected a ";"
    头文件里的结构体定义里的最后一行没有加";" 如 NB menu{..};

    Error: L6200E: Symbol temp multiply defined (by wenshidu.o and main.o).
    变量赋值两次,看看是不是那个外部变量又给赋值了,main.c申明,其他.c文件对应的.h文件中用extern引用

    warning:  #223-D: function "_NOP_" declared implicitly
    在使用的文件中添加extern void _NOP_();既可。

    warning:  #1295-D: Deprecated declaration CC_XCal - give arg types
    没有用形参 定时时用void CC_XCal(void);即可。

    Error: L6218E: Undefined symbol ..................... (referred from xxxxx.o).Target not created
    使用的函数没有被定义。一般只要添加相应的头文件即可。

    error: #101:“.........” has already been declared in the current scope
    .......内容已经声明过,解决办法将#endif调整到最后!

    error: #247: function "DelayUs" has already been defined
    有一个同名的 DelayUs 类已经被定义过了

    error:  #109: expression must have (pointer-to-) function type
    意思是表达式必须具有(指针指向)函数类型,这种情况大多是不同类型的数据定义或函数名定义重名了。

    warning:  #61-D
    warning:  #68-D:
    在KeilARM的LPCARM,存在(1<<31)编译警告问题
    main.c(174): warning:  #61-D: integer operation result is out of range
    main.c(174): warning:  #68-D: integer conversion resulted in a change of sign
    由于编译器默认signed int即32位有符号整数类型,而1<<31实际为0x80000000,
    这样就有可能改写了符号位(最高位)
    依此类推,(2<<30),(3<<29)...等都会出现编译警告问题.
    解决办法为: ((unsigned int)1<<31),((unsigned int)2<<30),...

    warning:  #1295-D: Deprecated declaration ShowSendTime - give arg types
    解决方法:将void ShowSendTime()改为void ShowSendTime(void)

    warning:  #550-D: variable "d" was set but never used
    描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.
    解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.

    error:  #159: declaration is incompatible with previous "wr_lcd" (declared at line 40)
    void a(void) //函数a的实体
    {
           b(); //调用函数b
    }
    void b(void) //函数b的实体
    {
           ...
    }
    这样如果点编译,就会产生error:  #159的错误,因为当函数a调用函数b时,发现在这之前都没有函数b的任何声明.
    解决方法:
    在函数a调用函数b之前,对函数b进行声明,如:
    void b(void); //对函数b进行声明
    void a(void) //函数a的实体
    {
          b(); //调用函数b
    }
    void b(void) //函数b的实体
    {
         ...
    }

    error:  #70: incomplete type is not allowed
    描述:不允许不完整的类型。原因是数据的引入方法错误。

        正确的引入结构体方法是;

        1.在a.h中声明这个结构体,(结构体实体要在.h文件中)

        2.在a.c中定义这个结构体类型的变量。(也可以在a.h中定义结构体变量)

        3.在b.c中ertern引入这个结构体变量

        当ertern一个数组时如果不定义数组大小是也会出现error: #70: incomplete type is not allowed这个错误。。

        正确引入数组:

        ertern char a[10];

    warning: #111-D: statement is unreachable
    描述:声明不可能到达.多出现在这种场合:
    int main(void)
    {
        ...
       while(1) //无限循环,这在不使用操作系统的程序中最常见
       {
          ...
       }
       return 0; //这句声明在正常情况下不可能执行到,编译器发出警告
    }
    解决:不理会.

    warning: C3017W: data may be used before being set
    描述:变量'data'在使用前没有明确的赋值.如:

    warning: #177-D: variable "temp" was declared but never referenced
    描述:变量'temp'进行了声明但没有引用.多出现在声明了一个变量,但却没有使用它,它和warning: #550-D: variable "temp" was set but never used不同之处在于temp从没有使用过.
    解决:若是定义的变量确实没有用,删除掉;若是有用,则在程序中使用.
    与该警告类似的还有 warning: #177-D: function "MACProcessBeacon" was declared but never referenced

    warning: #940-D: missing return statement at end of non-void function "DealwithInspect2"
    描述:返回非空的函数"DealwithInspect2"的最后缺少返回值声明.如:
    int DealwithInspect2(uint32 test)
    {
        ...
        ...
        ...
        //此处应该是return x;返回一个int型数据,若是没有返回值,编译器产生警告
    }

    warning: #1295-D: Deprecated declaration lcd_init - give arg types
    描述:在定义函数的时候,如果你写上函数参数,就会有这个警告,比如void timer_init(); 这里就没有形参,如果这样的话,编译器会给出警告.

    error: #65: expected a ";"
    描述:缺少分号.大多是漏忘';'.
    解决:双击错误行,在定位到错误点的附近找到没加';'号的语句,加上分号.并不一定在定位到的错误行才却分号,可能是这行的上一行,也可能是下一行.

    error: #65: expected a ";"和 error: #20: identifier "xxxx" is undefined一块出现,而且后面的error: #20错误可能一大堆
    最可能是在.h文件声明外部变量或者函数时,没有在声明语句的最后加分号。
    解决:仔细检查.h文件,将分号补上.

    Error: L6200E: Symbol flagu multiply defined (by uart0.o and main.o).
    描述:变量(也是一种符号)flagu多处定义.通常错在全局变量定义重复.
    解决办法:找到重复定义的变量,看情况修改一处.

    error: #137: expression must be a modifiable lvalue
    描述:表达式必须是一个可以修改的数值.主要出现在这种现象:
    a=NUM;
    NUM是一个数值或表达式,a为一个变量,但a被定义为像const这种不可更改的类型,导致NUM不能赋值给变量a.
    解决方法:要么放弃赋值,要么修改变量属性.

    error: #1113: Inline assembler not permitted when generating Thumb code
    这条错误是因为__asm("指令");这种语法是内联汇编(inline assembly)的语法。而RMDK下,内联汇编仅支持ARM汇编语言,不支持Thumb或者Thumb-2汇编语言;但内嵌汇编器支持Thumb和Thumb-2。
    __asm放到一个单独的子函数再被调用就没问题了
    如下:
    __asm void nop(void)
    {
        NOP
    }
    然后在之后的C代码中调用该函数:
    void main()
    {
        ...
        nop();
        ...
    }

    这次就到这里了。

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|路丝栈 ( 粤ICP备2021053448号 )

    GMT+8, 2024-9-17 03:24 , Processed in 0.043025 second(s), 19 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表