IAR Embedded Workbench编译工程时,可以针对Debug和Release分别设置代码优化级别。优化打开后,编译器可能删除没有实际用途的局部变量、把变量暂存在寄存器中、调整语句执行顺序,或者直接把函数展开到调用位置,所以C-SPY里看到的变量状态可能和源码不完全对应。常见表现包括变量显示Unavailable、局部变量突然消失、单步执行顺序跳动以及断点无法停在某一行。碰到这些现象时,要先确认工程实际使用的优化配置,再判断是调试信息显示变化,还是程序运行结果真的出了问题。
IAR Embedded Workbench for Arm通常使用ICF文件控制程序在Flash和RAM中的布局,代码区、数据区、栈、堆以及部分启动相关段都会受到链接配置影响。工程能够正常编译、链接,却在下载后停在复位阶段、跑不到main、出现HardFault或直接无法下载时,可以把链接器配置和芯片实际存储布局放在一起核对,尤其要检查工程选择的器件、ROM起始地址、RAM范围和启动代码使用的地址。
IAR Embedded Workbench运行C/C++程序时,局部变量、函数调用现场和部分中断上下文会占用栈空间,malloc、calloc以及C++的new等动态分配则会使用堆。程序平时运行正常,一进入深层函数、复杂中断或者处理较大局部数组就出现HardFault、随机复位、变量值异常,很可能和栈空间有关。判断这类问题时,可以把C-SPY运行时监控、链接器静态分析和ICF中的内存配置放在一起看,也要把堆空间不足和栈溢出分开。
IAR Embedded Workbench把程序写入目标芯片后,CPU下一步是停在复位入口、运行到main暂停,还是脱离调试器后自行启动,和C-SPY的下载方式、Run to配置以及硬件调试驱动的复位策略都有关系。程序能够正常编译和写入Flash,却在下载后一直停着,先别急着改启动代码,可以先确认当前执行的是下载还是调试启动,再检查复位后的PC、SP和程序入口。
IAR Embedded Workbench中的器件、宏、链接文件和优化级别都会影响最终程序。无优化时运行正常,切换发布配置后出现死机、变量异常或外设时序错误,应先固定配置差异,再逐级缩小问题范围。围绕“IAR Embedded Workbench怎么配置编译选项IAR编译优化后程序运行异常如何排查”,配置阶段需要保证环境一致,排查阶段则要避免同时修改过多选项。