ICCAVR编译器的介绍

发布者:SparklingEyes最新更新时间:2018-05-29 来源: eefocus关键字:ICCAVR  编译器 手机看文章 扫描二维码
随时随地手机看文章

ICCAVR是一种符合ANSI标准的C语言来开发MCU程序的一个工具,它具有作用合适、使用方便、技术支持强大等优点。ICCAVR就是ATMEL公司为AT90系列单片机开发我编译工具。

ICCAVR 介

 1   ImageCraft  的ICCAVR 介绍

  ImageCraft  的ICCAVR 是一种使用符合 ANSI 标准的 C 语言来开发微控制器 MCU程序的一个工具 它有以下几个主要特点:

  ICCAVR 是一个综合了编辑器和工程管理器的集成工作环境 IDE 其可在WINDOWS9X/NT 下工作。

  •   源文件全部被组织到工程之中 文件的编辑和工程的构筑也在这个环境中完成 编译错误显示在状态窗口中 并且当你用鼠标单击编译错误时 光标会自动跳转到编辑窗口中引起错误的那一行 这个工程管理器还能直接产生您希望得到的可以直接使用的 INTELHEX 格式文件 INTEL HEX 格式文件可被大多数的编程器所支持 用于下载程序到芯片中去。

      ICCAVR 是一个 32 位的程序 支持长文件名。

      出于篇幅考虑 本说明书并不介绍通用的 C 语言语法知识 仅介绍使用 ICC AVR 所必须具备的知识 因此要求读者在阅读本说明书之前 应对 C 语言有了一定程度的理解。

      2 ICCAVR 中的文件类型及其扩展名

      文件类型是由它们的扩展名决定的 IDE 和编译器可以使用以下几种类型的文件。

      输入文件:

      .c   扩展名----表示是 C 语言源文件

      .s   扩展名----表示是汇编语言源文件

      .h   扩展名----表示是 C 语言的头文件

      .prj  扩展名----表示是工程文件 这个文件保存由 IDE 所创建和修改的一个工程的有关信息。

      .a   扩展名----库文件 它可以由几个库封装在一起 libcavr.a 是一个包含了标准 C 的库和 AVR特殊程序调用的基本库 如果库被引用 链接器会将其链接到您的模块或文件中您也可以创建或修改一个符合你需要的库。

      输出文件:

      .s   对应每个 C语言源文件 由编译器在编译时产生的汇编输出文件

      .o  由汇编文件汇编产生的目标文件 多个目标文件可以链接成一个可执行文件

      .hex  INTEL HEX 格式文件 其中包含了程序的机器代码

      .eep  INTEL HEX 格式文件 包含了 EEPROM的初始化数据

      .cof  COFF  格式输出文件 用于在 ATMEL的 AvrStudio 环境下进行程序调试

      .lst     列表文件 在这个文件中列举出了目标代码对应的最终地址

      .mp    内存映象文件 它包含了您程序中有关符号及其所占内存大小的信息

      .cmd  NoICE 2.xx  调试命令文件

      .noi   NoICE 3.xx 调试命令文件

      .dbg   ImageCraft  调试命令文件

      3 附注和扩充

      #pragma  编译附注

      这个编译器接受以下附注

      #pragma interrupt_handler : : ...

      这个附注必须在函数之前定义 它说明函数 func1 func2 是中断操作函数 所以编译器在中断操作函数中生成中断返回指令 reti 来代替普通返回指令 ret 并且保存和恢复函数所使用的全部寄存器 同样编译器根据中断向量号 vector number 生成中断向量地址#pragma ctask  ...

      这个附注指定了函数不生成挥发寄存器来保存和恢复代码 它的典型应用是在 RTOS实时操作系统中让 RTOS 核直接管理寄存器#pragma text:

      改变代码段名称 使其和命令行选项相适应

      #pragma data:

      改变数据段名称 使其和命令行选项相适应 这个附注在分配全局变量至 EEPROM中时必须被使用 读者可参考访问 EEPROM 的例子#pragma abs_address:

      函数和全局数据不使用浮动定位 重定位 而是从

    开始分配绝对地址 这在访问中断向量和其它硬件项目时特别有用#pragma end_abs_address

      结束绝对定位 使目标程序使用正常浮动定位

      C++ 注释

      如果你选择了编译扩充(Project->OptiONs->Compiler) 你可以在你的源代码中使用 C ++的 //  类型的注释二进制常数

      如果你选择了编译扩充(Project->Options->Compiler) 你可以使用 0b<1|0>*  来指定二进制常数 例如 0b10101 等于十进制数 21。

      在线汇编

      你可以使用 asm("string")函数来指定在线汇编代码 读者可参考在线汇编。

      4 代码转换

      IAR 或其它 ANSI C编译系统的代码转换。

      IAR C编译器作为应用于 AVR的第一个 C 编译器 它有十分丰富的源代码 当你从 IAR编译系统转换到 ImageCraft 编译系统时 绝大多数符合 ANSI C标准的程序代码不需要转换 IAR C中 IO 寄存器的定义和ICCAVR 也是相同的。

      中断操作描述 ICCAVR 使用 pragma 附注描述中断操作函数 而 IAR 引入了语法扩充 interrupt 关键字 下面是一个对照。

      在 ICCAVR 中:

      #pragma interrupt_handler func:4 // 4 是这个中断的向量号 func 为中断处理函数名称ICCAVR 可以使多个中断向量共用一个中断处理函数。

      在 IAR 中:

      interrupt [vector_name] func()   // vector_name 是某一个中断向量的名称 IAR  C 的中断向量地址使用中断名称来代替 以增加程序的可读性。

      扩充关键字

      IAR 引入 flash 关键字将项目分配进入程序存贮空间 FLASH存贮器 ICCAVR 使用const关键字来达到相同的目的。

      过程调用转换

      在两个编译系统之间函数参数传递使用的寄存器是不同的 这仅影响手工写的汇编函数。

      在线汇编 宏等 IAR 不支持在线汇编符号 而 ICCAVR 支持在线汇编。

