做嵌入式开发这些年,IAR Embedded Workbench for ARM 几乎是从单片机入门到产品落地绕不开的一套工具链。最近不少朋友在装 IAR 9.20.4 这一版,遇到最多的就是安装完成后 License 报错、老工程打不开、FreeRTOS 移植时编译器不认某些语法这类问题。我把自己从下载、安装、注册激活到实际建工程跑 FreeRTOS 的完整过程整理了一遍,把踩过的坑和排查思路一并写出来,给正在折腾这个版本的同学一个可以直接“抄作业”的参考。
这套 9.20.4 是较新的版本,界面还是熟悉的风格,但底层编译器、调试器和器件支持包都有不少更新。它对 STM32F1、STM32F4 这些主流型号支持很成熟,编译优化和静态检查也更强,适合从 Keil 转过来体验一下,也适合公司项目正式切换。无论你是刚接触 IAR 的新手,还是被许可证问题折磨的老手,这篇内容都能帮上忙。
1. 准备工作与安装流程拆解
1.1 下载前先确认版本与资源
IAR 的版本号很好认,比如 9.20.4 这种格式,主版本 9,后续的 20.4 是功能更新和修复。下载前建议确认一下自己手里的安装包是EWARM-CD-9204-开头的完整版,还是某个单独的增量补丁。很多人在网上找到的资源是残缺的,装到一半提示缺少组件,其实就是安装包不完整。
我实际用的安装包大约 1GB 多,里面包含了完整的 IDE、编译器、调试器驱动、器件支持包和文档。下载下来后建议先校验一下文件大小,或者解压后看一眼目录结构,setup.exe或者IAREWARM.exe这类主安装程序在就基本没问题。另外注意,IAR 官网下载需要注册账号,但流程不复杂,填个邮箱就能拿到下载链接,这个渠道最干净,优先推荐。
运行环境方面,IAR 9.20.4 在 Windows 10 和 Windows 11 上都能正常跑,Win7 的老电脑可能有些驱动装不上,建议提前升级系统。磁盘空间留出 5GB 左右比较稳妥,因为除了 IDE 本身,后续还要装各种器件支持包,C 盘空间紧张的话最好装到 D 盘。
1.2 安装全流程记录
安装第一步是关闭杀毒软件和 Windows Defender 的实时防护,这个不是玄学。IAR 的调试器驱动和许可证管理器会写注册表、装驱动,杀毒软件经常误拦,导致安装完成但驱动是坏的,后面连不上调试器才来排查就晚了。
双击安装程序后,语言选择界面直接选简体中文,虽然 IDE 界面默认还是英文为主,但部分安装步骤用中文看起来更直观。接着是组件选择界面,这里有几个关键选项:
- IAR Embedded Workbench:主程序,必选
- J-Link 驱动:如果你用 Segger 的调试器,这里会一并装上,不用单独装 J-Link 软件
- 器件支持包(Device Support Pack):建议全选,或者至少勾选你常用的 ST、NXP、TI 等厂商系列,后面新建工程时找不到芯片型号多半是这里没装全
- C-SPY 调试器组件:默认勾选,别去掉
安装路径上我建议不要带中文和空格,D:\IAR Systems\这种结构最省心。虽然 IAR 现在对中文路径的支持好了很多,但后续如果你用 Makefile 或者脚本编译,路径里有中文和空格还是容易出幺蛾子。安装到 80% 左右会弹出来驱动安装的提示,这时候要耐心等,不要点取消,驱动装不好后面调试器识别不了,还得回来重装。
2. 注册与许可证激活的核心细节
2.1 拿到许可证的几种正规方式
IAR 的“注册”和网上那些通用软件的注册码不是一个概念,它走的是许可证(License)体系。正规拿到许可证的方式主要就是三种:官方评估版、企业正版许可证、以及一些芯片厂商合作提供的特殊授权。
对于个人学习和评估,最直接的是在 IAR 官网申请评估版许可证,一般是 30 天全功能试用。申请流程很简单,注册账号后在 Licensing 页面选择 Request Evaluation License,填上主机 MAC 地址就行。这里有一点要特别注意:IAR 的许可证是绑定主机信息的,申请时填的是哪台电脑的 MAC,获得的 .lic 文件就只能在这台电脑上用,换了电脑就得重新申请。
企业正版许可证一般是公司 IT 统一购买的,通常也是 node-locked(锁节点)的形式,会发一个 .lic 文件。拿到后通过 IAR License Manager 手动导入即可。如果你在公司网络里,IAR 也支持 floating license,装在服务器上供多人共用,这种情况需要配置 License Server 地址,但个人开发基本用不到。
2.2 IAR License Manager 导入与激活实操
许可证安装本身不复杂,但很多人第一步就找错了地方。记住,IAR 的许可证管理不是从 IDE 菜单里打开的,而是独立的程序,一般在开始菜单里找IAR License Manager,或者在安装目录下找LicenseManager.exe。
打开后的界面很简洁,菜单栏选License->License Info,能看到当前主机信息和现有许可证状态。导入新许可证时选License->Import License,然后选择 .lic 文件路径,导入成功后会显示许可证类型、有效期和绑定主机信息。
如果公司给你的不是 .lic 文件,而是一串 License ID 或者激活码,就在同一个界面选择输入激活码的方式。导入完成后,建议重启一下 IAR License Manager 确认状态显示为有效,再去打开 IAR IDE。我习惯装完许可证后顺便看一眼系统时间,这个后面会详细说,时间不对是所有许可证校验失败的万恶之源。
3. 典型问题与排查方案整理
3.1 Fatal Error[LMS001]: License check failed 的完整排查
这个问题是被问得最多的,几乎可以排在所有 IAR 报错的第一名。报错的完整提示一般是:
Fatal Error[LMS001]: License check failed. Use the IAR License Manager to re...看到这个错误,先别急着重装软件。按照我下面的顺序排查,大部分情况都能解决:
第一步:检查系统时间。IAR 的许可证校验机制对时间非常敏感,系统时间如果被改到许可证有效期之外,哪怕只差一天,也会报 LMS001。先确认系统时间和当前实际时间是否一致,包括时区也要核对。这个原因占比非常高,尤其是那些用老电脑装新系统的开发机,时间同步经常出问题。
第二步:确认许可证文件是否过期。用 IAR License Manager 打开许可证信息,查看有效期。评估版一般只有 30 天,过期后就会报这个错,需要重新申请。
第三步:检查许可证绑定信息。如果你换了网卡、换了主板,MAC 地址变化后原许可证就会失效。这种只能联系发许可证的人重新生成,或者走官方 rebind 流程。
第四步:杀毒软件干扰。部分安全软件会把 IAR 的许可证校验进程当作可疑程序拦截,导致校验请求发不出去。排查这个可以在安装时临时关闭安全软件,或者把 IAR 安装目录加入白名单。
我处理过的一台电脑比较典型,用户装的是旧版许可证管理器和新的 IDE 混用,导入新许可证时提示成功,但编译时依然报 LMS001。后来把所有 IAR 相关程序卸载干净,删掉C:\Program Files (x86)\IAR Systems残留目录,重装后再导许可证,问题才消失。所以如果上述检查都正常,考虑彻底清理后重装,不要图省事做覆盖安装。
3.2 老版本工程打开异常与编译不兼容
从旧版 IAR 升级到 9.20.4 后,打开老工程时经常遇到两件事:一是提示工程文件版本过旧,二是编译报一堆类型不兼容的错。
工程文件版本问题很好解决,IAR 在打开.ewp文件时会提示是否转换,选是就行。但我要提醒大家,转换后的工程不要覆盖原文件保存,最好另存一份副本。原因是有时候你的同事还在用老版本,你升级后会生成新格式的工程文件,他们那边就打不开了。团队协作时这个习惯非常重要,我在公司里就因为这个吃过亏。
编译报错主要集中在旧代码的语法规范上。9.20.4 内置的编译器对 C 标准的支持更严格了,尤其是 C11 的一些特性、类型隐式转换警告等。比如老代码里常见的uint8_t value = 0; if (value == NULL)这种写法,在严格模式下可能直接报指针和整数比较的错误。这不算编译器问题,是代码本身不够严谨,9.20.4 只是把这些隐藏问题暴露出来了。
3.3 FreeRTOS 移植中的典型编译错误
有一位关键词里提到 FreeRTOS 从 Keil 往 IAR 移植踩坑,这确实是一个高频场景。Keil 和 IAR 的编译器对 C 语言扩展的支持有差异,最典型的就是段定义和堆栈设置的语法。
比如这段代码,是 FreeRTOS 在 IAR 下配置堆区的常见写法:
uint8_t ucheap[ configTOTAL_HEAP_SIZE ] __attribute__((section(".heap")));在 IAR 中,__attribute__((section()))这个 GCC 风格写法是不被识别的。IAR 自己的段定义语法是:
uint8_t ucheap[ configTOTAL_HEAP_SIZE ] __section(".heap");而 Keil 的 MDK 用的是__attribute__((section("HEAP")))或者__attribute__((at(address)))。所以从 Keil 移植过来,这段代码是必改项。如果 source 里portable目录选对了 IAR 版本,一般heap_4.c之类的是独立的,不会碰这个问题,但自己写的或者从别处抄来的内存管理代码就很容易踩雷。
另外在 IAR 的启动文件里,堆栈大小也是通过段定义的:
HEAP_SIZE EQU 0x400 section HEAP align(4)C 代码里引用堆区变量时,要用#pragma section结合__segment_begin、__segment_end来获取段地址。如果移植不顺利,多检查这些段定义有没有被正确映射到链接配置(.icf 文件)里。
3.4 调试器连接不上与驱动问题
装完 IAR 9.20.4,代码也能编译了,但点击下载时报错连不上调试器,这种问题也出现得很频繁。主要分三种情况:
驱动没装好。如果设备管理器里能看到调试器设备但带黄色感叹号,说明驱动有问题。J-Link 用户可以在 IAR 里重新装一下驱动,或者去 Segger 官网装最新版的 J-Link 软件,注意装的时候选择兼容 IAR 的选项。
固件版本不匹配。IAR 9.20.4 对调试器的固件版本有最低要求,如果是好几年前的老 J-Link,插上后可能会提示固件过旧需要升级。升级固件一般 1 分钟就能完成,但注意升级过程中别拔线,否则容易变砖。
接口设置错误。在工程的 Debugger 设置里,要确认选择的调试接口是 SWD 还是 JTAG,以及时钟频率是不是设得太高。我用 ST-Link 调试 STM32F103C8T6 时,遇到过接口正确但速度设太快导致连接不稳定的情况,降到 1MHz 之后编程和调试都正常了。
4. 9.20.4 新工程实战:从配置到运行
4.1 新建工程与芯片选择
打开 IAR 后,依次选择Project->Create New Project,弹出的模板对话框里选Empty project,工具链保持默认的 ARM 即可。新建工程后第一件事是配置全局选项,快捷键是Alt+F7,在 General Options 里选择目标芯片。
芯片选择这块,IAR 的界面和 Keil 的 Device 选择类似,但有些细节不同。在Device下拉框里找到ST->STM32F1->STM32F103C8即可。如果列表里找不到,回去检查器件支持包装没装全。我在 9.20.4 上遇到过一个问题:新版把器件列表做了分组,ST下面默认只显示STM32F3、STM32F4这些系列,STM32F1需要展开Legacy分类才能看到,不少人在这一步卡住,直接以为自己没装支持包。
芯片选好之后,还需要在Linker里选择正确的链接配置文件(.icf)。IAR 会根据芯片自动带出对应的.icf文件路径,一般不用手动改。如果想调整 Flash 和 RAM 的大小,直接改.icf文件里的define symbol __ICFEDIT_region_ROM_start__这些参数即可。
4.2 FreeRTOS 移植完整过程还原
以 STM32F103C8T6 为例,把 FreeRTOS 在 IAR 9.20.4 下的移植步骤整体还原一遍。我用的 FreeRTOS 版本是较新的 V10.x,官方源码结构本来就清晰,但 IAR 工程需要手动把源文件加进来。
先在工程目录下建几个文件夹:Source放 FreeRTOS 核心源码,Portable放与编译器相关的移植层,Config放FreeRTOSConfig.h配置文件。
关键是要把以下文件加进工程:
Source/tasks.cSource/list.cSource/queue.cSource/timers.cSource/event_groups.cSource/stream_buffer.cSource/portable/MemMang/heap_4.cSource/portable/IAR/ARM_CM3/port.c(针对 Cortex-M3,STM32F103 属于这个)
加文件时注意,portable目录下有很多不同平台的子目录,一定要选IAR和ARM_CM3这个组合,选错的话会出现大量编译错误。在初始化基础部分,port.c文件中会用到PendSV_Handler、SVC_Handler等中断处理函数,所以你的stm32f1xx_it.c里如果也定义了同名的中断函数,要把它去掉,否则链接时会报重复定义。
FreeRTOSConfig.h在 IAR 下有几个宏需要特别注意。首先是configTOTAL_HEAP_SIZE,这个决定 FreeRTOS 管理的堆大小,在 STM32F103C8T6 这种只有 20KB RAM 的芯片上,我一般设 8~10KB,留足剩余空间给任务栈。另一个是configUSE_IDLE_HOOK、configUSE_TICK_HOOK,如果置 1,需要实现vApplicationIdleHook和vApplicationTickHook函数,不想实现就置 0。
编译链接期间,如果报__section(".heap")相关的错误,就回到 3.3 节说的那段语法检查一下。如果报找不到system_stm32f1xx.c或启动文件相关符号,说明启动文件没配好,需要把 CMSIS 里的startup_stm32f103xb.s和system_stm32f1xx.c也加进工程。启动文件里默认的堆大小定义是Heap_Size EQU 0x200,如果要用malloc或者 FreeRTOS 的某些功能,建议改成0x400,甚至更大。
调试时打开View->Breakpoints和View->FreeRTOS,IAR 的 C-SPY 对 FreeRTOS 有原生支持,可以直接查看任务列表、信号量、队列等内核对象的状态。这是 IAR 比 Keil 好用很多的一个地方,调试任务切换问题时特别直观,不用自己打印日志去猜。
4.3 优化选项与编译策略选择
IAR 的优化选项默认是None,产品代码发布时一般会调到High或者Balanced。在C/C++ Compiler->Optimizations里,有几个级别和策略可以选择。常见的组合是Size优先或者Speed优先,两者的代码体积和执行速度会有明显差异。
我个人的经验是:调试阶段用None,方便单步追踪;功能稳定后用High+Balanced,兼顾体积和性能。需要注意,优化级别开高后,有些变量在 Watch 窗口里会显示被优化掉,这时候可以把那个文件单独设置成低优化,或者用volatile修饰关键变量,避免排查问题时一脸懵。
还有一个很实用的功能,在Compiler选项里把Enable static stack usage analysis勾上,链接时能输出每个函数的最大栈占用估算。配合 FreeRTOS 配置任务栈大小时很有参考价值,能减少栈溢出问题。当然这只是静态估算,动态的栈使用情况最好配合调试器的栈监测功能观察。
5. 资源获取与版本选择的建议
5.1 评估版申请与官方学习资源
很多人不知道 IAR 官网其实提供了很全的文档和官方示例工程,这是比到处找安装包更值得花时间的资源。在 IAR 官网的 Download 页面注册后,不仅能下载到最新版本,还能获取到各个版本的历史安装包和器件支持包。对学习阶段的开发者,申请 30 天评估版完全够用,而且流程正规,省心放心。
下载后我建议把官方提供的IAR-EWARM-...-Doc文档包也下下来,里面有几份值得反复翻阅的文件:IDE 用户指南、编译器参考手册、链接器和库参考指南。虽然英文文档看着累,但查语法和链接错误时比搜索引擎靠谱得多。
5.2 9.20.4 相比旧版本的实际改善
我从 IAR 8.x 时代用过来,9.20.4 最明显的感受是编译速度和静态分析能力提升了。打开大工程时索引不卡了,编译错误提示也更准确,CLI 模式(命令行编译)对自动化构建的支持更友好了,方便接入 CI 流程。
还有一个细节,9.20.4 的 C-SPY 调试器增加了不少脚本接口,支持用 Python 写调试脚本,这对做自动化测试的人来说方便了很多。如果你是团队项目,建议把构建配置从 GUI 迁移到命令行脚本,这样能保证每个人、每台机器上的编译结果一致,避免出现“在我电脑上能编译”的这种问题。
6. 使用经验和工具链搭配心得
6.1 项目中常用的辅助工具配置
IAR 作为主 IDE,日常开发还离不开几个配套工具。一个是版本管理工具,我一般用 Git,配合.gitignore忽略settings目录和Debug、Release目录,只跟踪源码、.ewp工程文件和链接配置文件。这样团队协作时不会因为每个人的本地配置不同而频繁冲突。
代码格式化方面,如果觉得 IAR 内置的代码风格不够顺眼,可以结合外部格式器统一风格,调用方式是在Tools->Configure Tools里添加外部程序,命令行参数填$(FILE_PATH)即可把当前文件传进去。实测下来对多人协作的统一代码风格帮助很大。
6.2 代码编译产物与烧录文件生成
在工程发布阶段,需要生成 hex 文件给产线烧录。IAR 里在Project->Options->Output Converter里勾选Generate additional output,格式选择Intel extended hex,编译后就会在你设置的输出目录生成.hex文件。如果要生成 bin 格式,格式选binary即可。
烧录方面,不想用 IAR 的下载功能时,可以直接用 J-Flash 或者 STM32CubeProgrammer 烧录生成的 hex 文件。两者的配合方法是:IAR 负责编译和调试,产线烧录用独立的烧录工具,避免产线电脑上都装完整 IDE。这个流程在很多项目里是标配。
6.3 给新手的避坑清单
最后把这几年用 IAR 遇到的坑集中列一下,权当给新手的底色。首先是安装路径和用户目录千万别带中文,不然插件、脚本和部分老库文件都可能报路径异常,这个坑排查起来非常费时。其次是许可证管理器状态要养成习惯性的检查,编译异常报 LMS001 时先看它,比自己瞎猜快得多。第三是FreeRTOSConfig.h里的configASSERT在开发阶段一定要开启,能帮你提前暴露栈溢出和非法调用;发布前再关掉以减小代码体积。再就是.icf文件好比 IAR 的程序“地图”,堆栈、堆、Flash 和 SRAM 的布局全靠它管理,想深度定制内存分配一定要学会读懂它,实在不行再学着自己改。
我自己在实际操作中的体会是,9.20.4 这一代整体稳定性已经相当高了,只要装机流程正规,许可证导入正确,工程配置不出低级错误,日常开发基本不会遇到特别难缠的问题。真到了排查疑难杂症的时候,反过来从最基本的“系统时间对不对、许可证有没有过期、杀毒软件拦没拦、驱动装没装全”这四件事查起,成功率其实是最高的。希望这篇记录能帮你把安装注册这一步走得顺一些,把更多精力留给真正值得琢磨的业务代码和调试思路。