IAR编译器问题的总结

之前做项目都是用keil编译器比较多,也基本上用得很顺手,但是最近又开始用IAR编译器,结果这次真是被它折磨得快要崩溃,现在把问题总结如下:(IAR编译器版本:IAR2.10.4)

  1. IAR编译器默认的优化设置一定要注意!这个是之前做的一个项目,也是印象深刻,编译之后在线单步调试时,程序完全不按照正常流程执行,一度还以为时仿真器出了问题。最后才发现原来IAR编译器默认优化选择是中;

  2. IAR编译器的memcpy()函数调用的问题!这个是今天调程序发现的,本来想用内存复制的方式将一个浮点数复制到uchar型数组中,编译完全正确,也没有报错或者是警告,结果运行起来就跑飞了,CAN通信无法正常工作,最后是用联合体的方法实现的;

  3. IAR编译器的强制类型转换!真的搞不清楚IAR的强制转换规则?感觉真的是有点莫名其妙。例子如下:
    int a;
    int b;
    int c;
    u8 d;
    u8 e[4];
    d= a+b; 不报错,但是跑飞
    d=(u8)(a+b);不报错,但是跑飞
    e[0] = a+b; 不报错,运行正常
    c = a+b;
    e[0] = c; 不报错,运行正常

  4. IAR编译器在线调试时,明明定义的int型变量,为什么在watch中却显示的是浮点值!我确定只定义了一个int型!WHY!

  5. IAR的函数仅定义未声明时,被外部函数调用,居然不报错,只是警告,但是在真正调用时却会出现意料之外的错误!!!keil里是直接报错的。这点很要命!IAR的警告千万不能被忽视!!!

    困扰了我快一周的问题,自认为水平也不算差了,所有的可能性都考虑了,flash空间不够,堆栈溢出。。。基本上都查不出问题,关键每个函数绝对都没有问题的,真的是快要放弃了,最后挣扎着尝试,总算是找到了问题的原因,但是却说不上来为什么?
    先说说出现的问题:运行某几个函数时,会出现CAN通信异常的问题,程序运行正常,但是CAN数据发送不出来。仔细检查了这几个函数的每一句话,绝对没有错误的,但是编译后就是CAN通信异常,仿真也都正常。于是就一个函数一个函数的屏蔽,分开调试,结果还是没有解决问题。最后怀疑是flash大小的问题,但是STM8AF52A8是128K的flash,整个代码的也就不到12K,百思不得其解。IAR破解的问题都考虑到了,刚刚是怀疑IAR编译器的设置是不是有问题时,无意间试了一下修改了编译的优化等级,**结果居然真的就是这个优化等级设定的问题!!!**之前因为上过优化等级设置问题的当,于是毅然将编译器的优先级选择的是NONE,结果噩梦就开始了,哈哈,也算是自己给自己挖的坑吧。不过最后总算是自己又给填起来了,将编译器的优化等级设为Low后,重新编译之后,所有的问题迎刃而解。OMG,总算是解决问题了!不过为什么优化等级的不同,会导致CAN通信异常呢?这一点我还没想明白,flash的大小是足够的,128k呢,我才用了12k,有空的时候还是要再仔细研究下。
    OK!问题总算是解决啦!开森!

PS:IAR实在是太难用了!今天忍不住又要来吐槽!
定义的一个全局变量A,然后在test()中调用。调试过程中想看一下A的值,结果加到watch中,一直都报error!OMG!变量名没问题啊!定义的也天衣无缝啊!存储空间也OK啊!到底什么情况?找原因找了半天,开始怀疑人生!怀疑完人生,继续找问题。。。最后觉得应该是编译器优化的问题。果然,test()函数调用被屏蔽了,就是这个问题!我定义了变量,虽然没有用到,但是不代表它不存在啊!以前用keil时没出现过这些奇怪的问题啊啊啊啊啊啊!IAR简直太不好用了!I hate you!

你可能感兴趣的:(IAR编译器问题的总结)