ICCAVR特点

  1.工程管理器还能直接生成可以直接使用的INTEL HEX格式文件,该格式的文件可被大多数编程器所支持,用于下载到芯片中;

  2.ICCAVR是一个32位的程序支持长文件名。

  3.源文件全部被组织到工程之中,文件的编辑和工程的构筑也在这个环境中完成,错误显示在状态窗口中,并且当你点击编译错误时,光标自动跳转到错误的那一行;

  4.ICCAVR是一个综合了编辑器和工程管理器的集成工作环境(IDE);

ICCAVR向导

  录并且选择并打开led 工程工程管理器显示在这个工程中只有一个文件led.c 然后从Project 菜单中选择Options 命令打开工程编译选项在"Target"标号下选择目标处理器然后从Project 菜单中选择Make Project 命令IDE 将调用编译器编译这个工程文件并且在状态窗口中显示所有的信息。

  如果没有错误在和源文件同一个目录在这个例子中是iccexamples.avr 中输出一个文件led.hex 这个文件是 INTEL HEX 格式大多数能支持AVR MCU 的编程器和模拟器都支持这种格式并且能下载这个程序进入你的目标系统这样就完成了一个

  程序的构筑如果你希望用支持 COFF 调试信息的工具来测试你的程序比如AVR Studio 那么你需要从Project 菜单中选择Options 命令在编译标签下选择COFF 输出文件格式对一些常用的作用你也可使用工具条或鼠标右键弹出菜单例如你可以在工程窗口单击鼠标右键选择编译选项。

  在工程窗口中双击文件名IDE 将使用编辑器打开这个文件按这个方法打开led.c作为试验可设置一些错误例如从一行中删除分号现在从Project 菜单中选择MakeProject 命令IDE 首先自动保存已经改变的文件并且开始编译这个文件这时在状态,

  窗口中会显示错误信息单击状态窗口中错误信息行或单击其左边的错误符号光标,将移到编辑器中错误行的下面一行上基本上所有C 编译器都是这样开始一个新的工程。

  从 Project 菜单中选择New 命令并且浏览至你希望输出工程文件的目录输出文件的名称取决于你的工程文件名称例如如果你创建一个名称为foo.prj 的工程那么输出文件名称为foo.hex 或foo.cof 等。

  自从创建你自己的工程后 你可以开始写你的源代码(C 或汇编格式) 并且将这个文件加入到工程文件排列中单击工具栏中Build 图标可以很容易地构筑这个工程IDE 输出和ATMEL 的AVR Studio 完全兼容的COFF 文件你可以使用ATMEL 的AVR

  Studio 来调试你的代码。为更容易地使用这个开发工具你可以使用应用程序向导来生成一些使用有关硬件的初始化代码

  2 C 程序的剖析

  一个 C 程序必须定义一个main 调用函数编译器会将你的程序和启动代码和库函,数链接成一个可执行文件因此你也可以在你的目标系统中执行它启动代码的用,途在启动文件中很详细地被描述了一个C 程序需要设定目标环境启动代码初始化这个目标使其满足所有的要求,通常 你的main 例程完成一些初始化后然后是无限循环地运行作为例子让我们看 iccexamples 目录中的文件led.c。

  #include 

  /* 为使能够看清LED 的变化图案延时程序需要有足够的延时时间*/
