ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

IAR原生Linux版实操指南:安装、调试与CI集成

IAR原生Linux版实操指南:安装、调试与CI集成 我最近把个人主力开发环境切到了 Linux原本以为最头疼的 IAR 会成为拦路虎结果发现官方早就把原生跨平台 IDE 安排上了。如果我没记错的话从 9.60 这个版本开始IAR Embedded Workbench for Arm 正式提供 Linux 原生版本Windows 和 Linux 共用同一套编译器、同一个工程体系编译出来的产物也完全一致。对很多被虚拟机方案折磨多年的嵌入式开发党来说这算是个盼了挺久的正经答案。这篇内容不是发布会复述而是我这段时间从安装激活、工程迁移、调试器配置到 CI 集成把 Linux 版 IAR 完整用了一圈后的实操梳理。无论你是个人想把环境切到 Linux还是团队服务器上需要跑 IAR 构建又或者只是好奇这套所谓原生跨平台 IDE 到底靠谱不靠谱下面这些内容应该都能让你少踩几个坑。1. IAR 为什么非要做原生 Linux 版1.1 被虚拟机方案折磨过的 Linux 党嵌入式工程师里用 Linux 当主力系统的人其实不少。做驱动、写裸机代码、搞 RTOS很多同学习惯在 Linux 下用 GCC 工具链搭开发环境调试器用 OpenOCD、命令行烧录一套流程行云流水。但问题是很多项目甲方点名要用 IAR厂商提供的工程模板、底层库、示例代码都是 IAR 的遇到这种情况就由不得你选了。以前想在 Linux 下用 IAR主流的解决方案无非是开一台 Windows 虚拟机或者用 Wine 硬跑再不行就在服务器上单独维护一台 Windows 构建机。这几条路我都走过各有各的痛。虚拟机的第一个痛点是 USB 透传。MCU 调试器 J-Link、ST-Link 之类的设备在虚拟机里经常动不动就掉线。尤其是调试低功耗设备或者需要长时间跑稳定性测试的时候调试器断连一次整个晚上的数据就白采了。第二个痛点是许可证。IAR 的老许可证机制对网卡 MAC 和机器信息很敏感虚拟机里的虚拟网卡、虚拟机之间迁移都可能导致许可证失效又得重新激活。第三个痛点是构建效率共享目录里跑大工程编译IO 开销高得离谱Windows 虚拟机里编一个中型工程比物理机慢三成起步。Wine 方案就更不靠谱了IDE 能装上但调试器驱动在 Wine 下基本处于薛定谔的可用状态运气好能连上运气不好连设备都识别不到折腾一天的收益趋近于零。1.2 原生方案比其他方案好在哪IAR 官方做原生 Linux 版本质上是把这套工具链彻底搬到了 Linux 上不再依赖任何模拟层和兼容层。对嵌入式开发来说原生方案、虚拟机方案、兼容层方案之间的差别非常大用一张表可以看得很清楚对比项原生跨平台 IDEWindows 虚拟机Wine / 容器方案编译性能原生进程性能无损有虚拟化损耗IO 瓶颈明显兼容层有额外损耗USB 调试器连接直连稳定依赖 hypervisor 透传易断连基本不可靠许可证管理正常节点绑定/浮动虚拟机内激活迁移麻烦不稳定维护成本低升级简单还要维护 Windows 镜像中随缘适合场景日常开发、调试、CI临时应急尝试性使用重点说说 USB 调试器这是原生方案最核心的价值。IDE 跑在 Linux 上调试器通过 Linux 的 USB 子系统直接访问J-Link、ST-Link、CMSIS-DAP 这些设备在 Linux 下的支持都很成熟配合上 udev 规则把权限放开调试体验和 Windows 下基本没有差别。另外还有一点很实际很多团队的服务端跑的是 Linux以前为了 IAR 构建必须养一台 Windows 构建机现在直接在同一条 Linux CI 流水线上把 IAR 构建跑起来运维成本能砍掉一大截。1.3 跨平台版本的产品边界先给个实话实说的产品边界。目前 IAR 原生跨平台版本主要覆盖 Arm 内核产品线也就是 Embedded Workbench for Arm包括 Cortex-M 全系列以及各家基于 Arm 的 MCUSTM32、GD32、NXP、瑞萨这些主流芯片都在支持范围内。8051、AVR 这类老内核的工具链官方暂时还没有对应的 Linux 原生版本还在用 IAR for 8051 做项目的同学可能得继续等后续消息或者继续保留 Windows 环境。工程体系方面Windows 版和 Linux 版的工程文件是同一套格式.eww工作区文件、.ewp工程文件可以直接互相打开。也就是说你在 Windows 上建好的工程拷到 Linux 里用原生 IDE 打开基本是无缝的。这一点对团队协作非常关键不同成员用不同操作系统共享同一个工程仓库不会再出现你换个系统就编不了的尴尬。2. 从下载到激活先把手上的环境跑通2.1 Windows 侧升级与老工程兼容虽然标题是跨平台但很多人的实际路径是 Windows 已经有 IAR 了想着要不要切到 Linux。这时候我建议先把 Windows 侧也升级到和 Linux 侧匹配的新版本避免两个平台的 IDE 版本差异过大。Windows 侧升级其实没什么难度从官网下载最新安装包覆盖安装即可。唯一要注意的是老工程首次打开时新版本 IDE 会提示把工程格式升级到新版本这个提示通常不能跳过。这里有一个非常实际的建议工程格式升级前先把工程用 Git 提交一次或者打一个备份。因为工程格式一旦升级旧版本的 IAR 就打不开这个工程了。如果项目时间紧或者同事还在用旧版本这个操作可以帮你留条后路。另外新版 IDE 的界面和 8.x 时代差别挺大的第一次打开旧工程别被完全不同的界面吓到。工程选项、编译按钮、调试面板这些核心功能都在但位置和叫法变化不小后面有一节我会专门说界面适应的问题。2.2 Linux 下安装步骤与发行版适配Linux 版的安装包在官网下载页就能拿到。以 Ubuntu/Debian 系为例官方会提供对应的脚本或安装包下载下来之后在终端里操作。整个流程其实比很多开源工具还简单# 假设你下载的是安装脚本 chmod x iar_install.sh sudo ./iar_install.sh安装脚本会帮你把工具链、IDE、License Manager 都装到指定目录。如果你的发行版缺少某些图形库依赖安装脚本一般会提示按提示把对应依赖装上就行。我试过的几个常见发行版基本都是开箱即用个别精简版系统需要补一下 libx11、libusb 这类基础库。装完之后不需要用 sudo 启动 IDE。这一点特别重要千万别用 root 权限去运行日常开发工具否则后续打开的工程、生成的构建产物、中间文件全部变成 root 所有普通用户模式下改起来一堆权限问题非常麻烦。启动方式很简单桌面应用菜单里能找到 IAR 的图标也可以在终端里直接执行安装目录下的启动脚本。首次启动会引导你激活许可证所以接下来就是许可证的事了。2.3 许可证激活与加密狗驱动IAR 的许可证机制和很多商业软件类似常见的有三种模式本机节点锁定许可证、浮动网络许可证、以及 USB 加密狗。Linux 版和 Windows 版在这点上没有本质区别安装 IDE 的同时把 License Manager 装好然后在里面完成激活动作。如果你是加密狗用户Windows 下最常见的加密狗驱动安装失败问题Linux 下反而更简单——大多数主流加密狗在 Linux 下不需要额外驱动只要系统能识别到 USB 设备License Manager 就能读出来。Windows 下加密狗驱动装不上我遇到过的原因和解决办法基本是这几类现象常见原因处理方式设备管理器里有未知设备驱动没装成功重装 License Manager确认驱动签名加密狗插上无反应USB 口供电不足换到主板后置 USB 口避开 USB Hub驱动安装过程中报错安全软件拦截临时退出安全软件装完再开系统无法识别设备驱动数字签名过期检查系统更新或换一台机器交叉验证这里多提一句加密狗本身就是许可证载体使用习惯上建议单独保管、别热插拔太频繁。加密狗在 Linux 下的权限问题我会在最后一个章节详细讲那个坑更隐蔽。3. 真正把工程在 Linux 下跑起来3.1 新建工程并安装芯片 PACK安装激活完成之后先试新建一个工程跑通全流程。打开 Linux 版 IDE新建工程时会让你选择目标芯片型号。如果你是常见型号比如 STM32F103、STM32F407、GD32F303 这些芯片列表里就能直接搜到。如果找不到你手上这颗料的型号多半是因为没装对应的 Device Pack。以 GD32 为例这就是热榜上怎么下 gd32 的 pack 包那个问题的典型场景。GD32 的 pack 包在厂商官网能下载到拿到手是一个.pack文件。在 IAR 的 IDE 里通过菜单导入 Pack 文件或者直接双击.pack文件IDE 就能自动解析安装。Pack 装好之后新建工程选型时就能找到对应的芯片了。工程创建后IDE 会自动生成启动文件、链接脚本这些基础组件不需要手动拷贝。相比老版本手动加文件的方式新版省事很多。工程创建完顺手检查一下几个关键选项C/C Compiler 里的优化等级、预处理宏定义、以及 Linker 配置里的链接脚本路径。这些和 Windows 版完全一样只要熟悉其中一边另一边基本零学习成本。3.2 从 Windows 迁移旧工程的三件事从 Windows 把旧工程搬到 Linux最直接的做法是把整个工程目录拷贝到 Linux 下然后直接打开.eww工作区文件。绝大多数情况下就能直接编译。但有几个额外的坑都是我实际踩过的提前说清楚能省很多时间。第一个坑是大小写敏感。Windows 文件系统不区分大小写Linux 区分。如果你的代码里#include Config.h但工程目录里实际文件名是config.h在 Windows 下编译器睁一只眼闭一只眼就过了到了 Linux 下直接报找不到文件。工程文件越多这种问题越隐蔽有时候要编译到很深层的文件才能暴露出来。迁移后如果报Cannot open source file第一反应就去检查路径里的文件名大小写是否和实际文件一致。第二个坑是路径分隔符。老工程里如果手动写过带反斜杠的路径或者某些配置文件里写死了\dir\file在 Linux 下都会出问题。最好的办法是在 IDE 工程选项里把所有路径改成相对路径用正斜杠然后确认工程用到的外部库、中间文件目录都在工程目录内部。第三个坑是换个平台编译器的路径变了。IAR 的工程选项里有编译器和工具链的路径配置Windows 下装在C:\Program Files\IAR Systems\...Linux 下安装路径完全不同。打开工程时如果 IDE 提示找不到工具链到 Options - General Options 里重新指定一下安装目录即可。如果团队的工程用 Git 管理建议在仓库根目录放一个.gitattributes强制统一换行符* textauto eollf *.ewp text eollf *.eww text eollf这样 Windows 和 Linux 两边检出工程文件时都是 LF 换行避免 Git 每次都觉得文件有改动也让跨平台 diff 干净很多。3.3 调试器连接与烧录配置工程能编译之后接着就是把程序烧进板子这一步在 Linux 下和 Windows 下差异最大问题也最多。调试器方面J-Link、ST-Link、CMSIS-DAP 这些主流调试器在 Linux 下都有成熟驱动IAR 原生版本可以直接调用。IDE 里进入 Project - Options - Debugger选择对应的调试器再进入对应调试器的标签页配置接口类型SWD 还是 JTAG和速度基本就完成了。真正会让新手卡住的是权限问题。Linux 对 USB 设备的访问权限控制比较严格默认情况下普通用户访问调试器可能会被拒绝。最典型的表现是 IDE 连接调试器时提示权限不足或者根本没有设备列出来。解决办法是配置 udev 规则把调试器设备开放给普通用户。先插上调试器然后用lsusb查看设备的 Vendor ID和 Product ID$ lsusb Bus 001 Device 003: ID 1366:0101 SEGGER J-Link以 J-Link 为例1366就是 SEGGER 的 Vendor ID。创建一个 udev 规则文件sudo vim /etc/udev/rules.d/99-jlink.rules内容如下SUBSYSTEMusb, ATTR{idVendor}1366, MODE0666, GROUPplugdev保存后重新加载规则再重新插拔调试器sudo udevadm control --reload-rules sudo udevadm triggerST-Link 的 Vendor ID 是0483按同样方式写一条规则就行。其他调试器比如 CMSIS-DAP 出品的各种调试器用lsusb查到具体 ID 后照葫芦画瓢就行。规则配好之后在 IDE 里启动调试会话断点、单步、变量观察、寄存器窗口这些基础功能体验和 Windows 下差别不大。Flash 下载也正常只要工程选项里把 flash loader 配置好点一下下载就能烧进去。我第一次在 Linux 下成功连上板子的时候说实话松了一口气——调试器这条链路通了这套东西才算真正能用。4. 多人和 CI 环境下的跨平台实践4.1 命令行编译CI 也能跑 IAR跨平台 IDE 出来之后很多团队第一时间想的是把 IAR 构建接入 Linux CI 流水线。这确实是个大需求以前只能专门维护一台 Windows 构建机现在 Linux 节点直接就能编。IAR 在 Linux 下同样提供命令行构建工具iarbuild位置在安装目录的 bin 目录下。用法和 Windows 下的IarBuild.exe基本一致/path/to/iarbuild project.ewp -build Debug -parallel 4-build Debug指定构建配置-parallel 4是并行编译线程数这个参数在大工程上非常有用机器核心够多的话编译时间能明显缩短。构建完的产物默认输出在Debug/Exe/目录下。CI 环境里的典型做法是用 GitLab CI 或 Jenkins 的 Linux 自托管 Runner拉取代码后直接执行 iarbuild 命令。整个过程不需要图形界面就是一个典型的命令行构建任务build: script: - /opt/iar/bin/iarbuild firmware.ewp -build Release -parallel 8 artifacts: paths: - Release/Exe/*.hex这里有个前置条件CI 节点上必须装好 IAR 且完成许可证激活。构建机上一般是装浮动许可证这样多个 CI 节点可以共享同一个 License Server避免每个节点都要单独激活。如果在激活环节卡住CI 构建日志里会直接给出许可证相关错误。IAR 的静态分析工具 C-STAT 也支持命令行方式执行适合在 CI 里每天跑一次静态检查比让开发人手动点按钮靠谱得多。我们团队实际迁移了一部分构建任务到 Linux 节点之后最大的感受是环境管理变得简单了Linux 节点的镜像可以快速生成、批量复制不像 Windows 构建机还要单独打快照、备份系统运维负担轻很多。4.2 工程文件版本管理与协作规范IAR 的工程文件本质上是 XML这意味着.ewp和.eww可以被 Git 正常 diff代码评审时能直接看到工程配置的改动。这对多人协作很有价值。但在混合平台上协作需要建立一些习惯和约束。我自己整理了几条实操中特别管用的规范规范项具体要求为什么必须这样做路径一律相对化工程里不用绝对路径两台机器安装路径不同绝对路径必炸统一换行符用 .gitattributes 强制 LF避免 Git 无意义的全文件 diff文件名大小写一致include 路径和文件名严格匹配Linux 下大小写不匹配直接编译失败避免中文和特殊字符文件名、路径里不用空格和中文跨平台兼容性差易出编码问题工具链版本统一团队内尽量用同一 IAR 主版本工具链版本差异可能导致编译结果不同有一次同事在 Windows 上建了一个名为Main_Test的文件另一个平台在代码里写成main_testWindows 上一切正常Linux 上一编译就报错。排查了半天才发现是大小写问题。这种事在混合平台团队里几乎是必然遇到的提前定好规范能少很多扯皮。4.3 新版界面变化与快捷键适应新版 IAR IDE 的界面相比老版本变化很大这一点不管在 Windows 还是 Linux 上都是这样。老用户从 8.x 升过来第一反应往往是我的菜单栏去哪了。就菜单栏消失这个问题我归纳了几个常见原因和解决办法第一种情况是误拖拽导致工具栏被移出可视区域。新版本 IDE 的界面布局支持高度定制拖动标题栏时不小心把整个工具栏拖到屏幕外看起来就像菜单栏消失了。解决办法是按一下Alt键菜单通常会被临时唤出然后在 View 菜单里找 Toolbars 相关的恢复选项重新勾选需要的工具栏。第二种情况是布局文件损坏。IAR 会把窗口布局保存到用户配置目录布局文件损坏后界面可能变得非常奇怪。这种时候最快的方式是恢复默认布局一般在 Window 菜单下有 Layouts - Reset 之类的选项或者删除用户配置目录下的布局文件重启 IDE 让它重新生成。第三种情况比较偏门和显卡驱动有关。特别是在 Linux 下某些开源显卡驱动对界面绘制的支持不完善可能导致界面元素渲染异常、菜单栏不显示。遇到这种问题先更新显卡驱动试试不行就在 IDE 启动参数里强制用软件渲染往往能解决。快捷键方面Linux 版和 Windows 版的默认快捷键基本一致常用的 F7 编译、CtrlD 下载、CtrlShiftD 调试这些都没有变。需要注意的反而是系统层面的冲突比如 Linux 桌面环境的输入法切换快捷键可能会和 IDE 的某些快捷键冲突影响到代码编辑时的输入法状态。我一般会把 IDE 的快捷键配置统一检查一遍把冲突项改掉。5. 实测问题排查Linux 下常见坑5.1 USB 调试器权限不足这个问题我前面已经提过因为太典型单独拎出来再强调一下。现象是 IDE 连接调试器时提示权限不足或者设备列表里空白但lsusb能查到设备。原因基本就是 udev 规则没配或者规则配置后没有重载。排查流程按顺序来# 1. 确认系统能看到设备 lsusb # 2. 查看内核日志确认设备有没有被拒绝 dmesg | tail -50 # 3. 查看当前设备权限 ls -l /dev/bus/usb/001/003如果发现设备权限是crw-rw----且所属组不是你的用户组那就是权限不够。按前面 3.3 节的方法配 udev 规则再重载即可。这个坑之所以隐蔽是因为很多人只装好了 IAR没意识到还要单独给 USB 设备开权限以为 IDE 没法用。只要规则配好基本就再也不会碰上。5.2 编译报错与路径问题从 Windows 迁过来的工程在 Linux 下编译报错最常见的是头文件找不到。错误信息类似Fatal Error[Pe1696]: Cannot open source file ..\..\lib\config.h这种报错九成是路径问题。要么是路径分隔符用了反斜杠要么是大小写不匹配。检查路径时把报错信息里的路径拿到工程里对一下重点看目录层级和文件名大小写。还有一种情况是工程引用了外部库或者 SDK这些外部依赖在 Windows 下安装在系统盘目录迁到 Linux 后路径完全不成立。解决办法是把外部依赖放进工程目录内部然后全部改用相对路径引用。如果哪个文件在 Windows 下编译正常但 Linux 下报奇怪的语法错误先检查文件编码。Windows 下某些编辑器保存的文件可能是 GB2312 或带 BOM 的 UTF-8Linux 的 GCC 系工具链一般默认按 UTF-8 处理中文注释和字符串就可能出问题。IAR 的编译器对这块比较宽容但依然建议统一成 UTF-8 无 BOM 格式。5.3 许可证报错与加密狗识别许可证相关的坑不少我把实际遇到过的整理成一张速查表现象可能原因处理方式启动 IDE 提示 No license foundLicense Manager 未启动或未激活启动 License Manager检查激活状态License checkout failed浮动许可证数量被占满等空闲节点释放或增加许可证数量加密狗插上但识别不到udev 权限未配置用 lsusb 查 ID写对应 udev 规则激活页面打开失败License Manager 服务异常重启 License Manager 服务检查端口占用CI 节点上编译报许可证错误节点未配置浮动许可证地址在节点上指定 License Server 地址特别说一下加密狗在 Linux 下的权限问题。前面 udev 规则配置那一节不仅适用于调试器加密狗同样适用。插上加密狗后先用lsusb确认设备存在如果设备存在但 IAR 还是没有许可证就去查 License Manager 的日志看它是没读到设备还是激活信息有问题。Windows 下如果加密狗驱动安装失败换成 Linux 环境反而可能更顺利因为多数加密狗不需要手动装驱动系统自动识别。这也是很多同学在 Linux 下意外发现加密狗莫名其妙就正常工作的原因。5.4 资源占用和多核编译实测感受最后聊点日常体验。我把自己手头一个中等规模的工程分别在 Windows 和 Linux 下编译对比了一下编译时间基本持平Linux 下内存占用略微友好一点。两者差距不大但 Linux 下开多个工程窗口时的整体流畅度我觉得更好。如果编译速度不理想几个立竿见影的做法# 并行编译参数拉满比如 8 核机器用 -parallel 8 /path/to/iarbuild project.ewp -build Debug -parallel 8 # 把构建目录放到内存盘可选IO 敏感型工程有收益 sudo mount -t tmpfs -o size4G tmpfs /path/to/build_dir第2条不建议日常使用毕竟内存盘数据断电即失更适合跑 CI 临时构建。普通场景下直接把并行度调高编译效率已经够好了。还有一个个人偏好日常写代码用 IDE批量构建尽量用命令行iarbuild。命令行方式不吃 GUI 资源跑完就走特别适合每天下班前自动构建一次、顺便出个报告的场景。我个人的体会是IAR 原生 Linux 版已经可以胜任日常开发和 CI 构建的大部分场景。如果你以前在 Linux 下靠虚拟机勉强维护 IAR 工程现在确实到了可以认真考虑迁移的时候。最后补一句实在的动手前先在备用机器或者虚拟机里跑一次完整流程从安装到烧录调试都过一遍确认你的调试器和加密狗在 Linux 下全部正常再正式切换主力环境这样最稳妥。
返回列表