ARTICLE DETAIL

资讯详情

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

IAR发布Linux原生跨平台IDE,嵌入式开发告别虚拟机

IAR发布Linux原生跨平台IDE,嵌入式开发告别虚拟机 搞嵌入式的人应该都见过这样一幕办公桌上两台机器一台Windows跑着IAR Embedded Workbench专门负责给MCU写固件另一台Ubuntu开着终端跑编译脚本、git、容器负责应用开发和持续集成。如果你手里只剩一台Linux笔记本想在Linux下直接打开IAR的工程文件以前的办法基本只有开虚拟机或者用Wine硬扛体验嘛谁用谁知道。现在IAR终于把原生支持Linux和Windows的跨平台IDE版本放了出来等于把过去只活在Windows里的那套工具链生态原封不动地搬到了Linux桌面上。这篇文章我就结合自己实际折腾的过程聊聊这套跨平台IDE到底解决了什么问题、从Windows切过来要做哪些准备、以及怎么在Linux下完成从建工程到生成库文件再到调试验证的一整条流程。1. 跨平台IDE到底解决了什么实际问题1.1 嵌入式开发最朴素的“割裂”现状做嵌入式的人其实每天都在两个世界之间横跳。一个世界是MCU固件开发IAR、Keil、STM32CubeIDE这类集成环境几乎是标配工程文件、编译器、调试器全都绑定在一块另一个世界是嵌入式Linux应用这个绕不开Linux环境交叉编译、Makefile、Docker、CI流水线整套都是Linux的生态。以前MCU固件开发基本被Windows垄断Linux用户想改个固件里的配置得先把工程拷到Windows机器上或者在虚拟机里再开一个Windows改完再拷回来。这种割裂不只是麻烦还会带来一连串协作问题——固件工程师给Linux工程师传一个.ewp工程过去对方Linux下根本打不开只能对着源码手动读逻辑沟通成本一下子高了不少。1.2 原生IDE和虚拟机、Wine的本质区别很多人会问Linux下以前也不是完全不能用IAR开个虚拟机或者Wine不就行了说实话能用和好用完全是两码事。虚拟机方案等于在Linux上再养一个完整的Windows系统内存、磁盘、CPU都要额外开销而且USB调试器透传进虚拟机里是重灾区。我记得有段时间用VMware跑IARJ-Link在虚拟机里隔一会儿就掉线一次重新插拔才能恢复调试到一半断连的感觉经历过的都懂。Wine方案虽然轻一点但IAR这种闭源IDE依赖不少Windows底层组件在Wine里能不能稳定跑很大程度上取决于版本和运气工程路径一复杂就容易出各种奇怪问题。原生IDE则完全不一样编辑器、编译器、调试器、许可证服务全部以Linux进程的方式运行文件访问、权限控制、USB设备通信都走Linux原生机制稳定性从根本上有了保障。1.3 IAR这次放出来的到底是个什么东西我理解IAR这次做的事情不是简单地把Windows界面拿过来套一层壳而是把整套工具链做成了Linux原生版本。也就是说你在Windows上用的编译器、汇编器、链接器、调试器驱动在Linux下都有对应的原生实现IDE只是把这一整套东西用图形界面串起来。从使用感受上看界面布局、工程管理方式、快捷键逻辑跟Windows版几乎一致老用户从Windows切到Linux版本的IAR基本不需要重新学一遍操作。不过也别指望任何旧工程拿过来双击就能跑一些老版本创建的工程在Linux上首次打开时会有格式提示重新保存一遍才能稳定下来这点我在后面的迁移部分会展开说。2. 从Windows切到Linux前这些准备工作最好先做2.1 系统环境与安装流程Linux版IAR对系统的要求并不苛刻主流64位发行版基本都能跑我自己用的是Ubuntu LTSDebian系应该也没什么问题。安装过程一般分两步先到官网下载对应的Linux安装包然后用命令行或者图形安装器执行安装完成后把IAR的可执行文件目录加进PATH环境变量这样后续用命令行编译工具会方便很多。有一个建议是安装目录尽量放在Linux原生文件系统下比如/opt或者用户目录千万别放在NTFS挂载分区或者网络共享盘上。我第一次装的时候图省事装在Windows分区挂载目录里结果工程打开就报文件锁错误查了半天才发现是跨文件系统权限和文件锁机制的问题。另外Linux下的IAR安装不会像Windows那样自动写注册表也不会自动关联文件后缀一切依赖环境变量和启动脚本这也是跟Windows体验差异比较大的地方。2.2 许可证这件事趁早搞清楚IAR的授权方式主要有两种一种是节点锁定许可证绑定到本机硬件信息另一种是浮动许可证通过许可证服务器统一分发。在Windows上很多人已经忘了许可证是怎么配的因为装完就自动生效了。到了Linux许可证相关配置往往需要手动处理。比如浮动许可证客户端机器通过环境变量指向许可证服务器服务器地址、端口、甚至是多个服务器之间的备选顺序都要写明白。我第一次在Linux上启动IAR时就卡在这一步IDE一直提示找不到许可证后来发现是环境变量没配服务器地址根本没带过来。排查思路其实很简单先确认许可证环境变量是否已经生效再用命令行工具测一下服务器能不能连通。如果是节点锁定许可证则需要在Linux下重新执行激活流程这个一般会绑定网卡MAC地址之类的硬件信息切换系统后重新激活是正常的不用慌。2.3 把旧工程平稳迁移到Linux从Windows迁移IAR工程到Linux有三个优先级最高的事项。第一.eww和.ewp这类工程文件在Windows下保存的编码格式不一定是UTF-8到了Linux下轻则注释乱码重则工程解析出错建议在文本编辑器里统一转换成UTF-8并保存。第二工程里如果引用了绝对路径比如C盘D盘那种写法到了Linux必须改成相对路径或者挂载路径很多老工程喜欢用绝对路径引用头文件目录这个迁移起来最费时间。第三确认Linux环境里已经安装了对应MCU的器件支持包。IAR从某个版本开始MCU型号支持是通过pack包管理的跟Keil的pack机制类似。我之前迁移一个用GD32片子的项目直接在IDE里看不到器件型号去厂商官网下载了对应的IAR支持包导入之后才能正常选型号、编译、识别寄存器头文件。总之迁移工程这件事不要双击打开就以为万事大吉要完整编译一遍才算真正迁移成功。3. 从建工程到生成库文件完整跑一遍3.1 新建工程并选对器件与工具链在Linux版IAR里新建工程的步骤基本沿用了Windows版的操作路径。打开IDE以后通过File菜单选择新建工程然后根据目标芯片架构选择对应的工程模板。工程向导会让你选择具体的MCU型号这一步其实就是依赖前面说过的器件支持包。选完型号之后IDE会自动把启动文件、链接脚本、基本的头文件路径配置好省掉很多手工搭骨架的麻烦。有一点需要特别注意Linux版IAR默认使用的工具链就是Linux原生的IAR编译器这个不用手动去改。如果工程是从Windows拷贝过来的编译选项里可能残留Windows路径风格或者Windows环境下的编译器设置建议重新打开Project Options检查一遍编译器的路径映射是否正常有些选项在Windows下能过在Linux下会因为路径不存在而直接编译失败。3.2 编译选项与输出文件配置新工程建好之后正式编译前最好先动两个地方。一个是优化等级Release版本一般开到High或者BalancedDebug版本建议设成Low或者干脆不开优化这样可以保留完整的调试信息断点和单步执行的表现更符合直觉。另一个就是输出文件格式IAR默认编译完产出的是ELF文件这个适合在调试器里加载但给产线烧录用一般不够。需要在Project Options里找到Output Converter的选项勾上生成附加输出然后在下拉列表里选择你需要的格式。我做量产固件包的时候通常会让IDE同时产出HEX和BIN两种格式HEX文件带地址信息适合用标准烧录器写入BIN文件是纯粹的二进制数据适合直接刷到Flash的固定偏移地址。如果你还在纠结该选哪种格式记住一句话给调试器用的是ELF给烧录工具用的是HEX或BIN各自使命不同不用混着用。3.3 生成库文件的具体操作这个点我要重点说说因为IAR下生成静态库的操作方式跟普通应用工程有些差别。场景一般是这样的你手上有一批公共代码比如加密算法、通信协议栈、自研的数学库想在多个应用工程里复用又不想每次都把源码拷一遍。这时候把公共代码编译成静态库就是最合理的做法。操作上把工程属性里的输出类型从Executable改成Library然后重新编译就会得到一个后缀为.a的静态库文件。这个库文件在Linux和Windows下都是通用的二进制格式。拿到库文件之后在应用工程里把它添加进去同时把头文件路径配置好就能正常调用库里的接口了。这里有个我必须提醒的坑库工程的编译选项必须和应用工程保持一致尤其是涉及到ABI兼容性的选项比如浮点运算指令集、结构体对齐方式、是否使用微库等。如果库工程用了某种对齐模式而应用工程用了另一种链接阶段就会报一堆incompatible或者relocation错误排查起来相当头痛。我后来养成一个习惯把库工程和应用工程共用的公共编译选项抽到同一个配置文件里让两边引用同一份配置从根源上避免这种问题。3.4 在Linux下调试和烧录调试这一步可以说是Linux原生IDE体验提升最明显的地方。我日常调试用的是SEGGER J-LinkLinux下连接方式和Windows上基本一致但第一次用之前要处理好两件事。第一安装SEGGER官方的Linux驱动包确保系统能识别J-Link设备第二配置udev规则给普通用户赋予访问USB调试器的权限不然每次都要用sudo执行IDE权限高了又容易误操作非常不舒服。这两步做完把调试器接到目标板上在IDE里选择C-SPY调试器驱动确认接口类型是SWD还是JTAG、连接速度设置合理然后就能直接进入调试会话了。断点、单步、变量监视、寄存器窗口这些都可以正常使用实测下来跟Windows版本没有任何使用上的落差。烧录方面可以直接在IDE里执行Download把固件写入Flash也可以从命令行调用烧录工具完成适合集成到生产测试脚本里。4. 日常开发里最值得注意的几个细节4.1 文件路径和大小写Linux下更严格Windows文件系统对大小写不敏感Linux文件系统则是严格区分的。这就导致一个很经典的迁移问题工程代码里写着include Util.h文件系统里实际文件名却是util.hWindows上编译一点问题没有Linux下编译器直接报找不到文件。迁移工程的时候先写个小脚本把源码里所有include路径检查一遍和文件系统里的实际文件名做比对能省下不少时间。另一个是路径分隔符Windows工程文件里习惯用反斜杠\Linux下统一改成斜杠/更稳妥。别小看这两个字符的差异很多跨平台编译失败的案例追根溯源都是路径写法的问题。4.2 换行符、编码和gitWindows下源码换行符默认是CRLFLinux下是LF。严格来说大多数情况下编译不会受影响但文件进入git之后每次提交都会因为换行符差异产生大量无意义的差异记录。比较推荐的做法是在仓库根目录放一个.gitattributes文件给源码文件统一配置LF换行这样不管在哪个平台提交仓库里保存的都是统一格式。编码方面老项目如果用了GB2312或者GBK编码的中文注释在Linux的UTF-8环境里打开会显示乱码编译器一般按字节处理不影响编译但人看着确实难受。这种历史包袱可以用iconv工具批量转码转完再编译一次确认没改坏注释就行。4.3 命令行编译与CI集成这是Linux版IAR带给我的最大惊喜。以前在Windows上想跑固件的自动化编译要么维护一台Windows构建机要么在虚拟机里搭agent成本都不低。现在在Linux上直接用命令行工具就能对.ewp工程发起构建编译日志直接输出到终端返回码可以被Jenkins、GitLab CI这些流水线工具直接读取。我现在把固件编译、静态检查、Hex/Bin打包全部写进了流水线每次提交代码自动产出完整的固件发布包。顺便说一句命令行工具的调用方式其实很简单指定工程文件和构建配置名字就行比如类似iarbuild my_project.ewp -build Debug这种形式具体参数在不同版本里大同小异官方文档都有写。如果你的团队还在手工编译固件强烈建议试试把这一环接进CI里收益非常明显。4.4 版本控制里哪些文件该忽略IAR工程有一个“夹带私货”的习惯就是编译过程中会在工程目录下生成大量中间文件。Debug目录、settings目录、.dep依赖文件、编译器生成的临时文件这些都不应该进git。如果一开始没配置.gitignore很容易在提交代码时把编译缓存一起推上去既占仓库空间又容易造成误操作。建议仓库里只保留.ewp工程文件、.eww工作区文件、源码、链接脚本以及必要的头文件配置。这样换电脑或者新同事加入时clone下来直接打开就能编译不需要手工清理任何中间产物。我见过不少项目仓库体积几个GB绝大多数都是编译垃圾占的空间清理完.gitignore之后仓库体积几百MB体验完全不是一个量级。4.5 快捷键和主题顺手就行Linux版IAR的快捷键默认跟Windows版基本对齐老用户切换成本很低。不过有一些细微差异比如某些Windows下通用的快捷键在Linux桌面上会被桌面环境先拦截掉导致IDE里按了没反应。遇到这种问题去系统设置里检查一下全局快捷键把冲突项改掉就行。主题方面IAR的界面风格一直比较朴素有些版本默认还是亮色主题长时间看代码比较刺眼。我自己换了深色主题配合编辑器的语法高亮在Linux桌面上观感舒服了不少。另外新版IDE的全局搜索和文件跳转响应速度比老版本好很多我建议多花点时间熟悉快捷键能明显提升日常操作效率。5. 常见问题与排查技巧实录5.1 许可证连不上、激活失效这个问题的频率可以排到所有IAR Linux问题的第一位。表现是启动IDE时提示找不到许可证窗口一直弹。排查顺序我建议这样走先检查许可证环境变量是否设置正确比如LM_LICENSE_FILE这种变量是否指向了正确的服务器地址和端口再用命令行工具测试客户端到服务器的网络连通性注意IAR许可证服务默认用的端口通常是动态协商的有些网络环境下需要确保端口没被防火墙挡掉最后检查许可证服务器本身是否正常运行。很多时候Linux下装完IDE但忘了配环境变量就是这个问题配置好之后重启IDE就好。现象可能原因解决思路启动提示找不到许可证环境变量未配置检查并配置许可证服务器地址许可证能连上但校验失败节点锁定信息不匹配在Linux下重新激活节点锁定许可偶尔连不上服务器防火墙拦截端口放行许可证服务通信端口5.2 调试器识别不到或烧录失败Linux下调试器识别不到十有八九是权限问题。第一步先确认USB设备是否已经被系统识别可以用lsusb命令查看是否存在J-Link设备。如果设备完全不存在再检查驱动有没有装好、线缆是否正常。如果设备存在但IDE里就是选不上优先检查udev规则是否已经配置并重新加载。关于udev规则SEGGER官方驱动包安装时一般会自动处理但有些自己编译内核的发行版可能需要手动添加规则文件这个细节文档里写得比较隐蔽踩过坑的人应该都有印象。如果设备已经能被识别IDE也正常选择了驱动但连接还是失败那就检查C-SPY里的接口类型是不是选对了SWD和JTAG选错会直接通信失败另外连接速度设置太高在布线质量一般的板子上也会导致握手失败适当降低一点速度往往就正常了。5.3 编译报错但Windows下正常同一份代码在Windows上编译通过换到Linux下就报错这类问题出现时先不要怀疑编译器坏了。优先级第一的检查项是文件路径大小写Linux文件系统对大小写敏感include路径写错或者文件名大小写不一致会直接报找不到文件。第二检查项是换行符和编码涉及预处理器指令的宏定义或者字符串拼接时某些特殊字符会造成编译异常。第三检查项是编译器版本差异Linux版和Windows版如果版本不完全一致某些编译选项的默认行为可能会有细微差别可以对比一下两边的编译日志。最后还有一种情况工程里旧版本的编译缓存配置文件还在Linux下重新解析时产生冲突把Debug目录和settings目录清掉重新编译一遍往往就好了。5.4 IDE启动失败或界面显示异常IDE启动直接闪退或者界面空白在Linux下遇到优先级最高的怀疑对象是图形栈兼容性。特别是老旧显卡驱动或者通过远程桌面协议登录Linux的情况下GPU加速渲染会引发各种异常。我自己的经验是先把IDE的日志打开找到崩溃点一般会指向OpenGL初始化失败之类的信息。解决方案是尝试把IDE的渲染方式切换成软件渲染有些IDE在启动参数里提供了这个开关或者在配置文件中手动指定具体入口不同版本略有差异但方向都是一致的。如果是远程桌面环境建议先确认桌面协议支持的OpenGL版本够不够不够就改用软件渲染。总体而言Linux版IAR对主流桌面环境兼容性已经很不错了这类问题在常规Ubuntu桌面上几乎不会遇到。说实话IAR出Linux原生版本这件事我一开始是有点意外的。毕竟这套工具链在Windows上积累了好多年突然掏出跨平台版本说明嵌入式工具链终于开始往开发者习惯的方向靠拢了。我自己把主力固件开发环境切到Linux之后最大的感受不是“终于不用开虚拟机了”而是命令行、CI、调试、版本管理这些原本零散的能力终于可以在同一个系统里串起来。最后再分享一个小技巧装好Linux版IAR之后把工作区路径、器件支持包版本、工具链路径、许可证服务器地址全部写进一个环境初始化脚本新同事入职或者换机器的时候照着脚本跑一遍就能恢复完整的开发环境省掉很多让新人自己摸索的时间。
返回列表