痞子衡嵌入式:IAR內部C-SPY調試組件配套巨集文件(.mac)用法介紹

来源:https://www.cnblogs.com/henjay724/archive/2022/03/24/16052613.html
-Advertisement-
Play Games

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是IAR內部C-SPY調試組件配套巨集文件(.mac)用法。 痞子衡之前寫過一篇 《JLink Script文件基礎及其在IAR下調用方法》,那篇文章介紹了 J-Link 硬體調試器配套的 .JLinkScript 文件功能及用法,今天我們 ...



  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是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 在用户调试的过程中解释执行。

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

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

1. 调试流程自动化,例如跟踪打印输出,打印变量值,设置断点。
2. 配置板级硬件,例如初始化硬件寄存器、初始化外存。 
3. 在运行时为应用程序提供模拟数据。
4. 模拟外围设备(只适用于使用模拟器驱动程序的情况)
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 语句,系统宏函数调用(加 __ 前缀)。掌握示例函数里的语法基本就足够使用宏文件功能了。

// 定义函数,无参,默认返回值 0(缺省)
Peripheral_WaitSetDone()
{
    // 定义 reg 变量
    __var reg;
    do
    {
        // 读取 0x400D403C 地址处的值 (32bit)
        reg = __readMemory32(0x400D403C, "Memory");
        // 延时 10 ms
        __delay(10);
    // 判断 reg[1:0] 是否为 0
    }while((reg & 0x3) == 0);

    // 将 0x3 写入 0x400D403C 地址处
    __writeMemory32(0x00000003, 0x400D403C, "Memory");

    // 输出信息到 IAR 调试窗口
    __message "Message: Peripheral Reg Set Done\n";
}

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 调用执行。

execUserPreload()
{
    __message "--------execUserPreload() is called";;
}

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

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

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

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

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

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

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

欢迎订阅

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

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

  最后欢迎关注痞子衡个人微信公众号【痞子衡嵌入式】,一个专注嵌入式技术的公众号,跟着痞子衡一起玩转嵌入式。

痞子衡嵌入式-微信二维码 痞子衡嵌入式-微信收款二维码 痞子衡嵌入式-支付宝收款二维码

  衡杰(痞子衡),目前就职于恩智浦MCU系统部门,担任嵌入式系统应用工程师。

  专栏内所有文章的转载请注明出处:http://www.cnblogs.com/henjay724/

  与痞子衡进一步交流或咨询业务合作请发邮件至 [email protected]

  可以关注痞子衡的Github主页 https://github.com/JayHeng,有很多好玩的嵌入式项目。

  关于专栏文章有任何疑问请直接在博客下面留言,痞子衡会及时回复免费(划重点)答疑。

  痞子衡邮箱已被私信挤爆,技术问题不推荐私信,坚持私信请先扫码付款(5元起步)再发。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.前言 他總是微信撤回,是有什麼東西不能給我看嗎?我得想一個法子治治他,看看是不是在外面有人了,哈哈哈… 2 有微信聯想起的哲思 2.1 哲學思維開始冒頭 在這個信息量大增的信息時代,每天腦袋要處理很大的信息量,還是需要瞭解一點底層邏輯。 你看中國的名家,它甚至把的問題基本都提到了,也就是中國在前 ...
  • 很多小伙伴說自己的公司在監控自己有沒有摸魚、偷懶。有時候想偷偷懶都會被髮現,今天就帶大家來解開這神秘的面紗。搞懂了這個,估計你就知道怎麼去摸魚了。 監控鍵盤 如果公司偷偷在我們的電腦上運行了一個後臺進程,來監控我們的鍵盤事件,最簡單的 python 寫法大致是這樣的: from pynput imp ...
  • 方式一: 創建一個新的集合進行數據重覆元素的去除 //boolean contains(Object o):判斷集合中是否包含指定的元素 分析: * A:創建集合對象 * B:添加多個字元串元素(包含內容相同的) * C:創建新集合 * D:遍歷舊集合,獲取得到每一個元素 * E:拿這個元素到新集合 ...
  • 快下班了,今天給大家分享一下,平常我都是怎麼發送電子郵件,這個方法能夠幫助大家提高工作效率、,擺脫繁重的重覆性工作。一般我都會借用Python來實現自動化郵件發送,相信你用過這個方法之後就會愛上它。 Python有兩個內置庫:smtplib和email,能夠實現郵件功能,smtplib庫負責發送郵件 ...
  • 關係型的結構化存儲存在一定的弊端,因為它需要預先定義好所有的列以及列對應的類型。但是業務在發展過程中,或許需要擴展單個列的描述功能,這時,如果能用好 JSON 數據類型,那就能打通關係型和非關係型數據的存儲之間的界限,為業務提供更好的架構選擇。 當然,很多同學在用 JSON 數據類型時會遇到各種各樣 ...
  • 網關中間件-Nginx(一) 第一部分我們主要介紹如下幾點: 1.nginx的基本概念 2.nginx結合業務場景實現負載均衡 3.常見問題的舉例 這一部分主要介紹Nginx中限流,緩存,動靜分離,以及Nginx的集群搭建,如果涉及舉例的話,依然使用上一部分的業務 一、限流 1.為什麼要限流? 對於 ...
  • 對於語音識別,一般有實時語音識別和語音文件的識別處理等方式,如在會議、培訓等場景中,可以對錄製的文件進行文字的轉錄,對於轉錄文字的成功率來說,如果能夠轉換90%以上的正確語音內容,肯定能減輕很多相關語音文本編輯的繁瑣工作,而目前大多數語音轉錄的介面基本都能夠保證在這個成功率上,有些甚至超過98%以上... ...
  • .net core IdentityServer4 認證授權 token ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...