IAR调试使用技巧汇总:数据断点、CallStack、设置堆栈、查看栈使用和栈深度、mac/icf/map file, FreeRTOS插件等

更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,一起学习探讨软硬件技术知识经验,关注就有海量学习资料免费领哦:
在这里插入图片描述



1.使用数据断点:

1、选择要打断点的代码行,或在Memory中选中某一个要监测的数据,点击右键->Set Data Breakpoint:
这里写图片描述
2、在弹出页面选择该Data断点实现的条件,例如该Data的读、写,或者可以在Conditions中设置断点产生条件,如Data == 100时进入断点。以及通过Action 在断点执行时产生相应的动作。
这里写图片描述


2.Set next statement 手动执行到某行代码

如果断点已经执行完,还想继续跳到该断点,或者想手动执行到某行代码,可以在断点处右键,选择Set next statement

这里写图片描述


3.设置堆栈大小

1、右键工程目录选择Options:
这里写图片描述
2、依次选择Linker -> config,然后点击Edit,选项卡选择Stack/Heap Size,编辑实际堆栈大小:
这里写图片描述
更改后需要rebuild


4.静态查看程序Stack栈使用详情,以及栈深度

在这里插入图片描述
在Option->linker中勾选Enable stack usage analysis,之后Rebuild编译完,可以在.map中查找Stack Usage 栈使用分析
在这里插入图片描述
举个栗子,上图是在map中找到的STACK USAGE,可以清晰的看到Program程序里使用最大的stack大小为1392bytes, Uncalled function(如中断)使用的stack大小为最大1824bytes和其他所占用的bytes。
所以,程序里要设置比Program 1392+Uncalled Function占用的stack空间才行,否则会导致overwrite或程序跑非等异常。
公式如下;
CSTACK Size >= maxstack(“Program entry”) + totalstack(“interrupt”) + safety margin(100);
Maximum call chain: 最大调用链所占Stack大小


5.动态查看程序运行中Stack占用情况

程序运行中,可以查看Stack的当前占用量,以及总量
Tools->Option->Stack中勾选如下图:
在这里插入图片描述
程序运行时(Debug),选中View->Stack
在这里插入图片描述
在程序运行中,打断点或者暂停程序,Stack窗口就会显示栈使用情况,如下图:可以看到当前栈指针位置、(该断点时刻栈的使用情况)、当前栈空间内容及地址、全部已使用的Stack空间、以及未使用的Stack空间。
在这里插入图片描述
关于Stack窗口 可以参考如下:
在这里插入图片描述


6.Call stack查看当前栈空间,既此时正在执行的函数及Context:

在Debug模式下,IAR菜单栏选择View -> Call Stack,执行到某一断点,或者程序暂停时,就可以清晰的看到当前时刻的栈空间信息,既所调用的函数等信息
在这里插入图片描述

好多攻城狮都会有疑问,这里多说明一下,什么是Call Stack:
Call Stack:调用堆栈,(当前函数执行过程的空间展示)
当发生函数调用的时候,栈空间中存放的数据是这样的:
1、 调用者函数把被调函数所需要的参数按照与被调函数的形参顺序相反的顺序压入栈中,即:从右向左依次把被调函数所需要的参数压入栈;
2、 调用者函数使用call指令调用被调函数,并把call指令的下一条指令的地址当成返回地址压入栈中(这个压栈操作隐含在call指令中);
3、 在被调函数中,被调函数会先保存调用者函数的栈底地址(push ebp),然后再保存调用者函数的栈顶地址,即:当前被调函数的栈底地址(mov ebp,esp);
4、 在被调函数中,从ebp的位置处开始存放被调函数中的局部变量和临时变量,并且这些变量的地址按照定义时的顺序依次减小,即:这些变量的地址是按照栈的延伸方向排列的,先定义的变量先入栈,后定义的变量后入栈;

所以,发生函数调用时,入栈的顺序为:
  参数N
  参数N-1
  参数N-2
  …
  参数3
  参数2
  参数1
  函数返回地址
  上一层调用函数的EBP/BP
  局部变量1
  局部变量2
  …
局部变量N


7.使用Memory查看程序运行中各种过程数据

例如查看某个指针指向的数据内容:
Debug模式下,右键Watch 一个char *的指针dataC,这时只能看到指针指向的第一个数据:
这里写图片描述
同样在View菜单下,点击Memory1,将dataC指针存放的地址放到Goto的内容栏中,即可查看数据内容:
这里写图片描述


