大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是IAR内部C-SPY调试组件配套宏文件(.mac)用法

  痞子衡之前写过一篇 《JLink Script文件基础及其在IAR下调用方法》,那篇文章介绍了 J-Link 硬件调试器配套的 .JLinkScript 文件功能及用法,今天我们要讲的主角 .mac 文件之于 IAR 内部 C-SPY 调试组件的作用就像 .JLinkScript 之于 J-Link 调试器的作用一样,.mac 文件也是为了完成在 IAR 下的特殊调试需求而存在的。

一、C-SPY宏(macros)作用

  我们知道在 IAR 开发环境下负责综合调度外部硬件调试器与芯片内部调试模块来完成用户实际调试需求的组件是 C-SPY,有了 C-SPY,你才可以愉快地在 IAR 里进行单步调试、打断点等操作。

  宏文件(.mac)是 C-SPY 组件定义和解释执行的一种专用类脚本文件,它的语法比较像 C 语言,但本质上是一种脚本语言,由 CSpyBat.exe 在用户调试的过程中解释执行。

  1. \IAR Systems\Embedded Workbench 9.10.2\common\bin\CSpyBat.exe

  宏文件的功能主要有以下 5 点,其中第 2 点配置板级硬件是最常用的功能。比如你想在板载外部 SDRAM 里直接调试工程代码执行,但是调试组件在下载程序进 SDRAM 之前需要一个已经初始化好的 SDRAM,这个 SDRAM 初始化工作就可以由宏文件来完成(当然修改 IDE flashloader 去完成也是一种可选方法)。

  1. 1. 调试流程自动化,例如跟踪打印输出,打印变量值,设置断点。
  2. 2. 配置板级硬件,例如初始化硬件寄存器、初始化外存。
  3. 3. 在运行时为应用程序提供模拟数据。
  4. 4. 模拟外围设备(只适用于使用模拟器驱动程序的情况)
  5. 5. 开发小的调试工具函数,例如计算堆栈深度,参见示例 \arm\src\sim\stack.mac

二、C-SPY宏文件基础

  C-SPY 宏文件这一套东西整体上由三大部分组成:基本语法、预定义系统宏函数、保留 setup 宏函数。

2.1 宏文件基础语法

  C-SPY 宏语言并不是一个通用的脚本语言,因此其并不像你熟知的那些 Python 之类的脚本语言那样语法完善,它仅是为了配合 C-SPY 完成一些必要操作。C-SPY 宏语法跟 C 语言类似,支持 C 语言中允许的大多数语句(if else,while,变量声明,…),但不是所有的语句。

  • 全部语法: \IAR Systems\Embedded Workbench 9.10.2\arm\doc\EWARM_DebuggingGuide.ENU 手册里的 BRIEFLY ABOUT THE MACRO LANGUAGE 章节

  下面是一个典型的用户自定义 C-SPY 宏函数示例(设置地址 0x400D403C 处寄存器的值),涉及的语法包括函数定义(支持参数和返回值),变量定义(统一为 __var 类型), 逻辑表达式, do while 语句,系统宏函数调用(加 __ 前缀)。掌握示例函数里的语法基本就足够使用宏文件功能了。

  1. // 定义函数,无参,默认返回值 0(缺省)
  2. Peripheral_WaitSetDone()
  3. {
  4. // 定义 reg 变量
  5. __var reg;
  6. do
  7. {
  8. // 读取 0x400D403C 地址处的值 (32bit)
  9. reg = __readMemory32(0x400D403C, "Memory");
  10. // 延时 10 ms
  11. __delay(10);
  12. // 判断 reg[1:0] 是否为 0
  13. }while((reg & 0x3) == 0);
  14. // 将 0x3 写入 0x400D403C 地址处
  15. __writeMemory32(0x00000003, 0x400D403C, "Memory");
  16. // 输出信息到 IAR 调试窗口
  17. __message "Message: Peripheral Reg Set Done\n";
  18. }

2.2 预定义系统宏功能

  C-SPY 宏体系里实现了很多基础操作功能,这些功能通过 API 函数接口形式开放给用户宏函数来调用,这些 API 全部以 __ 为前缀,大约有 100 多个 API。下面列举出最常用的一些宏 API:

系统宏原型 功能解释
__delay(value) ms级精度延时
__readAPReg(register)

__readDPReg(register)

__writeAPReg(data, register)

__writeDPReg(data, register)
读写内核 AP/DP 寄存器
__driverType(driver_id)

