之前做项目都是用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编译器问题的总结相关推荐

  1. IAR编译器的常见问题

    最近因为项目需要开始使用IAR for AVR,我用的是5.40版本的,主要是5.40以上才包括了aTtiny87,至于安装文件和和谐文件,大家自己找吧,很好找的. 1.编译报错如图所示: 很显然你没 ...

  2. iar编译器添加c语言标准库,用IAR编译器开发DS80C400

    DS80C400微控制器的ROM包含多种功能,可通过由8051汇编语言.C或Java编写的程序访问.DS80C400的ROM功能提供成熟的MxTNI™网栈.进程调度和存储器管理,是开始构建C和汇编程序 ...

  3. IAR编译器中函数智能提示

    在用IAR环境编译代码时,按下"."号,会智能提示变量和函数. 用上下箭头选中变量后按回车键就行.不过唯一的缺点就是变量前的那个点需要手动删除.不知道有没有其他办法解决这个问题.

  4. 用IAR调试程序时直接跳过断点执行后面程序的解决办法

    用IAR调试程序直接被跳过断点执行解决办法 首先这个问题是IAR编译器设置的优化等级太高了,降低优化等级就可以了. 解决办法: 在options->C/C++compile---->opt ...

  5. IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

    参考博客及文档有: 1,http://www.cnblogs.com/ele-eye/archive/2011/11/28/2266229.html 2,http://www.cnblogs.com/ ...

  6. IAR中断定义#pragma vector = P0INT_VECTOR __interrupt void P0_ISR(void)啥意思?

    在CC2530芯片中用到IAR中断定义: #pragma vector = P0INT_VECTOR __interrupt void P0_ISR(void) 在 IAR 编译器里用关键字来t __ ...

  7. IAR的const,变量指定绝对地址,函数指定存取区域

    今天要用到ROM-DATA,看了下IAR编译器手册,记录如下:

  8. IAR新建stm32工程,完美移植stm32标准库(附源码)

    开发环境:Window 10 64bit 开发工具:IAR Embedded Workbench 硬件:stm32f103c8t6 基于IAR 开发工具,新建立STM32F1系列的最小开发例程,并加入 ...

  9. IAR 下根据官方库建立 STM32的工程

    目录 1. IARforSTM32工程v0.0版本.... 1 2. IARforSTM32工程v0.1版本.... 6 2.1今天v0.0版本出现了警告.... 6 2.2下载仿真.... 7 2. ...

  10. IAR 的精确延时程序(转)

    C语言中,想使用精确的延时程序并不容易.IAR 中有这样的一个函数 __delay_cycles(),该函数在头文件intrinsics.h中定义,函数的作用就是延时N个指令周期.根据这个函数就可以实 ...

最新文章

  1. 嵩天python笔记_第一篇python笔记
  2. 为什么以太网的最小数据帧长度为64字节?
  3. Apache ZooKeeper - 高可用ZK集群模式搭建与运维
  4. 3 Useful BookmarkLets for Debugging
  5. Linux CentOS 6.x报错解决:错误:Cannot retrieve metalink for repository: epel. Please verify its path and tr
  6. python整数和浮点数相乘_python中整数除法和浮点数到整数转换之间的区别是什么原因?...
  7. 京东java社招面试6_2020最新京东java面试题分享,京东社招
  8. 前端学习(1920)vue之电商管理系统电商系统之角色列表路由的切换
  9. DNS(域名系统) 是什么
  10. 城乡投票源码php_响应式投票系统(支持微信、手机) php版 v3.2
  11. 自动驾驶—— Image Caption的学习笔记
  12. 易语言解析html实例,易语言解析JSON教程
  13. CSS样式div和img居中
  14. CRC16数据校验支持ModelBus和XMODEM校验模式(C语言)
  15. 笔记本实现wifi热点
  16. java 设计模式:软件设计原则、面向对象理论、23 种设计模式
  17. 网络安全基础:公钥密码体制
  18. 基于51单片机的篮球计分器
  19. 新员工犯错续:解决问题
  20. rockchip研讨会_地下在线研讨会6

热门文章

  1. 服务器基础设置:服务器设置PXE启动,
  2. 基于Android图书馆借阅系统app毕业设计
  3. 计算机wifi无法启动不了,电脑wifi启用不了怎么办
  4. 利用natapp做内网穿透
  5. POJ-1067 取石子游戏(威佐夫博弈)
  6. Spring Security Oauth2单点登录原理与技术
  7. js获取当前路径的url
  8. Python数据挖掘实战——贝叶斯分类算法
  9. 计算机中算术逻辑单元负责,算术逻辑单元可实现 算术逻辑单元的发展
  10. C语言——坦克大战(纯控制台显示)