简介这份PDF是IAR Systems官方发布的IAR Embedded Workbench IDE中文用户手册面向基于Atmel AVR微处理器进行嵌入式开发的工程师与初学者帮助其系统掌握该IDE的项目管理、编译、调试与仿真流程。资源包内仅含1个PDF文件大小约859KB内容按「产品介绍」与「教程」两大部分组织前者逐一讲解嵌入式IDE、C-SPY调试器及其系统、C/C编译器、汇编器、XLINK连接器以及XAR库创建器与XLIB库管理器等组件后者从新建工程、编译连接入手延伸至C-SPY调试、C与汇编混合模式、C应用及中断模拟等实践环节。目前已有3388人学习下载适合作为日常查阅的工具书也可配合实际工程边做边查快速理清工具链各环节的职责与配置思路。1. 拿到一份 IAR 中文手册先别急着翻目录嵌入式这行有个挺反直觉的现象很多人装了 IAR Embedded Workbench菜单点得比谁都熟可真到工程编译报错、链接脚本对不上、C-SPY 调试器连不上目标板的时候还是得回头翻那份几百页的 PDF。我见过不少做 AVR 的同行IDE 用了两三年*.xcl连接器命令文件长什么样都没打开看过直到某天程序跑飞、map 文件里段地址全乱才意识到手册里早就把目录结构和文件类型讲清楚了。这份《IAR 中文用户手册-官方版.pdf》就是干这个用的。它面向基于 AVR 微处理器的 IAR Embedded Workbench IDE从产品组成、已安装文件的目录结构一路讲到建工程、编译链接、C-SPY 调试、C 与汇编混合、C 工程、中断仿真、库模块使用。说白了它不是教你 C 语言的是教你把这套工具链的每个零件摸清楚的。适合两类人刚接手 AVR 项目、对着 IDE 一脸茫然的新手以及用了很久但一直靠试错、想系统补齐工具链认知的老手。下面我按自己拆这类手册的习惯把它落到能复现的步骤上。2. 先认清工具链的七个零件从工程到可执行文件到底经过了谁手册第一部分把 IAR Embedded Workbench 拆成了编译器、汇编器、连接器、库工具、调试器几大块这个划分不是摆设它直接决定了你排错时该看哪个窗口、哪个文件。很多人编译失败就盯着源代码看其实问题可能出在 XLINK 的段定位或者库模块没被拉进来。先把这条流水线走一遍后面建工程才不会瞎点。2.1 编译、汇编、链接三段式与各自的产物AVR IAR C/C 编译器负责把.c/.cpp变成可重定位的目标文件汇编器处理.s/.asm两者输出的是 UBROF 格式的中间目标文件最后由 IAR XLINK 连接器把它们和库模块拼成能下载到芯片里的可执行文件。手册里特别提到 XLINK 能识别三十多种工业标准格式还支持只把连接时真正用到的库模块拉进来这就是为什么你写了个printf但没用浮点最终镜像不会无脑膨胀。理解这条链的意义在于编译错误看编译器输出链接错误看 XLINK 的报错下载和运行问题才轮到 C-SPY。我一般会在工程选项里把 “Generate linker map file” 打开链接完先扫一眼 map确认代码段、数据段、堆栈的落点符合预期再谈调试。手册 1.2.2 那张文件类型表值得单独记一下.ewp是工程文件、.eww是工作区、.xcl是连接器命令模板、.ddf是 C-SPY 设备描述文件、.sfr是特殊功能寄存器描述认全这些扩展名你在工程目录里翻东西的速度会完全不一样。2.2 目录结构决定了你去哪找配置和库手册 1.2.1 把安装目录讲得很细Avr\bin放 AVR 专用可执行文件Avr\config放连接器命令模板、SFR 描述、C-SPY 设备描述和语法着色配置Avr\inc是标准库和寄存器头文件Avr\lib是预编译库Avr\src有可配置库的源码和示例Common\bin则是 XLINK、XLIB、XAR 这些跨架构共享工具。这套结构你得心里有数因为改连接器配置、换设备描述文件、查库源码全在这几个目录里转。举个实际场景新板子换了颗 AVRC-SPY 下载时报设备不匹配八成是Avr\config下没有对应型号的.ddf或者工程里选的器件和实际芯片对不上。再比如你想裁剪 DLIB 库省空间源码就在Avr\src改完重新编库比在黑盒里猜靠谱得多。手册还提醒了一句ini和dni文件是工具运行时同步生成的放在工程目录的settings子目录里里面存的是工程配置别手贱删删了等于把工程选项重置。2.3 两套运行库怎么选DLIB 与 CLIB 的取舍手册 1.1.4 明确写了两套运行库IAR DLIB 支持 ISO/ANSI C 和 C带 IEEE 754 浮点、多字节参数IAR CLIB 是轻型库不完全兼容 ISO/ANSI C也不支持 IEEE 754 和 C。这个选择不是审美问题是资源问题。AVR 这类 8 位机 RAM 常常只有几 KB你要是用了 DLIB 又开了浮点格式化输出链接完 map 一看数据段爆了别怪编译器。我的习惯是纯 C、不用浮点、RAM 紧张的小工程直接上 CLIB一旦要用 C、STL、浮点运算或者标准库里的重函数老老实实 DLIB然后去Avr\src看能不能裁剪。手册提到两套库的源代码都随产品附带这点很关键意味着你能看到printf到底吃了多少栈而不是靠猜。选库这个动作在工程选项的 General Options 里就能改改完记得全量重编增量编译有时候不会把库切换干净这是血泪经验。3. 照着教程建第一个工程新建、编译、链接的完整动作手册第二部分是教程从创建一个应用工程讲到编译连接。这部分看着基础但恰恰是新手翻车最密集的地方——工程模板选错、器件型号没对上、输出格式选错导致下载不了。我把它拆成可抄的步骤每一步说清楚在哪个菜单、改哪个选项、产物落在哪。3.1 新建工程的选项含义与器件选择在 IDE 里Project Create New Project会弹出一堆模板空工程、带main的 C 工程、汇编工程、库工程都有。新手最容易犯的错是随手选个模板就开写结果器件型号是默认的编译能过下载到板子上跑飞。正确顺序是先建空工程或 C 模板然后立刻进Project Options General Options在 Target 页把 Device 选成你板子上那颗具体型号。# 工程目录里典型的文件布局建完工程后你会看到 MyProject/ ├── MyProject.ewp # 工程文件存编译/链接选项 ├── MyProject.eww # 工作区文件可挂多个工程 ├── settings/ # 工具运行时生成的 ini/dni 配置 │ └── MyProject.dni └── main.c上面这个布局不是让你手动创建是让你建完工程后对照着认。.ewp是纯文本的出问题时可以直接打开看选项到底存成了什么比在 GUI 里反复点更高效。器件选对之后Avr\config下对应的.ddf和.sfr才会被正确引用C-SPY 调试时寄存器窗口才能显示出有意义的名称而不是一串地址。3.2 编译与链接看懂 Build 窗口的每一行Project Rebuild All之后Build 窗口会依次打印编译每个源文件、汇编、链接的过程。手册 2.1.2 讲应用程序编译和连接重点其实在“什么时候会重新编译”——IDE 的 Make 功能只在必要时才重编、重汇编、重链接靠的是文件时间戳和依赖关系。这意味着你改了头文件但没触发重编八成是依赖没被正确记录这时候别犹豫直接 Rebuild All。链接阶段如果报Error[Lp011]之类的段溢出说明代码或数据放不下了去 map 文件里找哪个段最大。常见原因是 DLIB 的堆设置过大或者某个大数组被放进了 RAM。手册里 XLINK 的段命令segment command就是干这个的.xcl文件里能看到-Z(DATA)、-Z(CODE)这类定义改之前先备份改完对比 map 里的地址变化这是定位内存问题的标准动作。/* main.c —— 最小可编译骨架用来验证工具链是否打通 */ #include ioavr.h /* 器件寄存器定义随器件选择自动匹配 */ void main(void) { /* 关看门狗避免仿真时反复复位干扰调试 */ __disable_interrupt(); while (1) { /* 空转先确认能编译、能下载、能停在这 */ } }这段代码的价值不在功能在于验证三件事头文件路径对不对、器件寄存器定义能不能找到、链接后能不能生成可下载的镜像。ioavr.h是 IAR 针对 AVR 提供的器件头具体包含哪个寄存器取决于你在 General Options 里选的 Device。如果编译报找不到某个寄存器先回去查器件型号别急着改代码。跑通这个骨架再往里加外设驱动出问题的时候你至少知道工具链本身是好的。3.3 输出格式与下载前的检查项链接输出格式在Project Options Linker Output里选常见的是 Intel HEX 和 UBROF。下载到芯片或仿真器格式得和你的下载工具、调试驱动匹配。手册提到 XLINK 输出是否包含调试信息取决于所选格式这点很实在你要用 C-SPY 做源码级调试输出里就必须带调试信息否则只能看反汇编。下载前我固定检查三样器件型号、输出格式、C-SPY 驱动选的是软仿真还是硬件ICE200 / JTAGICE / JTAGICE MKII。这三样任何一样不对现象都是“下载失败”或“下载成功但跑不起来”而报错信息往往指向别处容易带偏。手册 1.1.3 把各驱动的能力列得很清楚比如 JTAGICE MKII 支持 4 个硬件断点加不限数量软件断点ICE200 断点数量不限但不支持代码和数据覆盖选驱动前先看你手头有什么硬件、需要什么调试能力。4. C-SPY 调试与混合编程断点、调用栈和汇编模块怎么配合调试是这份手册里信息密度最高的部分。C-SPY 不只是一个断点工具它的调用栈、变量监控、宏系统、中断仿真配合 AVR 的片上调试能力能解决很多“逻辑看着对但就是不对”的问题。这一章把调试动作和混合编程放在一起讲因为实际项目里这两件事经常同时发生——C 调汇编、汇编回调 C断点打在哪、栈怎么变得一起看。4.1 断点类型与调用栈的读法手册 1.1.2 把断点分成代码断点和数据断点代码断点验证逻辑数据断点看数据何时被改。C-SPY 还支持给断点加条件这在查“某个变量第 N 次变成某值”时特别省事。我一般先在可疑函数入口打代码断点单步到变量赋值处再换成数据断点盯住那块内存两步下来基本能锁定是谁动的手。调用栈窗口是另一个被低估的东西。AVR IAR 编译器会生成扩展的函数调用信息C-SPY 能在程序计数器停在任何位置时显示完整调用栈你可以在栈里点选任意一帧看那一层的局部变量和寄存器。查递归爆栈、查中断里调了不该调的函数全靠这个。注意软仿真驱动是纯软件模拟处理器指令级仿真加中断模拟没有硬件也能调逻辑硬件驱动则依赖真实芯片断点资源受器件限制JTAGICE MKII 那 4 个硬件断点用完了就得靠软件断点补。4.2 在工程里加汇编模块并检查调用规则手册 2.3 讲 C 与汇编混合模式先检查调用规则再往工程里加汇编模块。调用规则这事不能想当然C 编译器传参用哪些寄存器、返回值放哪、哪些寄存器由被调用方保存这些在 AVR IAR C/C 编译器参考手册里有明确约定混编前必须对齐否则现象就是“汇编函数单独测没问题一被 C 调就错”。; delay_asm.s —— 一个被 C 调用的简单延时演示调用约定 NAME delay_asm PUBLIC delay_asm_loop RSEG CODE:CODE:NOROOT(0) delay_asm_loop: ; 入参由 C 侧按约定传入这里只做循环递减 SUB R16, R1 BRNE delay_asm_loop RET END这段汇编的关键不在延时本身在于PUBLIC导出符号、RSEG指定代码段、RET返回三者和 C 侧的声明必须对得上。C 里用extern void delay_asm_loop(void);声明后调用链接时 XLINK 才能把符号接上。参数传递如果涉及多个寄存器务必回去翻调用规则那一节别靠试。加汇编模块的另一个坑是段名CODE:CODE:NOROOT(0)里的 NOROOT 表示这个段不被自动回收写错了可能被链接器当无用代码删掉现象是“符号未定义”其实代码在只是被丢了。4.3 中断仿真与断点宏的组合用法手册 2.5 讲模拟一个中断步骤是加入中断句柄、创建仿真环境、做中断仿真最后讲中断和断点中宏的使用。软仿真驱动支持中断模拟意味着你没有硬件也能验证中断服务程序进没进、进得对不对。做法是在 C-SPY 的仿真环境里配置中断触发配合断点宏在中断发生时自动执行一串动作比如打印变量、改寄存器、继续运行。这套组合在调时序相关问题时很有用中断进得太频繁导致主循环饿死或者中断里改了共享变量但没做保护都可以用断点宏在中断入口记录现场跑一段时间后回看记录。宏系统是 C-SPY 的内置能力能定义复杂动作和条件断点联合使用等于给调试器写了个小脚本。新手容易忽略这块觉得调试就是单步其实把断点宏用起来很多偶发问题能变成可复现的记录。5. 避坑与排查这几处翻车点我踩过不止一次手册是官方写的讲的是“应该怎样”但实际用起来“实际怎样”和“应该怎样”之间隔着一堆细节。下面几条是我和周围同行反复遇到的按现象、原因、解决写你对号入座就行。5.1 现象编译通过下载后程序不跑原因通常是器件型号和实际芯片不一致或者 C-SPY 驱动选错。IDE 里选的 Device 决定了寄存器定义和链接配置选错型号编译照样过因为语法没错但生成的机器码针对的是另一颗芯片。解决进 General Options 核对 Device再进 Debugger 选项核对驱动是软仿真还是对应硬件两处都对齐后 Rebuild All 再下载。5.2 现象链接报段溢出但代码明明不大原因多半是运行库选错或堆栈设置过大。DLIB 带浮点和完整标准库比 CLIB 大不少工程里如果无意中开了浮点格式化数据段会明显膨胀。解决先看 map 文件里哪个段最大再回 General Options 或 Linker 选项检查库选择和堆栈大小能换 CLIB 就换不能换就去Avr\src裁库。5.3 现象改了头文件编译却没重新编原因是 IDE 的 Make 依赖判断没捕捉到头文件变化或者工程文件里的依赖记录过期。解决直接 Rebuild All别在增量编译上纠结。如果频繁出现检查头文件包含路径是不是写成了绝对路径换机器或换目录后路径失效依赖自然就断了。5.4 现象C 调汇编函数运行结果莫名其妙原因是调用约定没对齐参数寄存器、返回值位置、被调用方保存的寄存器三者任一错位都会出问题。解决对照编译器参考手册的调用规则逐项核先用一个只传单参数、无返回值的函数验证通路再逐步加复杂度。另外确认汇编模块的段名和PUBLIC导出没写错符号没接上时链接器报的是未定义不是语法错。5.5 现象C-SPY 连不上目标板原因是驱动、连接方式、目标板供电三者之一有问题。JTAGICE 走串口JTAGICE MKII 可走串口或 USB接口选错就连不上目标板没供电或复位被拉低同样连不上。解决先确认硬件连接和供电再在 Debugger 选项里核对接口类型和端口号最后看Avr\config下有没有对应器件的.ddf。这一步建议按顺序来跳步容易在错误的方向上浪费时间。6. 把手册当查询工具我的索引习惯与一个验证技巧这份手册七百多页通读不现实当查询工具用才划算。我的习惯是先在 PDF 里按扩展名搜遇到.xcl问题搜 “xcl”遇到.ddf搜 “ddf”遇到 map 文件搜 “map” 或 “映象”基本都能定位到 1.2 节的文件类型说明和对应工具章节。第二个习惯是按报错码搜XLINK 的报错前缀是Lp、Le之类把报错码连同 “XLINK” 一起搜比搜整句报错信息准得多。再给一个验证技巧用来确认你手里的手册版本和实际 IDE 对得上打开Avr\doc目录看readme.htm的日期和内容手册 1.2.3 明确建议先读 readme 获取最新信息因为用户手册可能滞后。然后随便建一个空工程编译一次把 Build 窗口的输出和手册教程章节的描述对一遍如果菜单名、选项名有出入说明手册对应的是稍早的版本遇到对不上的地方以实际 IDE 为准别硬套。你要查的东西手册里的位置实际文件在哪连接器命令模板1.2.1 目录结构Avr\config\*.xcl器件描述与寄存器1.1.3、1.2.1Avr\config\*.ddf、*.sfr库源码与示例1.1.4、1.2.1Avr\src、Avr\lib调试驱动能力对比1.1.3对应 Debugger 选项页文件扩展名含义1.2.2 文件类型表工程目录与安装目录这张表是我自己贴在工位上的查东西先看它能省掉大量翻目录的时间。手册的价值不在于从头读到尾而在于你遇到具体问题时知道往哪一页翻、翻到之后能对上实际文件。从那以后我每次接手一个新工具链都强制走一遍“建最小工程、编译、看 map、下载、打断点”这条链路跑通了再谈业务代码跑不通就先查工具链本身。这份 IAR 中文手册就是这条链路的说明书把它放在手边比在网上搜零散帖子靠谱。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?