最近因为项目需要开始使用IAR for AVR,我用的是5.40版本的,主要是5.40以上才包括了aTtiny87,至于安装文件和和谐文件,大家自己找吧,很好找的。

1.编译报错如图所示:

很显然你没有使能寄存器的位定义。方法如下:Project ——> Option ——> General Options ——> System(如下图所示),勾选

Enable bit definitions in I/O-Include files即可

2.MCU型号选择

如果和我一样都次都是以空工程创建的话,不过忘了第一步先进Project ——> Option ——> General Options ——> Target选择所使用的MCU型号,不然编译免不了要报错,如下图所示。

3. 堆栈大小

今天下午编译一个程序,0错误0警告,挺好,可一运行就跑飞,根本不能正常运行。

其实是我没有正常设置堆栈大小导致的这种问题,尤其是在写大工程时,这种错误出现的概率很高。GCC和IAR分配堆栈的方式不同,IAR先分配堆栈空间,相当于定义一个全局数组为堆栈空间,堆栈初始为堆栈空间最高地址;GCC不用先分配堆栈,自动把RAM剩余空间作为堆栈空间,堆栈初始为RAM最高地址。

先编译看看自己的程序用了多少ram,在看看总共有多少ram。

然后Project ——> Option ——> Linker ——> List选择生成LIST文件,并包含stack选项,如下图所示。

在./Debug/list目录下,得到.map(可能是.lst等其他格式)文件,用记事本打开,找到以下内容:

****************************************
* *
*               CALL GRAPH                     *
* *
****************************************

->Sub-tree of type: Interrupt function tree that does not make
: indirect calls
CSTACK
| Stack used (prev) : 00000000
01 int_T0_OV
| Stack used (prev) : 00000000
| + function block : 0000000C

......(省略N行)

01 main
| Stack used (prev) : 0000003A
| + function block : 00000000
<-Sub-tree of type: Function tree
| Stack used : 000000E2

找到最大的Stack used,我的就是000000E2,这就是用到的最大的堆栈空间,保守一点,我设置成0x100字节,没有超过剩余RAM,再重新编译,运行,仿真器没有堆栈不足警告,程序也能正常运行了。

如下图所示:

4. 查看汇编

相信一个优秀的单片机软件工程师都多多少少会去看看编译器的汇编代码,看看有没有什么问题或者看看编译器有没有自作聪明的做些什么

Project ——> Option ——> C/C++ complier ——> List,勾选output assembler files,编译后则生成离线汇编代码文件

此时在工程目录下的Debug-->List即可看到所有参加编译的C文件对应的汇编文件,后缀名为*.s90

5.内联函数

inline函数传统上只有C++支持,但IAR EW也支持在C代码中使用inline.
#pragma inline:建议编译器对紧随其后的函数进行inline处理
#pragma inline = forced: 强制编译器对紧随其后的函数进行inline处理

/***************************** 错误描述 ******************************************/
// tft.c中定义内联函数
#pragma inline = forced          //强制inline
void TFT_Write_Colour(const RGB_COLOUR *rgb)
{ //...code....
}// tft.h中声明函数
void TFT_Write_Colour(const RGB_COLOUR *rgb);// main.c中调用函数
// 编译报错:main中引用了未定义的外部函数TFT_Write_Colour。/***************************** 解决办法 ******************************************/
// tft.h中“定义函数”
#pragma inline = forced          //在IAR EW430中,这里必须用强制inline;用inline可能导致编译器忽略内联,而定义成普通函数而出错。
void TFT_Write_Colour(const RGB_COLOUR *rgb)
{ //...code....
}// main.c中包含tft.h,并调用函数
// 结果:编译正确

6. 如何把变量定义到flash空间

unsigned char __flash temptab[] = {1,2,3,4,5};  __flash unsigned char a @ 0x8; // 定义变量存放在flash 空间0X08单元

7. 关于内存模型

AVR 微控制器的其中一个特点是它有一种存储器访问方法均衡了“cheap access limited to small memory areas”与“more expensive accessmethods that can access any location in memory”。
在AVR_IAR C/C++编译器中,通过选择某种存储模式(memory model),可设置一些访问方法为默认的存储器访问方法(default memory accessmethod)。共有三种可用的存储模式——Tiny,Small 和Large。你的处理器选项决定了哪些模式可以使用。如果你不指定一种存储模式,则编译器自动设定-v0、-v1、-v2、-v3、-v5 选项下的默认方法为Tiny,-v4 和-v6 选项下的访问方法为Small。  

8. 关于生成文件格式的设置

如图,在linker -> outpu ->other中可设置相应的输出文件格式.

比如要生成bin格式,选择raw-binary就可以了, 如果是要生成hex格式,那么可以选intel-extern ,不过这个时候文件扩展名是*.a90,可以把"Override default " 打钩,然后修改后缀名为hex就行了.

------------------------------------------------------------------------------------------------------------------

作者:庞辉

出处:http://www.cnblogs.com/pang123hui/

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名庞辉(包含链接).

IAR编译器的常见问题相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. .Net Core 环境安装
  2. echarts迁徙图 vue_vue中高德搭配echarts做数据迁徙流线图
  3. Linux下编译vtk的java版本,Ubuntu 16.04 编译VTK7.1
  4. Grub2主题修改和美化--------LinuxWindows
  5. pythonint函数的参数_向嵌入的Python函数传递两个参数(int和array)
  6. lnmp mysql 10061问题
  7. Unity3DAI:寻路(1):A星寻路,在Unity上用C#代码实现。
  8. Android 系统(247)---Android Go项目, Launcher no Notification Dots
  9. Java 1.1.7 String API (!!!)
  10. Cuda-convnet配置指南 on Windows8.1+CUDA6.5+VS2013
  11. 解决windows 下 mysql命令行导入备份文件 查询时乱码的问题
  12. 基于同义词词林的词语间相似度计算
  13. jquery 图片左右切换,一长条的显示,点击左右移动。
  14. 华为员工标准岗位工资明细及分析
  15. 计算机内图片怎么自定义排序,win10系统设置图片文件自定义排序的图文教程
  16. instant app入门和开发指南
  17. Xilinx FPGA MIPI 接口简单说明
  18. 数字逻辑电路——反演规则与对偶规则
  19. php省市区地址匹配,PHP简单实现正则匹配省市区的方法讲解
  20. linux 右键没有终端,ubuntu鼠标右键没有打开终端选项解决方法

热门文章

  1. 低内阻的MOS管 4N04R7
  2. mysql缓存淘汰机制_Redis缓存总结:淘汰机制、缓存雪崩、数据不一致....
  3. python 批量下载网址_python 遍历oss 实现批量下载
  4. python难度大的题_早看少被坑!Python 最难的问题
  5. 天线决定接受频率_对讲机天线到底有多重要?通讯效果好不好要靠它!
  6. 11467人力资源统计学在计算机,2013年至2017年自考11467《人力资源统计学》真题及答案.pdf...
  7. soapui工具_基于开源的API测试工具!不再为web服务负载测试而发愁
  8. 怎么用计算机计算出选手最后得分,计算选手最后得分(限制分的值,且最后按n或N键结束,其他键继续)...
  9. java 数据库 空值_java – 是否可以将枚举属性的空值存储到数据库?
  10. IC/FPGA笔试/面试题分析(九)关于FIFO最小深度计算的问题