文章目录
利用VSCODE编译以及调试IAR项目(IAR官方vscode插件)IAR Build以及IAR C-SPY Debug
目前IAR官方针对Visual Studio Code(以下简称vscode)发布两款扩展程序扩展程序,它们分别是针对构建扩展的IAR Build以及针对调试的IAR C-SPY Debug。
安装插件
在vscode的扩展中搜索IAR,在搜索的结果中安装IAR Build以及IAR C-SPY Debug
安装完成后扩展中会多出一个图标,如下图所示:
IAR C-SPY Debug安装后没有图标,只是在调试选择调试器的时候会多出一些选项,如下图所示。
配置和编译
点击vscode左侧扩展图标中的IAR Build,左侧导航栏会出现IAR Build的扩展菜单,扩展菜单的功能大致可以分为四个部分:
- 工具条
- 工程配置
- 批量构建
- 工程文件查看
IAR BUILD工具条
工具条总共有八个按钮,IAR 构建扩展中的大部分功能都是以可运行的任务形式实现的。其中,上面四个按钮是构建任务菜单,下面四个按钮是C-STAT任务菜单。
Build tasks 构建任务
IAR BUILD工具条上面四个图标都是构建任务,要运行 IAR 构建扩展中可用的构建任务之一,可以选择“终端”>“运行任务”>“iar”。这个和按钮的方式是一样的,下面是每个任务按钮的作用:
Build Project 构建项目
通过编译、汇编和链接自上次构建以来已更改的文件,将项目选定的构建配置更新到最新状态。与IAR种的make按钮作用相同。
Rebuild Project 重建项目
重建并重新链接项目所选构建配置中的所有文件,与IAR中的Rebuild All按钮作用一样。
Clean Project 清理项目
删除任何中间文件和输出文件,与IAR中clearn作用一样。
Open Workspace in IAR Embedded Workbench在 IAR 嵌入式工作台中打开工作区
在当前在 VS Code 中打开的文件夹中打开一个 IAR 嵌入式工作台工作区文件。如果该文件夹包含多个工作区文件,系统将提示您选择要打开哪一个。
C-STAT任务
C-STAT是一个静态代码分析工具,静态代码分析工具可以帮助开发人员检测出代码中很多跟实现相关的潜在Bug。C-STAT集成在IAR开发环境中。
要运行 IAR 构建扩展中提供的 C-STAT 静态分析任务之一,请选择“终端”>“运行任务”>“iar-c-stat”。下面是每个按钮的作用:
Run C-STAT Analysis 运行C-STAT分析
使用 C-STAT 分析项目并生成有关消息数量的信息。这些信息会打印在“问题”视图中。有关更多信息,请参阅 C-STAT® 静态分析指南(PDF)。Clear C-STAT Diagnostics 清晰的 C-STAT 诊断信息
删除项目的 C-STAT 输出目录,并从“问题”视图中移除所有 C-STAT 消息。有关更多信息,请参阅 C-STAT® 静态分析指南(PDF)。Generate Full HTML Report生成完整 HTML 报告
根据分析结果在 C-STAT 输出目录中生成一份完整的 HTML 格式报告。如需了解更多信息,请参阅 C-STAT® 静态分析指南(PDF)。Generate HTML Summary 生成 HTML 摘要
在 C-STAT 输出目录中以 HTML 格式生成分析摘要。如需更多信息,请参阅 C-STAT® 静态分析指南(PDF)。
Configuring the Build extension工程配置
左侧菜单的第二部分是工程配置,插件安装好后会自动识别安装过的IAR构建工具,IAR构建工具在安装IAR环境后会自动安装。
在vscode里面打开一个文件夹,插件会自动扫描文件夹内包含扩展名为eww的IAR工作空间文件并显示在菜单中,如果有多个工作空间文件,可以显示多个工作空间文件。
为了缕清IAR的项目与插件显示的关系,我们首先需要缕清IAR的项目组织,在IAR的项目组织中,分为工作空间、工程,而且每个工程有,这里我们新建一个IAR项目,项目具体细节如下:
工作空间 | 工程 | 配置 |
---|---|---|
WorkSpace1 | prj1 | Debug |
Release | ||
OtherConfig | ||
prj2 | Debug | |
Release |
在vscode中打开这个这个IAR项目的文件夹,可以在插件中看到项目的细节如下:
![[Pasted image 20250304103607.png]]
这里vscode的IAR Build插件就可以和实际的工程关联起来了。需要编译什么具体的工程以及具体的配置,就在这里选择相应的选项。选择完成后点击IAR BUILD工具条上的Build Project 构建项目可以完成相应的编译构建。完成后会显示相应的构建完成情况。
设置默认的 IAR 构建任务
为避免每次执行 IAR 构建任务时都必须选择“终端>运行任务>iar”或“iar-cstat”,您可以配置一个默认任务,并通过键盘快捷键(默认为 Ctrl + Shift + B)来执行。要设置默认构建任务,请选择“终端>配置默认构建任务”,然后选择任务。
在线运行调试
IAR C-SPY debug扩展程序可让您对现有的 IAR 嵌入式工作台项目或独立应用程序执行基本调试。它支持IAR EW for Arm所支持的大多数 IAR C-SPY 调试驱动程序,并使用 VS Code 或 VS Code 嵌入式工具扩展程序提供的反汇编、内存、外设和 RTOS 视图。
点击vccode侧面的运行和调试按钮,然后在点击创建 lunch.json文件按钮,在弹出的选项中选择IAR C-SPY Debug选项,然后会弹出已有的IAR工作空间中的调试选项。选择需要的即可。
完成后会在.vscode文件夹中生成一个lunch.json文件。
再次点击侧边栏运行和调试,在选项中会看到一个绿色三角按钮,同时右侧有和lunch.json对应的配置选项,点击绿色三角按钮,就可以开始调试了。
调试界面介绍
开始调试后会弹出调试界面,大致是以下样子,左边分成一个一个的小区域窗口。
那么我们一个一个解释一下其作用以及和IAR编辑其中关联的对应的功能。
变量
变量窗口是自动监视变量的窗口,其自动的生成本地变量、静态变量以及CPU寄存器的监视,但是目前我所用的EWARM是8.4的版本,所以不支持本地变量以及静态变量的监视。
监视
监视是自己添加表达式以及变量名称,这里的变量可以是全局或者局部变量,静态或者非静态变量都可以,总之只要目前程序运行状态在内存中暂留的变量都可以显示在这里。
调用堆栈
调用堆栈是显示目前的函数调用关系,如果程序没有执行到断点,这里显示的是空白,如果程序目前执行到某一个断点,那么左侧显示的就是函数层级调用关系。
断点
在右侧编辑窗口行号上点击下鼠标左键,可以添加断点,然后再断点窗口这里可以删除、禁用、启用或者按照一定条件来触发断点。
监视
这里的监视与上面的监视有所不同,这里的监视包括QUICK WATCH以及LIVE WATCH,两部分,其中QUICK WATCH可以监视在程序暂停情况下的变量情况,而且需要手动刷新,LIVE WATCH与IAR中的LIVE WATCH作用一样,可以监视一直驻留在内存中的变量,同时可以动态变换监视量。
寄存器
监视与硬件相关的寄存器的值。
栈空间
监视栈空间占用情况以及栈空间的地址内数据情况。
外设
监视对应MCU的外设的寄存器数据情况。
launch.json文件解读
创建launch.json
对于调试场景,vscode官方指导,需要需要创建一个 launch.json
文件来指定调试器配置。例如,指定应用程序的入口点、附加到正在运行的应用程序或设置环境变量。在[[#在线运行调试]]第一部分的教程中,展示了通过运行和调试按钮自动来运行调试的过程,在这个步骤里面会自动生成一个launch.json的文件,在vscode的工作目录下的.vscode/launch.json。
![[Pasted image 20250305110653.png]]
如果没有launch.json文件,可以手动创建,在运行和调试侧边栏按钮中,除了可以点击运行和调试,还可以点击创建launch.json文件按钮,VS Code 会尝试检测您的调试环境。如果无法检测到,您可以手动选择:
![[Pasted image 20250305111613.png]]
根据所选的调试环境,VS Code 会在 launch.json
文件中创建一个初始配置。
在“运行和调试”视图中,使用“配置”下拉菜单选择名为“启动程序”的配置。可用配置列表与 launch.json
文件中的配置列表相匹配。
Launch配置以及Attach配置
在 VS Code 中,有两个核心调试模式:启动(Launch)和附加(Attach),它们分别处理两种不同的工作流程和两类开发人员。下面是两种模式的区别。我们一般对于嵌入式的调试都用的是launch模式。
特性 | launch 模式 |
attach 模式 |
---|---|---|
程序启动方式 | 由 VSCode 直接启动 | 程序已由外部启动(如终端、服务器) |
调试控制 | 完全控制程序生命周期 | 仅附加到现有进程,不控制启动/停止 |
适用环境 | 本地开发环境 | 本地或远程生产环境 |
配置复杂度 | 简单(自动生成调试环境) | 较高(需手动配置端口或进程 ID) |
launch.json
属性
launch.json
是按照json文件格式来规定文件内容的,json是通过key:value这种形式来展现,这种对应的key:value称之为属性,有许多 launch.json
属性可帮助支持不同的调试器和调试场景。在为属性指定值后,您可以使用 IntelliSense(Ctrl + 空格)查看可用属性列表,类似于自动联想功能。启动配置中可用的属性因调试器而异。在configurations内的每个大括号所包裹的内容称为一个调试器的属性配置。
下面属性是我们IAR C-SPY Debug插件比较重要的,也是调试所必须的:
type
- 用于此启动配置的调试器类型。request
- 此启动配置的请求类型。当前支持launch
和attach
。name
- 调试启动配置下拉菜单中显示的便于读者理解的名称。program
- 用于指定生成的运行文件目录。workbenchPath
-指定IAR安装的目录。driver
-指定调试接口。
比如在上面选择IAR C-SPY Debug插件为我们自动生成的launch.json
文件中,在这个文件中,type
属性的值是cspy
,代表调试器类型用的是cspy
,也就是我们安装的这个插件所支持的IAR的调试器;request
属性值是launch
,在上一节[[#Launch配置以及Attach配置]]中,我们可以明确我们嵌入式的request
;name
的属性值为Launch: pj1.Debug
,这也就对应了运行和调试视图上的运行调试名称。program
的值为"${workspaceFolder}\\P1\\Debug\\Exe\\pj1.out"
,那么这里我们对应的是debug配置所生成的out文件的路径。workbenchPath
这个指定的就是我们IAR的安装目录。
同时还有一个属性,就是driverOptions
,该属性是根据driver
属性的值不同而不同,比如我们这里driver
属性值是"ST-LINK"
,就指定调试的硬件接口为STLINK,那么driverOptions
里面的所有属性值都与"ST-LINK"
相关。这里自动生成的driverOptions
如下图。
总结
目前IAR的构建以及调试插件对于VSCODE来说,确实打破了很长时间以来的IAR调试的固有局面,但本质上,插件还是借用了IAR的组件来实现功能,无法脱离IAR的安装。就目前的使用感受来说,有以下几个优缺点,仅供大家参考。
优点
- vscode代码编辑优势巨大,无论是丰富多样的主题颜色,还是方便快捷的快捷键以及快捷命令,再到智能代码补全、语法高亮、代码片段等,这些都是完虐IAR的编辑器的。
- vscode支持多种版本控制系统,如Git,以及集成了终端功能。
- vscode可以通过插件扩展功能,用户可以根据需要添加额外的功能和特性,也许目前没有的功能不久的将来可以通过插件来实现。
- 代码编辑以及构建调试都在一个软件里,大大降低了软件的切换时间,以往基本都是用vscode里面修改代码,IAR工具内编译和调试,切换的过程很不方便,而且有时候存在一个软件中修改代码,另一个软件长时间没有同步修改的问题。所以在一个软件里面就是方便。
- vscode加插件的方式可以在同一个窗口调试多个工作空间的内容,但是IAR需要打开不同的工作空间,然后分别调试。
缺点
- 编译时间慢,简单做了个测试,一个173数量文件的代码,vscode加上插件需要47秒才能编译完成,但是在IAR中只需要34秒。
- 配置修改不方便,在IAR工程中的很多编译、链接、工程等配置,但是在vscode里面都无法修改,比如需要添加工程文件或者预先宏定义,都需要在IAR中配置。
- 像STM32H743等芯片,IAR调试的时候可以自动屏蔽看门狗,但是在vscode加插件中,如果打开看门狗启动调试,在断点中就有可能导致程序重启。
- vscode的调试配置等配置大多依赖配置文件,不直观,需要用户有理解成本,属于便捷但学习成本较高的方案。
写在结束
最近一段时间一直在研究IAR的插件在vscode里面的使用,也尝试用这种工作流程来替代以往用vscode做编辑器IAR做调试器的工作模式,其实也尝试过gcc交叉编译环境+gdb+vscode调试的模式来解决目前的工作需要,但是多种方式的尝试都始终无法替代原有的工作流程。
我时常在某乎以及小破站看嵌入式与其他软件行业的骂战,总想从某些骂战中寻求己方阵营的安慰。在目睹嵌入式软件与其他软件行业在工作效率上的差距越来越大的时候,就像看见别人家的孩子品学兼优、德智体美劳全面发展。比如班长互联网软件行业通过这些年的资本以及人口的红利已经发展壮大,特别是在工作方式的迭代上,甚至已经形成了工作方式的迭代也有固定的流程了。再看看自己所在的嵌入式,怒其不争由心生。互联网从业人员与嵌入式从业人员的人群画像还有本质区别,互联网从业者年轻、好学习,迭代快为标签,而嵌入式从业者大多以稳重,业务全面著称,当然不乏同时拥有两方面特质的人群,但是固有的印象还是反应了从业者的区别,所以在嵌入式从业者全面的能力下,往往是被动积累居多,主动学习欠缺,很多嵌入式从业者还和十几年前的工作模式Sourceinsight+keil,因为新的东西就意味着试错成本,也就意味着大量的时间精力的花费,但是新的东西也就意味着新的效率与机会。时代发展与AI的横空出世也在慢慢影响每个从业者的工作习惯。希望越来越多的公司以及个人能够开发更多的让嵌入式行业效率更高的工具。