8.IAR Map文件解析堆栈信息:

通过Option->Linker勾选 map,则编译后会生成.map文件,包含了项目各种编译信息,如下图:
在这里插入图片描述
编译后,在编译目录中/list/文件夹中,找到并打开.map文件,文件最上面可以看到编译时间、Linker的版本、编译的程序文件等,

堆栈信息都在"PLACEMENT SUMMARY" 的"P2"中,我们向下拉,找到"P2"最后一个part,可以看到堆Heap 栈Stack的起始地址
在这里插入图片描述
再往下ENTRY LIST之后就是程序中各种函数/变量编译的信息:
在这里插入图片描述
可以看到函数名,地址等信息,
其中Code Gb代表全局函数:,其中code说明为代码,Gb说明为“全局的”函数(Global)
可以看到除了中断向量表,第一个编译的出的Object文件为 cmain.o,该入口函数位于main.c文件。

静态函数:类型为Code Lc,即静态(局部Local)函数;
在这里插入图片描述
全局变量也叫“全局数据”,因为它的类型为“Data Gb”。
(文件内)静态变量:“Data Lc ” 使用static关键字定义的变量,只有在当前文件内使用,所以它属于静态(“局部”Local)变量。
在这里插入图片描述
(函数内的)静态变量:定义在函数体内的静态变量,如上图中的,xxx::byteCounter


9.IAR xx.icf存储资源文件解析:

IAR中使用.icf文件 划分存储资源

在这里插入图片描述


10.IAR各编译文件含义:

.dep文件
ide所使用的文件依赖信息,这个会自动生成的,可以删掉
.ewp文件
工程文件/project,包含代码,编译,链接选项等,不包含调试设置等信息,这个不能删
.ewd文件
工程调试设置,保存的是IAR设置中的Debugger选项,这个最好不要删
.eww文件
解决方案/工作空间/workspace,可以直接双击打开,可以放多个工程文件,最好也不要删。

11. Macro file (.mac) 文件使用与配置:

Mac file是在IAR debug将程序下载之前,由debugger load并执行,完成下载前的硬件初始化配置等。

(例如需要初始化的片外RAM控制器、寄存器,如HyperRAM,需要在代码下载进RAM前进行初始化,程序才能正常跑)

macro要使用系统或C-SPY macro,也可以自定义(在C-SPY 启动时调用“ _ _registerMacroFile(“MyMacroUtils.mac”);”提前注册)

C-SPY已经定义好每个阶段的Macro函数,用户只需要实现就可以了:
在这里插入图片描述
在这里插入图片描述

这里以常用的execUserPreload() 举例, 这个macro是在IAR和设备 建立通讯到下载程序前调用的,可以在这里面做些程序下载前的硬件初始化

使用示例如下:


execUserPreload()
{
	_clock_init();
	_Flexspi_mpu();
	_HyperRam_Init();
}

其中

_clock_init()
{
  // Enable all clocks
  __writeMemory32(0xffffffff, 0x400FC068, "Memory");
  __writeMemory32(0xffffffff, 0x400FC06C, "Memory");
  __writeMemory32(0xffffffff, 0x400FC070, "Memory");
  __writeMemory32(0xffffffff, 0x400FC074, "Memory");
  __writeMemory32(0xffffffff, 0x400FC078, "Memory");
  __writeMemory32(0xffffffff, 0x400FC07C, "Memory");
  __writeMemory32(0xffffffff, 0x400FC080, "Memory");
  __writeMemory32(0xffffffff, 0x400FC084, "Memory");

  // Config PLL for FlexSPI
  __writeMemory32(0x00002001, 0x400D8030, "Memory");
  __writeMemory32(0x001D0000, 0x400D8100, "Memory");//PLL2PFD2-327M
  __writeMemory32(0x11AE8024, 0x400FC018, "Memory");//divide by 1 for FlexSPI2 root clk 327M, output CK 327/2 = 163M
  
  __message "clock init done\n";
}

_Flexspi_mpu()
{
  __writeMemory32(0x70000018, 0xE000ED9C, "Memory");
  __writeMemory32(0x0303002f, 0xE000EDA0, "Memory"); //16M
  __writeMemory32(0x70e00019, 0xE000ED9C, "Memory");
  __writeMemory32(0x03080029, 0xE000EDA0, "Memory");  
  __writeMemory32(0x00000005, 0xE000ED94, "Memory");
}