__gdbserver_exec_command("string")

__jlinkExecCommand(cmdstr)

__jtagCommand(ir)
与硬件调试器命令交互
__fillMemory8(value, address, zone, length, format)

__fillMemory16(value, address, zone, length, format)

__fillMemory32(value, address, zone, length, format)

__fillMemory64(value, address, zone, length, format)
按模板值设置指定内存范围
__writeMemory8(value, address, zone)

__writeMemoryByte(value, address, zone)

__writeMemory16(value, address, zone)

__writeMemory32(value, address, zone)

__writeMemory64(value, address, zone)

__readMemory8(address, zone)

__readMemoryByte(address, zone)

__readMemory16(address, zone)

__readMemory32(address, zone)

__readMemory64(address, zone)
读写指定内存地址处的数据
  • 全部系统宏 API: \IAR Systems\Embedded Workbench 9.10.2\arm\doc\EWARM_DebuggingGuide.ENU 手册里的 Summary of system macros

2.3 保留setup宏函数

  终于要讲到 C-SPY 宏最关键的部分了,前面都是基础,而 C-SPY 宏最核心的功能其实在保留 setup 宏函数里,这些 setup 宏函数由 C-SPY 预先定义,但是内部具体操作可由用户来编写。在 IAR 在线下载调试过程中按规定触发条件来调用执行这些函数,setup 宏函数里最常用的是 execUserPreload():

保留setup宏函数 应用场合 执行时机
execConfigureTraceETM 配置ETM/PTM模块相关寄存器 调试执行开始前
execConfigureTraceSWO 配置SWO调试口相关寄存器 调试执行开始前
execUserPreload 初始化板级硬件环境 调试器与CPU已建立连接但未下载应用程序前
execUserExecutionStarted 用户自定义 调试器开始执行应用程序指令前
execUserExecutionStopped 用户自定义 调试器结束执行应用程序指令后
execUserFlashInit 辅助flashloader功能,设置Flash相关内存映射环境 在调试器将flashloader下载进RAM之前
execUserSetup 初始化板级调试环境(硬件、断点、中断,宏文件) 调试器将应用程序下载完成后
execUserFlashReset 辅助flashloader功能 在调试器将flashloader下载进RAM之后,但还未开始执行flashloader前
execUserPreReset 设置需要的设备状态 在每次系统复位命令执行前
execUserReset 恢复数据 在每次系统复位命令执行后
execUserExit 保存状态数据 调试执行结束后
execUserFlashExit 辅助flashloader功能,保存状态数据 Flash下载完成后
execUserCoreConnect 做一些CPU连接前的准备动作 调试器刚建立连接,但尚未连接CPU

三、宏文件在IAR下使用方法

  宏文件在 IAR 下主要有两种调用执行方式,一种是由 C-SPY 在调试过程中自动执行(要借助保留 setup 宏函数),另一种是用户手动指定执行(此时可以不用保留 setup 宏函数):

