尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

IAR跨平台IDE实测:Linux下嵌入式开发与工程迁移指南

IAR跨平台IDE实测:Linux下嵌入式开发与工程迁移指南 最近IAR Embedded Workbench推出了原生跨平台IDELinux和Windows都能跑了。我第一时间装了Linux版实测这篇文章就把新版特性、安装配置、工程迁移和踩坑记录都整理出来给准备切换环境或者想在Linux下做嵌入式的朋友做个参考。先说结论这个版本不是简单套个Wine或者做个网页壳而是真正的原生跨平台支持。用Linux桌面环境直接打开旧工程、改代码、编译、烧录、调试基本可以替代Windows下的日常操作。对于我这种Windows和Linux来回切换的人来说体验好了不止一个档次。1. IAR跨平台IDE发布为什么说这是嵌入式开发的拐点1.1 过去嵌入式工具链有多“锁死”Windows嵌入式开发的老玩家应该深有体会IAR、Keil这类传统IDE一直跟Windows深度绑定。早期想在Linux下用IAR基本只有三条路装虚拟机、开双系统、或者远程桌面连Windows机器。这三条路都折腾。虚拟机方案性能损耗就不说了关键是USB调试器透传经常出问题。J-Link、ST-LINK这类调试器在虚拟机里经常掉线跑着跑着就“could not find device”查半天也不知道是USB协议冲突还是权限问题。双系统更痛苦改一行代码可能要重启切系统来回折腾一次十分钟没了。远程桌面倒是能用但延迟和画面质量在调试动画、看图表波形时非常难受而且需要一台常开的Windows机器。更要命的是服务器端的自动化构建。很多团队的CI/CD跑在Linux服务器上以前只能靠命令行工具IarBuild.exe在Linux下根本没有官方支持。大家要么搞个Windows虚拟机专门跑编译要么用Wine兼容层硬跑配置起来能把人逼疯。依赖特定库版本、路径大小写敏感、环境变量缺失任何一个环节出问题都够折腾半天。1.2 原生跨平台到底解决了什么问题这次IAR原生跨平台IDE的发布等于把上面这些痛点一次性全拔了。核心变化有三个维度。第一个IDE本体在Linux下原生运行。不需要虚拟机不需要兼容层直接在Ubuntu桌面里打开工作区、写代码、设断点、看变量所有操作跟Windows版几乎一致。调试器连接也是直连USB口没有中间商赚差价。第二个命令行工具链与IDE彻底解耦。Linux版自带完整的命令行编译、烧录、调试工具这意味着可以把IAR的编译流程直接嵌入到CI/CD流水线里。以前在Linux服务器上跑IAR编译是个老大难问题现在官方直接给了支持Jenkins、GitLab CI、GitHub Actions都能原生调用。第三个团队协作的复杂度大幅下降。以前Windows和Linux混合的团队代码仓库里经常出现环境相关的配置差异比如路径分隔符不同、换行符不同、IDE版本不同导致的工程文件冲突。现在同一套.ewp工程文件在两个平台上都能正常打开和编译协作起来顺滑多了。1.3 哪些人应该重点关注这个版本如果你是下面这几类开发者建议认真关注这个新版本做嵌入式Linux加MCU混合开发的人。这类项目经常是MCU裸机代码用IARLinux端用GCC以前两套工具链、两个环境来回切现在IAR能在Linux下跑了可以统一在Linux桌面里完成MCU侧的开发调试。需要做自动化构建和持续集成的团队。把IAR编译集成到Linux服务器上有官方路径了不再依赖Windows虚拟机或者Wine这种野路子构建效率能提升不少。经常在Windows和Linux之间切换环境的人。比如在家用Windows、在公司用Linux或者自己主力机是Linux但同事都用Windows。以前换台电脑就得重新折腾一遍环境现在两个平台共用一套工程和配置体验一致。2. 新架构与新特性跨平台不只是改个安装包2.1 编译器与IDE解耦工程文件保持兼容很多朋友以为跨平台就是把安装包换个格式重新打一下其实没有那么简单。真正的工作量在架构调整。IAR这次能做到原生跨平台关键一点是把IDE前端和编译器后端做了很好的解耦。IAR的编译器核心本来就是纯C/C写的本身具备跨平台能力以前只是没有人为它在Linux下写IDE外壳。这次的新版本相当于补上了这个缺口。更重要的一点是工程文件格式保持了兼容。.ewp工程文件底层是XML结构新版IDE在两个平台下读写同一套文件这意味着Windows下建的工程可以直接在Linux里打开不需要转换或者迁移工具。我在实测中特意试了旧版本的工程用8.x版本建的工程在新版Linux IDE里可以直接打开并编译没有报任何格式错误。这一点对存量项目非常重要意味着你不需要为了切换平台而重做工程以前的脚本、构建配置、输出路径基本都能沿用。2.2 Linux版和Windows版的功能差异虽然整体体验一致但Linux版和Windows版并不是像素级相同。我在使用中对比了一些功能差异给大家列个参考编辑器编辑、代码补全、语法高亮这些核心功能两边完全一致不分伯仲。编译器和调试器以及寄存器查看、变量监视等功能也基本一致没有明显缩水。插件生态方面Windows版的某些插件在Linux版下暂不可用特别是跟Visual Studio集成的插件因为VS本身没有Linux版。CMSIS Pack管理器在Linux下可用但界面和搜索体验略逊于Windows版。调试器驱动方面J-Link、ST-LINK、I-jet在Linux下都支持不过J-Link需要单独装Linux版驱动。如果只是做常规的MCU开发这些差异几乎感觉不到。但如果重度依赖某个Windows专用插件可能需要先在Linux版的插件市场里确认一下有没有替代品。2.3 对现有工具链选型的思考Linux跨平台IDE发布后嵌入式工具链的选型逻辑也会有一些变化。以前很多开发者在Linux下做MCU开发只能退而求其次用VS Code加GCC工具链虽然能用但总有一些别扭的地方。比如GCC的代码优化策略跟IAR不同同样的代码用GCC编译可能体积大10%到20%在Flash紧张的MCU上很要命。另外一个痛点是芯片厂商提供的底层库和例程往往是基于IAR工程格式的你用GCC的话还得自己移植工程工作量不小。现在IAR原生支持Linux相当于给Linux用户多了一个官方选项。原来的IAR用户不需要换工具链原来的GCC用户也多了一个可对比的选择。至少在我自己的项目里MCU侧还是倾向于用IAR原因很简单芯片厂商的官方库适配最好、编译优化更激进、代码体积更小、调试体验更细。现在Linux下也能用我就不用再纠结环境的问题了。3. 实操在Linux和Windows上安装配置跨平台IAR3.1 安装前准备先说清一个事实这里讲的安装方式针对的是正版授权用户和评估用户。IAR官方提供30天评估版可以直接从官网申请安装包和License都在同一个渠道管理。评估版和正式版的安装包一样区别在于License授权。你可以用评估License也可以导入正式的node-locked或浮动License。Linux版对系统有明确要求。官方比较稳妥的支持范围是64位x86架构Ubuntu 20.04和22.04这种主流LTS版本适配度最好。Debian系的可以用但相关依赖库可能要自己补齐。CentOS或RHEL系的兼容性稍微差一点但基本也能跑。我个人是用Ubuntu 22.04测的安装和运行都很顺利。硬件方面内存建议至少8GB16GB更舒适。磁盘空间的话完整安装包含所有架构支持大约需要10GB到15GB如果只装常用的Arm或RISC-V架构可以省不少空间。编译大型工程时CPU多核很重要IAR的编译器对多核并行编译支持得不错。安装包获取方式很简单在IAR官网注册一个账号选择对应的产品线和架构版本下载Linux版安装包。现在官网对跨平台版的入口做得比较清楚一般能找到对应下载页面。3.2 Linux安装步骤Linux版安装包一般是.tar.gz格式下载后用命令行解压安装。这里以Ubuntu 22.04加Arm架构为例。先进入下载目录解压安装包cd ~/Downloads tar -zxvf iar-ew-arm-linux-*.tar.gz cd iar-ew-arm-linux-*解压后通常会看到一个安装脚本或.run文件执行安装。我这边用的是安装脚本的方式sudo ./install.sh安装过程会引导你选择安装路径、配置License类型。默认安装路径一般是/opt/iarsystems/。安装完成后IAR的命令行工具和IDE就在这个目录下。安装完成后配置环境变量方便全局调用。编辑.bashrc或者.zshrcecho export PATH$PATH:/opt/iarsystems/bxarm/arm/bin:/opt/iarsystems/bxarm/common/bin ~/.bashrc source ~/.bashrc如果有具体的版本号路径需要做对应调整。配置完成后可以用命令验证安装是否正常iccarm --version看到版本信息输出就说明编译器本体OK。接下来是调试器的udev规则配置。Linux下USB设备默认权限限制很严直接插J-Link或ST-LINK会提示permission denied。需要添加udev规则。以J-Link为例创建文件/etc/udev/rules.d/99-jlink.rulesSUBSYSTEMusb, ATTR{idVendor}1366, MODE0666, GROUPplugdev然后重新加载udev规则sudo udevadm control --reload-rules sudo udevadm triggerST-LINK的Vendor ID是0483可以依葫芦画瓢加一条规则。这一步非常关键不配置的话调试器肯定连不上早点配好能省不少事。3.3 Windows安装步骤Windows版安装就传统多了下载exe安装包一路Next就行。有几点值得注意。安装时选择合适的组件。如果你只做Arm开发没必要把所有架构的编译器全部装上选对应的即可。官方安装程序会列出当前产品线支持的架构选项按需勾选。License配置在安装完成后会自动引导。node-locked License会绑定当前机器的硬件信息生成一个机器码并激活。浮动License则需要配置License服务器地址一般会自动检测环境变量LM_LICENSE_FILE如果没设置可以手动指定。Windows环境变量设置完需要重启IDE才能生效有时候重启了不一定行最保险是把电脑直接重启一次这个坑我踩过。另外建议Windows用户也确认一下命令行工具的路径。新版IAR安装后命令行工具一般位于安装目录下的arm/bin/文件夹里面有iccarm.exe和iarbuild.exe。把这个路径加入系统PATH后面做脚本编译会方便很多。3.4 配置License管理License这块单独拿出来说因为这是很多人在Linux下最容易卡住的地方。Linux版IAR支持两种License模式。一种是节点锁定的绑定当前机器的MAC地址或硬盘序列号单机使用最简单。在IDE里选择License类型生成机器码将机器码发给官方或导入License文件即可。另一种是浮动的适用于多台机器共用有限数量的License席位。需要设置License服务器地址和端口比如2100license-server-ip。浮动License配置时客户端机器需要能访问到服务器的2100端口。这里常见问题是防火墙阻挡。我在配置时就遇到过服务器明明正常运行但客户端连不上的情况排查半天发现是防火墙规则没有放行TCP 2100端口。测试License连接状况可以使用命令行工具lmutil lmstat -a -c 2100your-server-ip如果能正常输出服务器状态信息就说明网络通、License服务正常。这个命令既快又直观比在IDE里反复试错高效得多。3.5 创建第一个跨平台工程安装配置好之后接下来走一遍创建工程的完整流程。打开IAR IDE点击File - New - Workspace先建一个工作区相当于Visual Studio的Solution。然后Workspace菜单下选Create New Project在弹窗里选好芯片型号。选芯片型号时可以直接搜索比如输入STM32F103C8T6IDE会自动匹配对应芯片并配置好基础的链接脚本和启动文件。如果没有自动匹配到需要手动检查是否已经安装对应的芯片支持包这个可以在IDE的Pack Manager里添加。工程创建好后main.c已经帮你生成了一个基本模板。在main函数里写点简单的代码比如点个LED或操作串口。写完直接点Download and Debug按钮如果芯片连接正常应该能直接进入调试界面看到左下角寄存器值在实时刷新。这里补充一个我在Linux版上观察到的小差异在Windows版里新建工程时某些出厂模板比如带RTOS的模板可能更完整Linux版的初始模板相对精简。不过常用功能都有问题不大。如果你习惯用旧版Windows上的工程模板可以考虑直接在Linux里打开旧工程而不需要重新创建。4. 工程迁移与日常使用实战4.1 Windows工程如何在Linux下打开把Windows上已有的IAR工程搬到Linux下操作比想象中简单。因为.eww工作区和.ewp工程都是纯文本XML格式理论上两个平台是通用的。实际操作时直接把整个工程目录从Windows拷贝到Linux下或者在git仓库里切换到Linux分支。然后在Linux IDE里选择File - Open Workspace打开对应的.eww文件即可。这里有几个容易踩的坑需要提醒。第三方库的路径问题。Windows下路径习惯用反斜杠Linux用正斜杠。大多数情况下IAR会自动转换路径格式但如果工程里用了绝对路径引用外部库比如D:\libs\mylib在Linux下就会报找不到文件。解决办法是检查工程的预处理设置里Include路径把绝对路径改为相对路径或者在Linux下重新指定正确的库路径。编译输出目录问题。旧工程如果指定了C:\project\Debug这样的输出路径在Linux下同样不可用。建议改用相对路径比如.\Debug这样两个平台都能正常输出。我的建议是把工程里的输出路径改成相对路径再入库这样团队协作和跨平台切换都方便得多。换行符问题。Windows用CRLFLinux用LF。IAR工程文件是XMLIDE会自动处理换行符一般不会有问题。但如果用git管理工程文件建议在.gitattributes里设置*.ewp text eollf统一行尾风格避免每次切换平台都出现大量diff。中文编码问题。Windows上IAR默认可能用GBK或ANSI编码打开源码文件Linux下默认UTF-8。如果你的代码注释里用了中文在Linux下打开可能显示乱码。解决办法是在IAR的编辑器设置中调整文件编码或者在IDE打开文件时手动选择编码。更稳妥的做法是统一源码文件编码为UTF-8一劳永逸。4.2 命令行构建与CI/CD集成跨平台版带来的一个重大利好是Linux服务器上终于可以原生跑IAR编译了。这在以前想都不敢想。IAR的命令行构建工具是iarbuild。用法比较简单iarbuild your_project.ewp -build Debug可以指定配置名比如Debug或Release。构建完成后会输出编译日志和生成文件路径。这里注意Linux下调用iarbuild时工程文件路径需要使用正斜杠或者正确的转义。实际项目中我把IAR的编译步骤集成到了GitLab CI里。大概的流水线配置思路是在.gitlab-ci.yml里定义一个编译任务runner使用装有IAR Linux版的机器或容器。在构建阶段调用iarbuild编译编译成功后将固件文件作为artifact上传。后续的烧录、测试阶段直接拉取固件文件执行。这样一个典型的CI流水线就是stages: - build - test build-firmware: stage: build script: - iarbuild firmware.ewp -build Release artifacts: paths: - Release/Exe/firmware.bin run-tests: stage: test script: - ./test_flash.py Release/Exe/firmware.bin这样每次代码push后服务器自动编译固件并跑自动化测试不需要人工干预也不用Windows虚拟机。整个流程非常干净。除了CI集成命令行工具还能写一些批量编译脚本。比如同时编译多个工程for proj in ./*.ewp; do echo Building $proj iarbuild $proj -build Release done这个在release发布前特别有用一条命令把整个产品线所有固件全部编一遍。4.3 调试器配置与调试技巧日常开发中调试器连接是使用频次最高的环节之一。Linux下调试器配置有几个细节需要注意。J-Link驱动需要单独安装。IAR IDE自带的调试器驱动在Windows下是开箱即用的但Linux下需要先安装SEGGER的Linux版驱动。我一般去SEGGER官网下载Linux版J-Link软件包安装后确认/opt/SEGGER/JLink目录存在IAR就能自动识别到J-Link。ST-LINK在Linux下的支持也比较完善。IAR新版对ST-LINK的原生支持在Linux下可以用。不过注意需要安装libusb相关依赖否则设备识别不到。如果你的发行版缺少libusb可以用apt安装libusb-1.0-0-dev。调试器连接不上时先用系统命令确认设备是否被识别lsusb如果能看到对应的Vendor ID说明USB层是通的。然后检查udev权限规则是否正确再确认IAR的调试器设置里选的是正确的接口类型SWD还是JTAG。另外一个小技巧在Linux下调试时如果发现Flash下载报错可以先尝试在Project - Options - Debugger里把下载模式的擦除方式改成“Erase sectors”而不是“Full chip erase”。这个不是跨平台导致的问题但我在两个平台切换时更容易遇到缓存不一致导致的下载失败全片擦除有时能解决有时不如按扇区擦除稳定。Flash下载还有个常见坑如果调试器驱动版本跟IAR版本不匹配可能导致连接不稳定。我的做法是尽量保持IAR自动更新驱动发现问题时优先更新调试器驱动而不是调整IDE配置。5. 常见问题与排查技巧实录5.1 问题速查表实际使用中遇到各种奇怪问题把比较典型的整理一个速查表方便大家直接对照排查。问题可能原因解决办法Linux下调试器连接失败提示权限不足udev规则未配置添加对应Vendor ID的udev规则并重新加载Linux下License连接不上许可证服务器端口未放行检查2100端口TCP连通性和防火墙打开旧工程报错工程文件路径为Windows绝对路径改为相对路径或重新指定路径源码中文注释乱码文件编码不一致统一源码编码为UTF-8并在IDE中设置编译报找不到头文件Include路径未适配Linux修改预处理设置的Include路径J-Link连接不稳定频繁掉线USB线材或供电不足换优质USB线并使用独立供电的USB HUB命令行编译报找不到工具PATH环境变量未配置检查PATH是否包含IAR的bin目录用iarbuild编译时提示License错误浮动License环境变量未生效确认LM_LICENSE_FILE设置正确并重启终端5.2 两个典型的排查过程第一个是许可证排查。有次我在Linux服务器上配好IAR后IDE能起来但一编译就报License错误。看了下提示发现是“cannot connect to license server”但服务器IP和端口都是对的服务器上的lmstat也显示正常。最后定位到问题是服务器的防火墙把2100端口默认拒绝了放行之后立刻正常。这类问题最迷惑的地方是表面症状是License问题实际是网络问题。排查思路是先确认服务器上服务状态再确认客户端网络连通性最后检查防火墙。第二个是调试器权限问题。J-Link在Linux下插上后lsusb能看到但IDE里报“cannot access J-Link device”。这个基本就是udev规则没生效。我当时排查时确认规则文件存在重新reload后还是不行最后发现是plugdev组里没有当前用户把用户加入plugdev组再重新登录后就解决了。这个细节容易忽略光有udev规则不够当前用户还得有访问权限。5.3 从旧版本升级的注意事项如果你是从Windows版的IAR 8.x升级到新的跨平台版有几个注意事项。旧工程的迁移基本上可以直接打开但首次打开时IDE会提示更新工程格式。一般点确认即可工程文件会自动升级到新版本格式。升级后如果团队成员还用旧版建议协调一下统一版本避免格式冲突。编译器版本的差异必须留意。新版的编译器和旧版在优化行为上有细微差异这可能导致相同代码编译出的固件大小或运行性能有变化。在大版本升级后建议做一次完整的回归测试特别是对时序敏感或对代码大小敏感的裸机项目。还有一个容易忽略的问题是新版IDE默认使用“High”优化等级但你的旧工程可能因为历史原因使用了“Low”或“None”。升级后如果发现程序行为异常先检查一下编译优化选项是否被动过。我遇到过一次旧工程在Windows上用的是None优化升级到新版后在Linux上默认变成了High结果一段依赖副作用的代码执行顺序乱了排查了很久才发现是优化等级问题。最后再分享一点个人经验我在把这个跨平台版作为主力开发环境用了几周之后一个深刻的感受是嵌入式工具链的现在和过去真的完全不一样了。以前总觉得Windows才是开发的“正规军”Linux只是服务器上的配角。但现在IAR原生支持Linux之后整个软件开发流程可以完全在Linux下闭环代码编辑、编译构建、烧录调试、自动化测试全都运行在同一套系统上。个人建议可以这样试一下如果你手头有闲置的Windows工程先拷贝一份到Linux的IAR里试试打开和编译不用急着全面切换先跑通流程。等确认一切正常后再考虑把日常开发环境整体迁移到Linux。遇到问题的话多看IDE的日志输出IAR的日志信息其实很详细只是平时没人注意。这个跨平台版我目前遇到的比较影响体验的槽点有两个一是Linux版的一些快捷键跟Windows版略有不同一开始会按错二是Linux版的启动速度比Windows版稍微慢一点但我用的机器配置一般如果是新机器应该没这个问题。除此之外主要的开发流程都很顺畅。以后嵌入式开发大概率是越来越跨平台的趋势命令行化、容器化、云构建这些理念会逐步渗透进来。IAR这一步走得算及时的大家可以早做尝鲜。
返回列表