void Delay()
{
unsigned char a, b;
for (a = 1; a; a++)
for (b = 1; b; b++)
;
}
void LED_On(int i)
{
PORTB = ~BIT(i); /* 低电平输出使LED 点亮 */
Delay();
}
void main()4
{
int i;
DDRB = 0xFF; /*定义 B口输出*/
PORTB = 0xFF; /* B 口全部为高电平对应LED 熄灭*/
while (1)
{
/*LED 向前步进 */
for (i = 0; i < 8; i++)
LED_On(i);
/* LED 向后步进 */
for (i = 8; i > 0; i--)
LED_On(i);
/* LED 跳跃*/
for (i = 0; i < 8; i += 2)
LED_On(i);
for (i = 7; i > 0; i -= 2)
LED_On(i);
}
}

  这个 main 例程是很简单的在初始化一些IO 寄存器后之后它运行在一个无限循环中并且在这个循环中改变LED 的步进图案LED 是在LED_On 例程中被改变的在LED_On 例程中直接写正确的数值到IO 端口因为CPU 运行很快为能够看见图案变化LED_On 例程调用了延时例程因为延时的实际延时值不能被确定这一对嵌套循环只能给出延时的近似延时时间如果这个实际定时时间是重要的那么这个例程应该使用硬件定时器来完成延时,其它的例子8515intr.c 程序很简单但同样清楚地显示了如何用C 写一个中断处理过程这两个例子可以作为你的程序的起点。

ICCAVR的IDE环境

  1   编译一个单独的文件

  正常建立一个输出文件的次序是 你首先应该建立一个工程文件并且定义属于这个工程的所有文件 然而 我们有时也需要将一个文件单独地编译为目标文件或最终的输出文件 这时可以这样操作 从 IDE 菜单 File 中选择 Compile File... 命令 来执行 to Object 和 to OUTPUT 中的任意一个 当你调用这个命令时 文件应该是打开的并且在编辑窗口中可以编辑的。

  编译一个文件为目标文件 to Object 对检查语法错误和编译一个新的启动文件是很有用的 编译一个文件为输出文件 to OUTPUT 对较小的并且是一个文件的程序较为有用 注意 这里使用默认的编译选项。

  2   创建一个新的工程

  为创建一个新的工程 从菜单 Project 中选择 New 命令 IDE 会弹出一个对话框 在对话框中你可以指定工程的名称 这也是你的输出文件的名称 如果你使用一些已经建立的源文件 你可在菜单 Project 中选择 AddFile(s) 命令。

  另外 你可以在菜单 File 中选择 New 命令来建立一个新的源文件来输入你的代码 你可以在菜单 File 中选择 Save  或 Save As 命令来保存文件 然后你可以象上面所述调用 AddFile(s) 命令将文件加入到工程中 也可在当前编辑窗口中单击

  鼠标右键选择 Add to Project 将文件加入已打开的工程列表中 通常你输出源文件在工程同一个目录中 但也可不作这样要求。

  工程的编译选项使用菜单中 Project 中的 OptiONs 命令。

  3   工程管理

  工程管理允许你将多个文件组织进同一个工程 而且定义它们的编译选项 这个特性允许你将工程分解成许多小的模块 当你处理工程构筑时 只有一个文件被修改和重新编译 如果一个头文件作了修改 当你编译包含这个头文件的源文件时 IDE 会自动重新编译已经改变的头文件。

  一个源文件可以写成 C 或汇编格式的任意一种 C 文件必须使用 .c 扩展名 汇编文件必须使用 .s 扩展名 你可以将任意文件放在工程列表中 例如你可以将一个工程文档文件放在工程管理窗口中 工程管理器在构筑工程时对源文件以外的文件不予理睬。

  对目标器件不同的工程 可以在编译选项中设置有关参数 当你新建一个工程时使用默认的编译选项 你可以将现有编译选项设置成默认选项 也可将默认编译选项装入现有工程中 默认编译选项保存在 default.prj文件中。

  为避免你的工程目录混乱 你可以指定输出文件和中间文件到一个指定的目录 通常这个目录是你的工程目录的一个子目录。

  4   编辑窗口

  编辑窗口是你和 IDE 交流信息的主要区域 在这个窗口中你可以修改相应的文件当编译存在错误时 用鼠标单击有关错误信息时 编辑器会自动将光标定位在错误行的位置 注意 对 C 源文件中缺少分号 的错误 编辑器定位于其下面一行。

  5   应用构筑向导

  应用构筑向导是用于创建外围设备初始化代码的一个图形界面 你可以单击工具条中的 Wizard 按钮或菜单 Tools 中的 ApplicationBuilder 命令来调用它。应用构筑向导使用编译选项中指定的目标 MCU来产生相应的选项和代码。

  应用构筑向导显示目标 MCU 的每一个外围设备子系统 它的使用是很显而易见的在这里你可以设置 MCU 的所具有的中断 内存 定时器 IO 端口 UART SPI 和模拟量比较器等外围设备 并产生相应的代码 如果你需要的话 还可产生 main( )函数。

  6   状态窗口

  状态窗口显示 IDE 的状态信息。

  7   终端仿真

  IDE 有一个内置的终端仿真器注意它不包含任意一个 ISP 在系统编程 作用 但它可以作为一个简单的终端 或许可以显示你的目标装置的调试信息 也可下载一个 ASC码文件。

  从 6.20 版本开始 IDE 加入了对 ISP 的支持。

 