在这里插入图片描述

IAR配置:
Options -> Debugger -> Use macro file

在这里插入图片描述


12 插件使用之FreeRTOS

Option->Debugger->Plugins->勾选FreeRTOS" 在这里插入图片描述
这时候Debug起来,就会出现FreeRTOS菜单,勾选task/Queue:

在这里插入图片描述

运行起来后,手动暂停或断点,就能够看到当前Free RTOS 所有Task 和Queue的信息:
如图,每个Task的状态、优先级、Stack地址,Queue长度、Queue当前收发状态等都可以看到

在这里插入图片描述

把FreeRTOS-OpenRTOS -> Stack Checking 设置为ON后,可以查看每个task Stack情况(Min Free Stack 代表每个task剩余的可用Stack):

在这里插入图片描述

13.使用Terminal I/O查看log

通过C-SPY 的Terminal I/O,可以直接通过Debugger打印出log,非常方便调试
这样就不再需要借助串口打印log,免去串口接线,只需要接上调试器如常用的Jlink/STlink,就可以通过printf打印出log

Project ->Option中选择Stdout为via SWO(Serial Wire Output,串行线输出)
在这里插入图片描述

选择好相应的Debugger,下载程序运行,然后通过View->打开Teminal I/O窗口,就可直接查看printf 打印出的log。
(Printf不能被重定向到串口,否则将导致Terminal I/O无数据输出)

在这里插入图片描述


博主热门文章推荐:

一篇读懂系列:

LoRa Mesh系列:

网络安全系列:

嵌入式开发系列:

AI / 机器学习系列:


相关推荐
注册机分为三部分,分别为PartA,PartB,PartC 此注册机支持的软件如下:(2011年07月26日最新版) PartA: IAR Embedded Workbench For MSC-51 v8.10 IAR Embedded Workbench For Atmel AVR v5.51 IAR Embedded Workbench For Atmel AVR32 v4.10 IAR Embedded Workbench For ARM v6.21 IAR Embedded Workbench For Renesas M16C and R8C v3.50 IAR Embedded Workbench For NEC 78K v4.71 IAR Embedded Workbench For MSP430 v5.30 IAR Embedded Workbench For Samsung SAM8 v3.10A PartB: IAR Embedded Workbench For Dallas Semiconductor/Maxim MAXQ v2.30 IAR Embedded Workbench For NEC V850 v3.80 IAR Embedded Workbench For Renesas M32C v3.30 IAR Embedded Workbench For CR16C v3.10 IAR Embedded Workbench For Renesas R32C v1.31 IAR Embedded Workbench For Microchip PIC18 v3.10A IAR Embedded Workbench For Microchip dsPIC v1.40A IAR Embedded Workbench For Renesas RX v2.30 PartC: IAR Embedded Workbench For ColdFire v1.23 IAR Embedded Workbench For HCS12 v3.20 IAR Embedded Workbench For HCS08 v1.20 IAR Embedded Workbench For STM8 v1.30 IAR Embedded Workbench For Renesas SuperH v2.10 IAR Embedded Workbench For Renesas H8 v2.30 IAR Embedded Workbench For Renesas RL78 v1.10 截止目前,IAR官网上24款软件,只剩“Embedded Workbench for MK5 v1.25A”无法完成注册 当注册机运行于vista或者WIN7的系统下时,请右键点击然后使用管理员模式运行,或者将系统的UAC功能关闭后运行。 此注册机针对的是IAR官网上下载的EV版(评估板),至于从其他渠道获得的CD版或者FULL版的软件,没有测试。 本注册机仅限测试和学习IAR系列软件之用,请勿用于商业用途。请勿在网络上随意传播。 版本更新说明: --------------------------------------------------------------------------------------------------- ------- 20110726版: 更新 IAR Embedded Workbench For Atmel AVR32 v4.10 --------------------------------------------------------------------------------------------------- ------- 20110717版: 更新 IAR Embedded Workbench For NEC 78K v4.71 更新 IAR Embedded Workbench For MSP430 v5.30 更新 IAR Embedded Workbench For Renesas RX v2.30 更新 IAR Embedded Workbench For Renesas H8 v2.30 --------------------------------------------------------------------------------------------------- ------- 20110714版: 更新 IAR Embedded Workbench For ARM v6.21
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页