3.1 在线调试时C-SPY自动执行

  不管是哪种调用方式,用户都需要首先准备一个宏文件(.mac),然后在 IAR 工程选项 Debugger / Setup / Setup macros 里勾选 Use macro file(s),并且指定宏文件路径。

  我们以恩智浦软件包 \SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\hello_world\cm7\iar 工程为例,在这个路径下创建一个测试用的 evkmimxrt1170_connect_cm7_test.mac 文件,并且将其指定为工程宏文件。

  在这个测试用的 .mac 文件里定义全部 13 个保留 setup 函数,函数体内不需要真实内容,只有下面这样的一句打印信息即可,便于我们在 IAR 调试信息窗口观察其有没有被 C-SPY 调用执行。

  1. execUserPreload()
  2. {
  3. __message "--------execUserPreload() is called";;
  4. }

  然后在 MIMXRT1170-EVK 板上借助板载 DAP-Link 调试器直接下载 RAM build 版本工程(即不涉及 flashloader),调试器复位类型为 Software,下面是 IAR 调试信息窗口的输出。从结果里看除了 ETM/SWO 相关 setup 宏函数和 flashloader 相关 setup 宏函数未被执行外,其余 setup 宏函数均如预期执行了:

  1. 1. 用户点击 IAR 在线调试按钮,启动 C-SPY
  2. 2. C-SPY 尝试调用 flashloader,但无数据需下载进Flash
  3. 3. C-SPY 预加载用户宏文件 evkmimxrt1170_connect_cm7_test.mac
  4. 4. C-SPY 与硬件调试器(DAP-Link)建立了连接
  5. 5. execUserCoreConnect() 被执行
  6. 6. C-SPY 连接上了芯片内核
  7. 7. execUserPreReset() 被执行
  8. 8. C-SPY 尝试执行软件复位(可能此处未执行成功)
  9. 9. execUserPreload() 被执行
  10. 10. C-SPY 将工程应用程序 hello_world_demo_cm7.out 下载进芯片内部 RAM
  11. 11. execUserPreReset() 被执行
  12. 12. C-SPY 执行了软件复位,芯片复位成功
  13. 13. execUserReset() 被执行
  14. 14. C-SPY 与芯片调试模块ETM交互
  15. 15. execUserSetup() 被执行
  16. 16. execUserExecutionStarted() 被执行
  17. 17. C-SPY 接管调试,断点停在 main 函数
  18. 18. execUserExecutionStopped() 被执行
  19. 19. 用户点击结束 IAR 在线调试
  20. 20. execUserExit() 被执行

  同样的实验在 Flash build 版本工程(即涉及 flashloader)上再做一次,调试器复位类型也为 Software,结果如下。此时结果与 RAM build 差异较大,因为默认 flashloader 配套 FlashIMXRT1170_FlexSPI.mac 文件也加入了战斗,我们测试用的 evkmimxrt1170_connect_cm7_test.mac 文件是在应用程序下载进 Flash 之后才出场的(记住这里的顺序,非常重要,痞子衡后面会另写文章着重介绍),因此这个测试用的 .mac 文件里的 flashloader 相关宏函数根本派不上用场:

  1. 1. 用户点击 IAR 在线调试按钮,启动 C-SPY
  2. 2. C-SPY 预加载 flashloader 配套宏文件 FlashIMXRT1170_FlexSPI.mac(里面仅定义了execUserFlashInit
  3. 3. C-SPY 与硬件调试器(DAP-Link)建立了连接
  4. 4. C-SPY 连接上了芯片内核
  5. 5. C-SPY 尝试执行软件复位(可能此处未执行成功)
  6. 6. execUserFlashInit() 被执行 - 来自 FlashIMXRT1170_FlexSPI.mac
  7. 7. C-SPY flashloader 加载进芯片内部 RAM
  8. 8. C-SPY 借助 flashloader 将工程应用程序 hello_world_demo_cm7.out 下载进板载外部 Flash
  9. 9. C-SPY 预加载用户宏文件 evkmimxrt1170_connect_cm7_test.mac
  10. 10. execUserPreload() 被执行
  11. 11. C-SPY 完成 Flash 下载的数据校验
  12. 12. execUserPreReset() 被执行
  13. 13. C-SPY 执行了软件复位,芯片复位成功
  14. 14. execUserReset() 被执行
  15. 15. C-SPY 与芯片调试模块ETM交互
  16. 16. execUserSetup() 被执行
  17. 17. execUserExecutionStarted() 被执行
  18. 18. C-SPY 接管调试,断点停在 main 函数
  19. 19. execUserExecutionStopped() 被执行
  20. 20. 用户点击结束 IAR 在线调试
  21. 21. execUserExit() 被执行

3.2 自定义条件触发或Watch窗口里手动指定执行

  宏文件的自定义触发或者手动调用方式主要跟深入调试有关,用于调试过程中的特殊需求,麦克泰写的一篇文章 《C-SPY setup macro file 的作用》 里给的两个示例就挺有参考意义的。比如我们可以在 IAR 的 Quick Watch 窗口手动填入 .mac 文件里宏函数,并单击执行,这时可在 IAR 调试信息窗口实时看到执行结果。

  至此,IAR内部C-SPY调试组件配套宏文件(.mac)用法痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:IAR内部C-SPY调试组件配套宏文件(.mac)用法介绍的更多相关文章

  1. 痞子衡嵌入式:大话双核i.MXRT1170之单独在线调试从核工程的方法(IAR篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170下单独在线调试从核工程的方法(基于IAR). 两年前痞子衡写过一篇<双核i.MXRT1170之Cortex-M ...

  2. 痞子衡嵌入式:IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致(J-Link / CMSIS-DAP)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致. 做Cortex-M内核MCU嵌入式软件开发,可用的集成开发环境( ...

  3. 痞子衡嵌入式:大话双核i.MXRT1170之在线联合调试双核工程的三种方法(IAR篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170下在线联合调试双核工程的方法(基于IAR). 前段时间痞子衡写过一篇<双核i.MXRT1170之单独在线调试从 ...

  4. 痞子衡嵌入式:浅析IAR下调试信息输出机制之半主机(Semihosting)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之半主机(Semihosting). 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我 ...

  5. 痞子衡嵌入式:浅析IAR下调试信息输出机制之硬件UART外设

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之硬件UART外设. 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我们可以比较容易地 ...

  6. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU硬件那些事(2.1)- 玩转板载OpenSDA,Freelink调试器

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列EVK上板载调试器的用法. 本文是i.MXRT硬件那些事系列第二篇,第一篇痞子衡给大家整体介绍了i.M ...

  7. 痞子衡嵌入式:JLink Script文件基础及其在IAR下调用方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是JLink Script文件基础及其在IAR下调用方法. JLink可以说是MCU开发者最熟悉的调试工具了,相比于其他调试器(比如DAP ...

  8. 痞子衡嵌入式:ARM Cortex-M调试那些事(1)- 4线协议标准(JTAG)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式调试里的接口标准JTAG. 在结束<ARM Cortex-M文件那些事>系列文章之后,痞子衡休整了一小段时间,但是讲课的 ...

  9. 痞子衡嵌入式:MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项(i.MXRT500为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项. 痞子衡前段时间写过一篇小文<为i.MXRT设计更 ...

随机推荐

  1. 精简的言语讲述技术人,必须掌握基础性IT知识技能,第一篇

    前言 此系列将以精简的言语讲述技术人,必须掌握基础性IT知识技能,请持续关注,希望给大家都是一些精简的干货. 第一部分:必须掌握的设计模式的6大基本原则 23个设计模式,都是从这六大设计模式中演化而来 ...

  2. PHP实习生面试准备的建议

    你好,是我琉忆.PHP程序员面试笔试图书系列作者. 今天就跟大家聊聊作为一个PHP程序员,每年的跳槽季都应该怎么准备一番. 其实普遍的跳槽季总的就有2个. 分别是新年后的3-4月,还有9-10月份. ...

  3. Solution -「CF 575G」Run for beer

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个点 \(m\) 条边的无向图,边有边权,一个人初始速度为 \(1\),每走一条边速度 \(\div10\), ...

  4. C++特殊成员函数及其生成机制

    在C++中,特殊成员函数指的是那些编译器在需要时会自动生成的成员函数.C++98中有四种特殊的成员函数,分别是默认构造函数.析构函数.拷贝构造函数和拷贝赋值运算符.而在C++11中,随着移动语义的引入 ...

  5. Wireshark教程之过滤器设置

    实验目的 1.工具介绍 2.主要应用 实验原理 1.网络管理员用来解决网络问题 2.网络安全工程师用来检测安全隐患 3.开发人员用来测试执行情况 4.学习网络协议 实验内容 1.抓取特定数据流 2.显 ...

  6. [Java]Java中的自动包装

    来源:https://www.cnblogs.com/cheapcrook/archive/2012/04/25/2470478.html 自动拆装箱(AutoBoxing) 是JDK1.5中新增加的 ...

  7. 市场竞争白热化,Smartbi Excel分析助力企业提高核心竞争力

    ​近年来,随着企业的数字化转型,数据已经成为企业的重要资产,用来支撑其业务决策.对业务数据进行全方位的分析,及时发现问题,调整经营策略,是企业做大做强的必要手段之一.特别是在市场竞争白热化的行业,更需 ...

  8. 传统式BI工具和自助式BI工具到底有什么区别

    相信很多人都听说过BI工具,但是你听说过自助BI工具吗?自助式BI工具面向没有IT背景的业务分析师,比传统的BI工具灵活易用,在一定程度上摆脱了对IT部门的大幅度依赖,使数据产品链更加大众化,更加理解 ...

  9. Java刷题时常用的标准库数据结构和相应算法

    目录 一.线性表(广义的数组) 1. 数组 一维数组的定义和初始化 二维数组的定义和初始化 Arrays工具类的一些常用方法 2. List接口容器 对象的构建 读写和插入删除数据 排序 反转数组 二 ...

  10. C# Struct结构的介绍

    C# (Struct)结构的介绍 在 C# 中,所有简单值类型都是结构类型.结构类型是一种可封装数据和相关功能的值类型 ,是隐式密封的值类型,不可继承. 使用 struct 关键字定义结构类型.str ...