关键字:ICCAVR  编译器 引用地址:ICCAVR编译器的介绍

上一篇:ATmega128串口0不工作
下一篇:ICCAVR 编译器错误:illegal character `\0243'

推荐阅读最新更新时间:2024-03-16 16:03

Realview MDK中编译器对中断处理的过程详解
在ARM程序的开发过程中,对中断的处理是很普遍的、也是相当重要的。Realview MDK使用的RVCT编译器提供了__irq关键字,用此关键字修饰的函数被作为中断出来函数编译,即在编译的过程中,编译器会自动添加中断处理过程中现场保护和恢复的代码,减小程序的开发难度,加快软件的开发过程。 在理解__irq关键字的作用之前,先看一下ARM核对异常的处理过程。当产生异常时, ARM核拷贝CPSR寄存器的内容SPSR_ mode 寄存器中,同时设置适当的CPSR 位、改变处理器状态进入ARM 态和处理器模式,从而进入相应的异常模式。在设置中断禁止位禁止相应中断(如果需要)后,ARM核保存返回地址到LR_ mode ,同时设置PC为相应的异
[单片机]
MPLAB X IDE开发环境
项目需要,安装了MPLAB X IDE,下面记录。 安装MPLAB除了本身的IDE外,还需要安装JAVA6.1开发环境,以及C编译器。 刚使用时发现按钮比较多,下面是常用的几个,若需要在线调试,直接按右侧的那个按钮就可以,这个按钮包含编译下载调试,调试所需要的开始暂停复位功能在下图右侧。不得不说,这个开发环境在线调试实在是烂,有时都无法调试,只能重新打开工程,重新上电,可能与下载器有关,使用的是kit3,这个和Jlink相比差远了! 当从MPLAB 8.x转到这时,可能想找到供电的选项在哪里,右键工程名字-- 属性,就可以找到,如下图所示。有时候下载时会出现一些错误,可以考虑下是否没有供电导致的。若下载时出现电压不足的
[单片机]
MPLAB X IDE开发环境
C51编译器-语言扩展(6)-重载函数
Reentrant Functions可重入函数 可重入函数可以被多个进程同时调用。当一个可重入函数执时,其他的处理可以中断这个函数的执行,而开始执行这同一重入函数。一般情况下,Cx51中的函数不能够被同时多次调用或者是重入。原因是函数的参数和局部变量都放在固定的内存中。函数reentrant属性允许声明可重入的函数,如: int calc (char i, int b) reentrant { int x; x = table ; return (x * b); } 可重入函数可以被多次调用,而且可以同时被两个或两个以上的进程调用。在实时应用或在中断和非中断程序都要调用同一个函数时就需要使用可重入函数。 对于每个可重
[单片机]
利用MC68K的C编译器的μC/OS-II向MC68K移植的实现
一、MC68K CPU简介 MC68K及68020、68040等的著名的MOTOROLA32位微处理器,和与之兼容的68K、CPU32、CPU32+等CPU扩充定时处理单元TPU、队列串行模块QSM、系统控制模块和RAM等组成MC683xx系列单片机。 CPU32 内部有8个32位通用数据寄存器,8个32位通用地址寄存器。8个通用数据寄存器可作为累加器使用,也可看成C语言中各种类型的变量;8个通用地址寄存器,可作为变址寄存器使用,也可看成C语言中的指针型变量。CPU32有独立的用户堆栈指针和系统堆栈指针,可区分程序区、数据区、系统区、用户区等存储空间,有7级中断。 要实现μC/OS-II向MC68K的移值,需要
[单片机]
利用MC68K的C<font color='red'>编译器</font>的μC/OS-II向MC68K移植的实现
COSMIC编译器让代码在RAM中运行的方法
简介:对于STM8单片机Flash的块编程,代码必须在Ram内存中运行。因此,存储在Flash中的代码必须拷贝到Ram中编译、链接、运行。Cosmic编译器有两种实现方法:在STVD工程中创建段、在链接文件中创建内存段。 1、在STVD工程中创建段 1)、在工程中设置段名 ‘project’- ‘settings’- ‘linker’- ‘category’- ‘input’,如下图所示: 设置段名‘.FLASH_CODE’,注意同时设置options为‘-ic’,ic的意义为moveable code。 2)、编写存放在段FLASH_CODE中的代码,如下所示 #pragma section(FLASH_
[单片机]
COSMIC<font color='red'>编译器</font>让代码在RAM中运行的方法
英伟达公布开源CUDA编译器及源代码
英伟达公司宣布,LLVM现已支持英伟达GPU,从而让更多的研究人员、独立软件供应商(ISV)以及编程语言能够利用GPU加速的优势。LLVM是一款在业内极其流行的开源编译器。 LLVM是一种应用广泛的开源编译器架构,该架构采用模块化设计,能够轻松地新增对编程语言和处理器架构的支持。CUDA编译器可支持C、C++以及Fortran语言,能够为运用大规模并行英伟达GPU的应用程序加速。英伟达携手LLVM开发者,共同提供针对LLVM内核的CUDA编译器源代码变化以及并行线程执行后端。如此一来,程序员便能够利用更广泛的编程语言来针对GPU加速器开发应用程序,从而令GPU计算比以往任何时候都更加唾手可得、更加普遍。 LLVM支持各
[嵌入式]
C 编译器错误信息中文翻译
Ambiguous operators need parentheses 不 明确的运算需要用括号括起 Ambiguous symbol ``xxx`` 不明确的符号 Argument list syntax error 参数表语法错误 Array bounds missing 丢失数组界限符 Array size toolarge 数组尺寸太大 Bad character in paramenters 参数中有不适当的字符 Bad file name format in include directive 包含命令中文件名格式不正确 Bad ifdef directive synatax 编译预处理ifdef 有语法错 Bad
[单片机]
实验五--中断系统
一。平台   系统:ubuntu12.04   开发板:jz2440   编译器:gcc 二。中断简略   大概除了FPGA这种并行的cpu才不需要中断,像51,AVR,arm这类串行的芯片中断是他们不被淘汰的利器。没有中断,他们不可能得到这么广泛的应用。   arm中断和51的类似,无非就是设置相关寄存器、中断开关,中断源,中断分辨之类的东西;但是注意,arm的中断只是7个模式下的一个,此外,中断还有普通中断和快速中断之分。   而快速中断不需要进行中断的分辨,因为每次最多只有一个被设置为快速中断。    这里看中断源分为两部分。一个是with sub-register,另一个是without,有何区别?试想下,串口会有几
[单片机]
实验五--中断系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved