ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

IAR新增原生跨平台IDE,Linux下也能完整开发嵌入式

IAR新增原生跨平台IDE,Linux下也能完整开发嵌入式 在嵌入式圈子里IAR算是陪伴了很多年的老朋友。以前聊起IAR Embedded Workbench几乎默认就是Windows下的工具Linux工程师想用IAR要么开虚拟机要么远程连一台Windows机器要么忍着命令行用Build Tools做编译。所以这次IAR平台新增原生跨平台IDE同时支持Linux与Windows对我来说确实是个好消息。毕竟桌面端能直接打开完整的IDE图形界面能建工程、能在线调试而不是只跑编译脚本这体验完全不一样。这篇文章就围绕这个新变化展开结合我这段时间在Windows和Linux两台机器上的实际使用情况聊聊这个原生跨平台IDE到底是什么、怎么安装、怎么上手做工程以及会遇到哪些坑。适合正在评估要不要迁移到Linux开发的嵌入式工程师也适合团队里打算把构建环境从Windows逐步切换到Linux、但又不想放弃IAR编译工具链的朋友参考。1. 项目背景与需求场景为什么IAR要补上Linux这块拼图1.1 从Windows单平台到跨平台的转变过去IAR Embedded Workbench在MCU开发中扮演的角色很大程度上绑定了Windows。工业控制、汽车电子、物联网设备很多量产项目的源码和工程文件都是IAR格式的开发者也习惯在Windows下点一点鼠标就把程序下载到板子里。这种模式运行了很多年稳定可靠也没有人觉得必须改变。但最近几年嵌入式开发环境开始明显分化了。越来越多团队引入了Linux作为日常开发系统原因很多代码服务器是Linux的CI/CD流水线是Linux的开源工具链和脚本生态在Linux下更顺手甚至不少开发板厂商提供的SDK示例也默认支持Linux环境。这时候IAR如果还只提供Windows图形界面Linux用户就只能望洋兴叹了。这次新增的原生跨平台IDE本质上就是把原本只能在Windows上完整体验的IAR开发环境移植到了Linux桌面环境。同一个工程文件Windows下打开是IDELinux下打开也是IDE编译、调试、下载这些核心环节都能在两个系统里跑通。对于团队协作来说少了“你那边能编译为什么我这边不行”这类环境问题。1.2 真实场景痛点我自己的项目组就是个典型的混合环境日常编码三名同事用Windows两名用Linux服务器是Ubuntu。以前每次需要联调Linux同事都得在Windows机器上装TeamViewer或者远程桌面操作体验非常差。尤其调试FPU浮点性能问题的时候远程桌面延迟严重鼠标定位都费劲更别说盯寄存器变化了。CI那边也很麻烦。固件构建任务跑在Windows Server虚拟机上每次更新镜像、打补丁都消耗大量时间构建机一旦重启IAR许可证服务还得手动检查。如果IAR能原生跑在Linux上整个CI环境就能直接容器化清理和重建构建环境会轻松很多。另外还有一个很大的痛点嵌入式项目往往需要修改芯片启动代码和链接脚本这些文件在Windows和Linux之间来回拷贝容易因为行尾符、路径分隔符、文件权限之类的问题产生麻烦。跨平台IDE配合Git统一管理工程文件大家至少能在同一套构建体系里工作差异感会减少很多。1.3 跨平台IDE并不是“换壳”这里要澄清一点很多人以为Linux版本的IAR就是给Windows版本套了个兼容层其实不是。IAR Build Tools for Linux早就有但它只是命令行编译工具链主要给CI或者脚本用没有图形界面也基本没法做在线调试。这次的原生跨平台IDE是完整的图形应用包含编辑器、工程管理器、编译输出窗口、调试器视图你原来在Windows上怎么操作在Linux上基本也是同样的操作习惯。而且从启动速度和资源占用来看它是为Linux原生编译的不是Wine模拟出来的。老Windows虚拟机方案在Linux主机上跑IAR每次启动IDE都要等虚拟机起来吃好几个G内存原生版直接本地运行轻快得多。2. 核心细节解析安装、环境准备与系统适配2.1 Windows安装与老版本衔接先在Windows上说说安装流程因为很多团队是现有Windows环境可能正用着IAR 7.x或8.x的老版本。新版原生跨平台IDE在Windows上安装并不复杂从官网下载安装包后按向导下一步即可。安装时建议把组件看清楚IDE主程序、调试器驱动、设备Pack支持这些按需勾选。老版本升级是个值得注意的环节。我建议升级前先备份整个工作区尤其是.eww工作区文件和.ewp工程文件。旧版工程第一次用新版打开时IDE一般会提示进行格式迁移通常会自动生成备份文件。这个机制很实用万一新格式有问题还能回到旧版本继续改。另外启动新版IDE后我习惯先到Tools菜单里检查License状态。因为升级后许可证如果没激活IDE会进入评估模式功能和编译时间都受限。公司如果用的是多用户浮动License还要确认License服务器地址配置是否正确否则团队其他人会把许可占满你就连不上。2.2 Linux安装原生IDE的完整流程Linux下的安装过程比想象中顺利。官方提供了常见发行版的安装包Ubuntu/Debian系可以用.deb包RHEL/Fedora系有.rpm包也有.tar.gz通用包。我这里以Ubuntu 22.04为例演示一下。从官网下载对应的.deb安装包后在终端执行sudo dpkg -i iar-ew-arm-xxx.deb执行过程中如果提示依赖缺失不要慌接着运行sudo apt-get -f install它会自动把缺的依赖库补上。这种处理方式在Ubuntu下很常见dpkg负责安装主包apt-get负责解决依赖问题。如果用的是.tar.gz通用包解压到/opt目录下再手动把可执行文件软链到/usr/local/bin这样终端里直接输命令就能启动IDE。装完之后最常遇到的是启动失败大概率是缺少图形库依赖。排查方法很简单先找到IDE的启动可执行文件用ldd命令看缺少哪些库ldd /opt/iar/.../bin/ide | grep not found常见缺的库有libxcb-xinerama0、libxkbcommon-x11-0、libgtk-3-0这些装上就好。有一个细节非常关键就是调试器的USB权限。如果你要用J-Link、ST-Link这类USB调试器普通用户默认没有访问权限必须先把自己加入dialout组然后重载udev规则sudo usermod -aG dialout $USER sudo udevadm control --reload-rules sudo udevadm trigger执行完注销重新登录一下权限就生效了。这个步骤不做Windows下正常使用的调试器在Linux下会一直提示“无法连接设备”非常容易踩坑。2.3 许可证与多系统协同技巧关于许可证IAR官方提供了30天评估许可申请个人评估或项目前期选型完全够用。正式使用时建议配置License Server这样公司内部Windows和Linux机器可以共用一套License服务在IDE的许可证设置里填入服务器地址和端口就行。在多系统协作上我的习惯是把整个工程目录纳入Git管理并刻意使用相对路径。老工程里如果写死了Windows绝对路径比如C:\Users\xxx\workspace\drivers拿到Linux上必然编译报错。迁到跨平台环境后先在工程选项里把输出目录改成相对路径比如$PROJ_DIR$\build两边就不会出现路径错乱。另外Fortran语言项目很少见但如果是混合语言项目建议在Linux下确认一下编译器的搜索路径规则。IAR在这块做得比较成熟头文件包含路径和库路径都能在工程选项里单独配置只要不偷懒全部用相对路径跨平台同步基本无障碍。3. 实操过程与核心环节实现从创建工程到编译调试3.1 新建工程与Pack安装现在用实际工程走一遍流程。我最近在做GD32F407的项目开发就以GD32为例。新装好IDE后第一次打开是空工作区。创建工程前先确定芯片型号是否已经支持。新的原生跨平台IDE在设备支持管理上做了很大改动统一通过Pack包来管理芯片支持。如果你在新建工程向导里找不到GD32F407不用怀疑人生先安装对应的设备Pack。Pack安装有两种途径在线和离线。在线方式比较省事打开Pack Manager界面搜索GD32找到对应型号的Pack直接安装。离线方式适合内网环境从芯片厂商官网下载.pack或.pdsc文件然后在IDE的Pack管理器中通过“Import”导入本地文件。这里提一个经验Pack版本必须和IDE版本匹配。不同代际的IDE使用的Pack格式不一定兼容如果导入老版本Pack后提示格式错误就去芯片官网找对应新IDE支持的Pack版本下。Pack装好之后选择Project菜单下的Create New Project向导里就能看到目标芯片了。新建工程时建议按模块分好组我的习惯是建立四个组App放业务代码、Driver放外设驱动、Startup放启动文件和链接脚本、Doc放文档。这样后期找文件和做版本管理都方便。3.2 编译配置与生成库文件工程建好之后进入重点编译配置。IAR的工程选项入口在Project Options里面的General Options、C/C Compiler、Linker几个标签页决定最终编译产物。在General Options里首先要确认Output格式。如果要做最终固件选择Executable如果想把一部分代码封装成库就选择Library。我平时会维护一个公共外设驱动库编译成库文件给多个终端产品共用省去重复编译时间。具体生成库文件的操作其实很简单把工程选项里的Output切换到Library然后正常编译生成的.a文件就是静态库。这个库可以拷到其他工程目录在Linker的库搜索路径里加上引用链接时就会自动打包进去。需要注意库的编译目标和最终固件最好使用相同的优化级别设置否则某些接口符号可能会因为内联展开产生不匹配。C/C Compiler页面里最常调整的是优化级别。调试阶段建议选Low或None这样变量实时查看和单步执行更流畅。发布阶段再切到High或Balanced并通过生成的.map文件检查代码尺寸和编译时间。链接脚本这块对于GD32这类MCU尤其重要。IAR的.icf文件定义了Flash和RAM的分配区域选错芯片型号链接脚本默认地址就会出问题。我见过有人直接拿STM32F103的.icf用在GD32F103上大概率启动异常或烧录不进程序。正确做法是到Pack安装目录下找到对应芯片厂商提供的.icf文件在Linker页面中指定使用。3.3 下载与在线调试的关键点工程编译通过后就可以接上调试器下载了。我用的比较多的是J-Link在Options Debugger Setup里把Driver选成J-Link然后在Download标签页勾选“Use flash loader(s)”和“Verify download”。Verify的作用是烧录完成后自动回读校验Flash内容防止下载过程中数据错误。如果手头是ST-Link同样在这里选择对应的驱动。新版IDE在驱动兼容性上做了统一不再需要像老版本那样频繁切换动态库装上对应调试器的USB驱动就能识别。Linux下第一次接J-Link时如果IDE提示无法找到设备先别怀疑硬件。用dmesg查看USB识别情况dmesg | tail -30如果能看到设备节点但没有权限那就回到上一章说的用户组和udev规则问题。如果完全没识别检查一下J-Link固件是否太旧可以使用J-Link官方工具在Windows下更新一次固件然后再插回Linux机器。调试界面的操作逻辑和老版本IAR基本一致。断点可以直接在代码行号位置点击变量查看窗口支持实时监测Registers窗口能看到全部核心寄存器状态。需要特别提醒的是优化对调试的影响开High优化后很多局部变量会被优化掉Watch窗口显示“unavailable”是正常的调整到Low优化或者给变量加volatile修饰就能解决。我实际调试GD32F407的USART时遇到数据发不出去排查了半天硬件最后发现是优化级别导致代码里一个等待发送完成函数的判断被优化了。把那个函数加个volatile标志位重新编译问题立刻消失。这类问题在嵌入式调试里太典型了建议大家遇到诡异现象先降优化级别再排查逻辑。4. 常见问题与排查技巧实录4.1 Windows升级后菜单栏消失这个话题在技术社区里很常见尤其是IAR 8.11.3版本不少用户升级后突然发现菜单栏整个不见了。其实这不是新版本原生跨平台IDE引入的问题而是老版本窗口布局状态被缓存破坏了。解决办法很简单菜单栏消失也不影响快捷键操作按下Alt键在弹出的隐藏菜单里找到View菜单然后重置布局。如果Alt键也无法唤出菜单可以打开工作区目录删除窗口状态配置文件。找到工程同级的.eww文件目录下删除类似windowstate结尾的本地设置文件重新打开IDE即可恢复默认布局。我的建议是升级到新版之前先记录下自己的窗口布局习惯新版IDE的界面和旧的有些差异与其费劲复刻不如花10分钟适应新的工程视图。4.2 Linux下IDE无法启动在Linux下遇到的第一个高频问题就是IDE双击启动图标没反应。大多数情况是缺乏依赖库排查命令还是ldd。我整理了一张比较典型的缺失库和对应安装包对照表供参考ldd 提示缺失的库需要安装的包Ubuntu/Debianlibxcb-xinerama.so.0libxcb-xinerama0libxkbcommon-x11.so.0libxkbcommon-x11-0libgtk-3.so.0libgtk-3-0libICE.so.6libice6libSM.so.6libsm6装完之后如果还启动不了试试在终端直接运行启动脚本看终端输出的错误信息。有些Linux桌面环境对Qt或GTK主题兼容性不好加上export QT_QPA_PLATFORMoffscreen或者修改系统主题也能绕过部分启动崩溃问题。4.3 Pack下载失败或找不到目标芯片Pack安装失败通常分两种情况在线下载超时或者内网环境无法访问外网。在线超时纯属网络波动多试几次即可。内网环境就得走离线安装路线从芯片厂商官方网站下载对应Pack文件到本地再通过IDE的Pack管理器的本地导入功能安装。这里尤其提醒一下有些芯片厂商的Pack包会包含多款芯片型号导入后需要重启IDE才能在新建工程向导中看到。如果导入后还是找不到型号检查Pack文件和IDE版本的兼容性列表不要盲目安装最新Pack到老版本IDE上。4.4 许可证无法连接许可证问题在团队使用场景中非常突出。第一种情况是提示License Server超时排查网络连通性、服务器端口是否开放、License服务是否正常运行。第二种情况是提示“no available license”说明服务器上所有许可都被占用了只能等其他人释放。还有个小技巧如果Windows和Linux同时混合使用建议给License Server空闲超时时间设置短一些否则一个同事下班不关IDELicense就一直挂着不放别人没法编译。4.5 老版本工程打不开这个问题主要出现在老项目迁移。很多公司手里还有基于IAR 6.3的8051开发环境的老工程想在新版原生跨平台IDE里打开。这里要泼一盆冷水新IDE重点支持的是Arm等主流架构8051老工程不建议硬迁移。8051的工程涉及很多底层寄存器和非标准扩展语法老版本工具链已经经过多年验证与其冒险升级不如保留一台老环境专门维护老产品。如果你手上是IAR 8.x的Arm工程迁移到新版一般问题不大。导入后注意检查编译器版本差异产生的警告尤其是指令集、内建函数和标准库头文件的细微差别。4.6 调试器无法识别Windows下调试器无法识别多半是USB驱动没装好。J-Link需要安装Segger官方驱动ST-Link需要ST官方驱动。换个USB口也是排查手段有些便携HUB供电不稳会导致调试器枚举失败。Linux下先按前面说的用户组和udev规则排查再看设备文件是否存在。如果设备存在仍无法连接可以检查调试器固件版本。J-Link老固件对IAR新驱动的兼容性并不完美升级一下固件往往就好了。4.7 编译报错与链接失败编译报错要看具体日志定位但有几个“通病”工程路径或文件名包含中文、空格头文件路径用了反斜杠编译机时区不一致导致时间戳错乱。前两个问题在跨平台使用中发生频率极高建议所有工程文件和目录统一使用英文命名。链接失败最常见的原因是Flash或RAM溢出。查看.map文件看错误信息中提示的地址范围再结合.icf文件判断是哪个段溢出。把不需要的调试打印去掉、优化启动代码中的大数组一般能缓解。4.8 IAR Plugins是干什么用的很多搜索“iar plugins 是干什么d”的朋友大概对IAR的插件机制还不太明白。Plugins本质上是IDE的扩展模块比如版本控制、代码覆盖率、静态分析工具都可以以插件形式集成到IDE里。新版跨平台IDE在插件管理上更规范了可以在工具菜单中统一管理。刚接触IAR的话没必要折腾插件。先把工程、编译、调试核心链路跑通等团队需要统一代码规范或集成CI产物分析时再按需引入静态检查或覆盖率插件效率更高。5. 个人体会与后续建议这次从Windows切到Linux原生IDE我前后用了接近两周。最大的感受是编译速度确实改善了同配置的机器Linux下大工程全量编译比Windows快一些而且机器更流畅没有后台服务拖着。窗口管理上Linux桌面可以更自由地排列调试窗口开三个IAR实例同步对比代码也不会混乱。对于准备迁移的团队我的建议是不要一步到位。先在Windows上保持现有开发流程挑一套非关键项目在Linux下导入、编译、烧录验证整个工具链在水深火热中的可靠性。跑通后再逐步把CI构建任务迁过去最后再鼓励有Linux需求的同事日常开发使用原生IDE。老工程的处理上稳住别浪。Arm架构的8.x工程可以尝试迁移8051老产品就让它留在旧环境里。新的原生跨平台IDE适合新项目和新流水线没有必要为了跨平台去强行重编所有历史项目。有机会的话把Linux下的IAR IDE配合自动化构建脚本做成容器镜像团队新同事入职拉一个镜像就能拥有和服务器一致的构建环境这种体验远比在个人电脑上装各种依赖要舒服。跨平台IDE的价值不是一次简单的功能移植而是让嵌入式开发从“个人工具时代”真正走向“团队流水线时代”。
返回列表