
简介IAR中文用户手册-官方版PDF面向使用IAR Embedded Workbench进行嵌入式开发的工程师与在校学习者尤其适合基于Atmel AVR微处理器做项目、需要查阅官方IDE用法的人群。手册系统讲解嵌入式IAR Embedded Workbench IDE、C-SPY调试器与调试系统、C/C编译器、汇编器、XLINK连接器以及XAR库创建器和XLIB库管理器等组件的功能与配置教程部分从新建工程、编译连接到C-SPY断点调试、C与汇编混合编程、C工程创建及中断模拟逐步给出可跟做的操作路径可作为随时查阅的速查资料也可作为系统学习的参考资料。压缩包内共1个PDF文件约859KB体积轻便便于离线保存与打印查阅。该手册已有3380人学习下载说明其在AVR开发群体中具有较高的实用认可度。对于想弄清工程目录结构、文件类型与文档组织方式或需要排查编译连接与调试环节问题的读者这份官方文档能提供较为权威的答案。1. 手册不是拿来读的一份 AVR 工程从建到调的真实时间线多数人下载 IAR中文用户手册 之后第一个动作是把它拖进“资料”文件夹然后继续在群里问“工程建好了为什么链接一堆重复定义”。这份 PDF 的价值从来不在通读而在于它把一条完整链路写死了从安装目录里 Avr\config 下的模板文件到 C-SPY 连上目标板落下第一个断点。它面向的是拿 AVR 系列微控制器做嵌入式开发的人尤其是刚接手别人工程、需要快速弄清“哪个选项在哪一层生效”的工程师。我按真实推进顺序拆先认工具链分工再建工程编译再调中断和混合编程最后说手册里没加粗、但能让你卡半天的几处。中间会夹带命令行、目录表和省时间的做法能直接抄。2. 工具链全景编译器、汇编器、XLINK 与 C-SPY 各自管什么开工之前先把“谁产出什么”搞清楚后面所有报错都能对号入座。这套 IDE 不是一个单体程序而是一串可单独调用的可执行文件编译器和汇编器把源码变成可重定位目标链接器把它们拼成可下载的机器码库工具负责打包和裁剪调试器靠前面几步输出的扩展调试信息做源码级调试。手册第一部分 1.1 到 1.1.7 讲的就是这套分工只是写成了产品说明的口吻落地时得换个读法。2.1 从源码到可执行文件四段流水线与各自的产物把链路拆成四段每段的输入输出都很明确。第一段是 C/C 编译器输入 .c/.cpp输出可重定位目标文件同时生成扩展调试信息第二段是汇编器输入汇编源文件输出同样是可重定位目标并且它内置了 C 预处理器所以条件汇编可以直接用第三段是 XLINK 链接器输入一个或多个可重定位目标加库输出完整的可执行目标文件可以下载到芯片或送进硬件仿真器第四段是库工具XAR Library Builder 负责建库XLIB Librarian 负责列举、添加、插入、更换、移除库里的模块。这四段里最容易被跳过的是“库”这一环。手册里明确写了XLINK 只把应用程序真正用到的库模块拉进来所以库里放一百个函数不等于固件就大一百个函数。反过来某个模块一旦被引用它会连带把它内部依赖的东西全拖进来一个格式化输出函数可能顺手带来几 KB 的代码。评估固件体积时先看链接结果里被引入的库模块清单比盯着源码删函数有效得多。环节可执行文件常见位置输入输出什么时候单独调用C/C 编译器Avr\bin.c / .cpp可重定位目标想单独验证某个文件的编译告警汇编器Avr\bin汇编源文件可重定位目标移植厂商提供的汇编驱动XLINK 链接器Common\bin目标文件 库 命令模板可执行目标 / 映像文件排查段定位、库引用问题XAR / XLIBCommon\bin一批目标文件库文件把稳定模块固化成库给别的工程用C-SPY 调试器Avr\bin驱动带调试信息的可执行目标调试会话无硬件时先跑逻辑命令行这条路手册也提到了编译器、汇编器和链接器都能脱离 IDE 运行。我一般在怀疑 IDE 选项没生效时会走一次命令行把变量隔离掉。# 先看清本机安装目录里真实存在的可执行文件名别照抄博客 ls 安装路径/avr/bin ls 安装路径/common/bin # 单文件编译输出可重定位目标保留调试信息 iccavr main.c -o main.r90 --debug # 链接-f 指向链接命令模板具体文件名以本机 avr/config 目录为准 xlink main.r90 -f 安装路径/avr/config/lnkavr.xcl -o app.d90这两条命令的作用是验证“源码到目标”“目标到可执行”两段是否通。参数上要盯住三处第一个是输出文件的扩展名它决定后续工具怎么识别这个文件第二个是链接命令模板它里面写死了存储器布局、段分配和要包含哪些库换芯片或换存储器型号时必须换模板第三个是调试信息开关关掉之后体积会小一点但 C-SPY 就只能看反汇编源码级断点和变量观察全部失效。命令行的选项名各版本有差异别把博客里的参数当圣旨以本机 help 输出和 config 目录里的模板为准。还有一个选型点值得单独说运行库有两套。DLIB 兼容 ISO/ANSI C 和 C支持 IEEE 754 浮点、多字节参数和局部参数CLIB 是轻型库不完全兼容标准也不支持 IEEE 754 和 C。判断方法很简单——工程里用了 C、用了浮点格式化输出、或者要跨模块传结构体参数就必须 DLIB反过来一个纯 C、只做寄存器操作、Flash 和 RAM 都掐着字节数算的小固件才值得考虑 CLIB。混用是最常见的翻车来源后面第 5 章会展开。2.2 C-SPY 五种驱动怎么选仿真器 / ICE200 / JTAGICE / JTAGICE MKII / CCRC-SPY 是这套工具链里最值钱的部分但“C-SPY”本身只是个壳真正干活的是驱动。手册 1.1.3 列了五种软仿真器、ICE200、JTAGICE、JTAGICE MKII、以及面向智能卡开发板的 CCR 驱动。选错驱动的表现很直接——要么连不上要么连上了但断点行为和你预期完全不一样。驱动连接对象是否实时运行断点能力明确限制软仿真器无硬件指令级仿真软件断点受仿真模型约束外设行为需用宏自行补全ICE200对应硬件仿真器是代码断点数量不限不支持代码和数据覆盖、规格化JTAGICE对应 JTAG 调试器是使用目标芯片上的硬件断点同上串口通信JTAGICE MKII对应 MKII 调试器是4 个硬件断点 不限软件断点同上串口或 USB 连接CCR智能卡开发板类目标是支持实时中断不支持代码覆盖RS-232选型不用纠结手上没板子或者板子还没焊回来先用软仿真器把纯逻辑跑通它的价值在于“在拿到硬件之前就能验证程序逻辑”而且外围设备也能通过宏系统做一定程度的模拟有 MKII 就用 MKII4 个硬件断点加不限量软件断点日常够用ICE200 和 JTAGICE 现在多半只在维护老项目时才会遇到注意它们都不支持代码和数据覆盖做覆盖率统计时别指望。这里有个反直觉的点软仿真器“没有硬件断点限制”但不代表它更好用。它是指令级仿真跑一段延时循环要一条条指令走完实际耗时可能比真机慢几个数量级而且外设行为是模拟出来的寄存器读写看着对时序特性却和真实芯片不是一回事。我见过有人用软仿真调通了串口收发时序烧进芯片后波特率对不上——仿真器不会告诉你晶振误差和中断响应延迟。注意切换驱动后要重新确认工程里的设备型号和链接命令模板。驱动换了但模板还指着上一块芯片的存储器布局链接能过跑起来就是随机崩。2.3 安装目录一次看全Avr\config、Avr\inc、Avr\lib 里到底放什么手册 1.2 节把目录结构讲得很细但它是按“有什么”组织的实际用起来应该按“什么时候会进去”组织。默认根目录在系统盘的 Program Files 下版本号挂在路径末尾安装路径可以自定义但改了之后所有模板里的相对路径都得跟着对。目录里面是什么你什么时候会进去Avr\binAVR 专用插件的可执行文件编译器、汇编器、C-SPY 驱动走命令行、排查工具版本Avr\config链接命令模板 .xcl、特殊功能寄存器描述 .sfr、C-SPY 设备描述 .ddf、语法着色 .cfg、工程模板 .ewp换芯片、改存储器布局、自定义板Avr\doc帮助文档、本手册和参考手册的 PDF、在线帮助 CHM查具体选项含义Avr\inc标准库头文件、定义特殊功能寄存器的头文件怀疑寄存器宏定义和芯片手册对不上Avr\lib预创建的库和库配置文件切换 DLIB / CLIB、裁剪库Avr\src可配置库功能的源码、应用示例、库源码想改库行为、想看某个函数怎么实现Avr\tutor手册教程对应的配套文件照着教程练手别自己从零敲Common\bin共享插件XLINK、XLIB、XAR、编辑器与图形界面插件链接阶段排错Common\configIDE 自身的设置界面异常、重置配置Common\doc链接器和库工具的参考手册写 .xcl、用 XLIBCommon\plugin可加载的插件模块接第三方工具、RTOS 插件Common\src共享插件源码含链接器输出格式示例自定义输出格式这张表里最该记住的是 Avr\config 和 Avr\tutor。前者是你所有“换个芯片试试”的动作入口后者是唯一能让手册教程真正跑起来的东西——很多人照着第 2 章敲了一遍发现编译不过就是因为没打开 tutor 目录里那份现成工程自己手敲漏了选项。在 config 目录里动手有个铁律先复制再改。安装目录下的文件在升级或重装时会被覆盖改了半天的心血一夜清零这种后悔药没地方买。正确做法是把目标 .xcl 或 .ddf 复制到工程目录然后在工程选项里把路径指过去安装目录保持出厂状态。3. 建工程与首次编译把教程第 2 章翻成可复现步骤手册第二部分是教程从新建工程一路写到用库模块。它的顺序是对的但省略了“为什么这么设”。工程建错的表现往往不是当场报错而是三天后你发现某个文件的优化等级和别的不一样行为对不上查一整天。这一章把教程的每一步补上判断依据。3.1 工程层级与选项继承工作区、工程、组、文件四级这套 IDE 的组织结构是四层工作区里可以放一个或多个工程工程里可以建组组里放文件。选项能在工程级、组级、文件级三个位置设置低层级覆盖高层级。这个继承关系是所有人第一天就会踩的坑——你在工程级把优化调成体积优先某个早期从别处拷来的文件在文件级还留着速度优先于是整个工程只有它一个的表现和别的不同日志里也看不出来。新建工程的推荐路径是走模板。Avr\config 下放着工程和库工程的模板文件创建时选对应模板能直接把链接命令模板、设备描述、库配置这些一次性配对比手工从空工程配要稳。选模板时唯一需要你自己确认的是目标芯片型号这个选错后面所有寄存器地址全错且编译器不一定报错。步骤操作判断依据1新建工作区一个工作区对应一个产品线别把所有项目塞一起2新建工程并选模板模板要和目标芯片、运行库匹配3建组并添加源文件按模块分组别全平铺在工程根下4设工程级选项优化等级、运行库、调试信息在这里定5检查文件级覆盖逐个文件看有没有遗留的独立设置6编译并链接先 Make异常时再 Rebuild All第 6 步的 Make 和 Rebuild All 区别要弄清。Make 只重编必要的文件这是它的设计目的但它依赖工程记录的依赖关系如果你改了头文件而工程里没记录这层依赖它就不会重编用到该头文件的源文件于是你拿着旧目标文件调试新代码。血泪经验是改过头文件、换过编译选项、动过库配置之后第一次编译一律 Rebuild All别省那几十秒。编译产物里有两类文件值得分开看编译器的输出可重定位目标和可选的汇编列表与链接器的输出可执行目标和映像文件。前者告诉你单个文件的代码生成情况后者告诉你整个程序在存储器里怎么排。查“这个函数到底被编译成什么样”看前者查“为什么 RAM 超了”看后者。3.2 .xcl 与 .ddf改哪里、别改哪里.xcl 是链接命令模板里面写的是存储器布局、段怎么分配到哪个地址区间、要包含哪些库、输出什么格式。它决定了代码和数据最终落在哪所以换芯片、改存储器型号、加 bootloader 分区动的是它。改法前面说过复制到工程目录改副本工程选项指过去。.ddf 是 C-SPY 的设备描述文件调试器靠它认识这颗芯片有哪些寄存器、存储器映射长什么样、中断向量表怎么排。绝大多数情况下不该动它——芯片在支持列表里选对型号就够了。只有在用自定义板、或者芯片型号不在列表里时才需要照着相近型号改一份出来。改 .ddf 出错的表现很有辨识度程序能下载能跑但调试器里寄存器窗口显示的值和芯片手册对不上或者中断断点永远不触发。.sfr 是特殊功能寄存器的描述文件编译器和汇编器用它把寄存器名翻译成地址。如果你在代码里写寄存器名提示未定义先确认头文件包含路径再确认这颗芯片的 .sfr 里到底有没有这个寄存器最后才怀疑写错名字。顺序反过来会浪费很多时间。提示动 .xcl 之前先把原始文件里和你相关的段命令抄到笔记里。链接报“段溢出”时第一个要对照的就是这份原始布局而不是凭记忆改。3.3 从编译日志和映像文件读链接结果手册在文件类型那一节埋了一个很实在的提醒从命令行运行链接器时映像文件默认扩展名是 lst而这个扩展名和编译器生成的汇编列表文件撞了会直接覆盖掉编译器那份。后果是隐蔽的——你以为在看某个源文件的汇编列表实际看到的是整个程序的映像或者反过来编译器的列表被悄悄冲掉回头对汇编时发现内容和源码根本对不上。解决办法不复杂把链接器的映像输出显式命名带上完整后缀比如 project1.map在 IDE 里则去链接器选项把列表输出改名别用默认值。这个小习惯救过我一次——某次排查一个段被莫名其妙放到 RAM 高地址的问题靠的就是几个月前留下的 map 文件对比出来的差异。map 文件怎么读我一般按三步先看总体占用Flash 和 RAM 各用了多少、还剩多少判断是不是已经贴着上限。再看被引入的库模块清单尤其是那些你没想到会用到的模块它们往往是体积失控的真凶。最后看段的起始地址和大小对照 .xcl 里的布局确认没有段被放到了不该去的地方。第 3 步最容易被忽略。一个段被放到错误地址程序可能照样编译链接通过甚至简单功能也能跑直到某个变量被外设的 DMA 缓冲踩掉才暴露。这种事没有 map 文件根本查不出来。4. 调试与中断仿真C-SPY 里真正省时间的三件事调试器用得好不好差距不在会不会下断点而在你知不知道断点是怎么实现的、什么时候它会骗你。手册第四到第六部分讲调试器概念和各驱动的特殊性质1.1.2 节列了总体特性其中几条在实际排错时价值极高。4.1 断点体系代码断点、数据断点、条件断点代码断点管“执行到这儿停”数据断点管“这块内存被读写时停”条件断点在前两者基础上加表达式过滤。三者背后机制不同代码断点在硬件调试器上通常要占用芯片的硬件断点资源数据断点同样如此软件断点靠改写指令实现数量不受限但要求代码在可写存储器里。MKII 驱动的规格是 4 个硬件断点加不限数量软件断点。这意味着你同时挂五个数据断点第五个大概率静默失效——不报错就是不停。我踩过这个坑当时以为是变量没被写查了两小时才发现是断点数量超了。判断方法把不相关的断点先全删只留一个如果它开始正常停了那就是数量问题。还有一个更隐蔽的优化等级高的时候源码行号和实际指令的映射会错位变量可能被完全放进寄存器你在变量窗口看到的“当前值”是个过时快照。C-SPY 支持在调试时直接改源码改动在重启后生效也支持在启动调试器之前就设好源码断点并让它跟着语句走——即使中间插入了新代码断点仍关联到原来那一段逻辑这个特性很实用。但优化带来的观察失真没法靠它解决。常见做法是维护两个构建配置一个调试构建优化关掉或调到最低用来单步和看变量一个发布构建优化全开用来测体积和时序。在发布构建里怀疑逻辑问题时先把可疑变量加 volatile 再看别对着被优化掉的变量较劲。4.2 用宏系统搭一个中断仿真环境软仿真器最有用也最少人用的功能是中断仿真。手册教程 2.5 节把它拆成四步加入中断句柄、创建仿真环境、执行中断仿真、以及在断点中配合宏使用。这四步的顺序不能乱因为仿真环境没建好之前触发中断调试器不知道向量表在哪触发了也没反应。步骤要做的事容易漏的点加入中断句柄用编译器扩展关键字声明中断函数关键字写法和普通函数不同返回和现场保护由编译器处理创建仿真环境选软仿真器驱动确认设备描述匹配目标芯片设备描述不对中断向量地址全错中断仿真用 C-SPY 宏在指定时刻置中断标志或写寄存器宏的执行时机要绑在断点上否则跑飞断点中配合宏在初始化完成处下断点绑宏模拟外设事件宏里改的寄存器要和外设行为一致C-SPY 的宏系统是这套调试器里最强的部分能定义一串复杂动作并执行可以单独用也可以和断点联合。软仿真器驱动把外围设备仿真和宏系统、直接断点绑在一起所以像“串口收到一个字节”这种事件可以靠宏去写数据寄存器加置标志位来模拟。宏的具体命令名我不在这里写死因为不同版本的下拉列表不一样硬抄容易错。稳妥的做法是打开 IDE 的宏编辑器从自带示例里复制一份改把里面的寄存器名和值换成你要模拟的外设然后挂到一个断点上。第一次跑建议只做一件事置一个标志位观察中断函数有没有进去。确认通了再往里加动作。一次写十个动作的宏出错时你根本不知道是哪一步的问题。注意软仿真器里的中断响应时序和真机不同用它验证的是“中断进没进去、现场保没保护对”不是“响应延迟多少微秒”。后者必须上硬件。中断句柄写完之后还有一件事要确认中断向量表有没有正确建立。有些工程的启动文件里向量表是弱定义你没提供句柄它就指向默认处理编译链接都不报错中断来了直接跳进死循环。查这个的办法是看 map 文件里向量表那一段的地址分布或者干脆在默认处理函数里下个断点跑一遍看它会不会被撞上。4.3 C 与汇编混合先确认调用规则再动手手册教程 2.3 节讲混合模式第一小节标题就是“检查调用规则”这个顺序是对的。C 调汇编或者汇编调 C出错的表现往往不是编译报错而是“函数返回后某个 C 变量莫名其妙变了”“参数传进去是垃圾值”本质都是调用约定没对上。调用约定要确认的项不多但每一项错了都很难查约定项要确认什么对不上时的表现参数传递哪些参数走寄存器、哪些走栈、顺序如何汇编侧读到的参数是垃圾值返回值放在哪个寄存器、多字节怎么返回C 侧拿到的返回值高位随机寄存器保护哪些寄存器由被调用方保存调用返回后 C 侧局部变量被改中断函数返回是否需要特殊返回指令中断返回后程序跑飞或堆栈失衡我的习惯是先在 C 里写一个签名相同的空壳函数编译出汇编列表照着它生成的函数序言和尾声写自己的汇编。这比翻文档快得多而且保证和当前编译器版本、当前优化等级下的实际约定一致——文档写的是规范编译器生成的是事实两者在边界情况下不一定完全一样。汇编模块加进工程时还有个小细节汇编文件的扩展名和 C 文件不同工程里要确认它被识别成汇编源文件而不是被当成别的类型。加错了的表现是链接时提示找不到符号但源文件明明在工程树里躺着。手册 2.3.2 节专门写了“在工程中添加一个汇编模块”照它走一遍能避开这类问题。5. 踩坑记录手册里没加粗、但能让你卡半天的五处下面五条都是我在实际工程里撞过的按“现象→原因→解决”写每条都能对上手册里的某一段只是原文没把它标成风险。第一条编译全过链接报一堆重复定义或找不到符号。现象是所有源文件单独编译都正常一到链接就报符号重复或未定义且报的符号看着都眼熟。原因是运行库混用了——工程里一部分模块按 DLIB 编译另一部分链接时用的是 CLIB两套库里有同名但实现不同的符号。手册里把两套库的差异写得很清楚DLIB 兼容标准 C 和 C、支持 IEEE 754 浮点CLIB 是轻型库、不完全兼容。解决方法是把工程级和文件级的运行库设置统一然后 Rebuild All别指望 Make 能自己发现这个问题。第二条断点打上去程序跑过去不停。现象是断点图标变灰或者干脆不生效程序一路跑到底。三个常见原因一是优化等级高那行代码被优化掉了或者被合并到别处映射不到实际指令二是断点数量超了硬件上限MKII 只有 4 个硬件断点超出的静默失效三是断点打在了没被链接进来的代码里比如被条件编译排除的分支。排查顺序是先删到只剩一个断点验证机制再把优化关掉验证代码最后才怀疑工程配置。第三条命令行跑一次链接编译器的汇编列表被冲掉。现象是回头对汇编时发现列表文件内容不对像是整个程序的映像而不是单个文件。原因就是手册提醒过的那条链接器的映像文件默认扩展名是 lst和编译器列表文件撞了。解决办法是给映像文件显式命名成 .map命令行和 IDE 里都要改改完把旧的 lst 删掉重新生成一次否则你分不清手里这份是新的还是被覆盖过的。第四条工程拷给别人打开满屏红色路径。现象是 .ewp 里存的是绝对路径换台机器或者换个盘符所有源文件引用全断。原因是添加文件时用了绝对路径引用而不是相对工程目录的路径。解决办法是把工程文件和源文件放在同一个目录树下引用时用相对工程目录的路径写法加文件时从工程目录往里选而不是从资源管理器里拖。这条不是手册的锅但它决定了工程能不能被别人接手。第五条数据断点看着设了变量被改时却不停。现象是明明监听了某个变量程序里它被写了好几次断点一次没触发。除了前面说的硬件断点数量问题还有个更隐蔽的原因变量被优化进了寄存器根本没有内存地址数据断点监听的是地址地址不存在自然不停。解决方法是给该变量加 volatile或者临时降优化等级重编确认变量确实落在内存里再下断点。6. 把手册用成查阅工具三张速查表和一套验证习惯这份 PDF 有几百页通读一遍记不住正确用法是当字典查。我把自己高频回查的内容整理成三张表贴在工程目录旁边比每次翻目录快。第一张按症状查章节症状先查哪链接报符号重复、未定义运行库设置、1.1.4 节的两套库说明断点不生效驱动断点规格1.1.3 节、优化等级、断点数量寄存器窗口数值不对设备描述文件 .ddf 是否匹配芯片段被放到错误地址链接命令模板 .xcl、map 文件中断进不去向量表、中断句柄声明、仿真环境是否建立工程换机器打不开工程文件里的路径写法第二张按工具查产物工具产物用途编译器可重定位目标、汇编列表看单个文件的代码生成链接器可执行目标、映像文件看整体布局和体积构成库工具库文件模块复用、裁剪调试器调试会话源码级验证第三张是每次换芯片必走一遍的检查项模板是否换成对应芯片的、设备描述是否匹配、运行库是否和代码用的特性对得上、调试驱动是否选了实际连的那台、链接后 map 里的 RAM 和 Flash 是否还在预算内。这五项里任何一项漏掉症状都不会当场出现而是在你调了两小时之后突然给你一下。验证习惯上我只强调一件事任何一次“改了配置”之后第一次编译必须 Rebuild All然后看一眼 map 文件的总体占用。这两个动作加起来不到一分钟但能挡掉绝大部分“明明改了却没生效”的玄学问题。手册里没有哪一节教你这个它是被坑出来的。从那以后我每次动 .xcl 或者切运行库都强制走一遍 Rebuild All 加 map 核对哪怕只是改了一个段名。希望帮到你。本文还有配套的精品资源点击获取