大家好,我是痞子衡,是正經(jīng)搞技術的痞子。今天痞子衡給大家分享的是 JLink Script 文件基礎及其在 IAR 下調(diào)用方法。
JLink 可以說是 MCU 開發(fā)者最熟悉的調(diào)試工具了,相比于其他調(diào)試器(比如 DAPLink、ST-LINK、I-jet 等),JLink 除了性能強大之外,還勝在其配套各種軟件小工具相當方便易用。JLink 工具玩得熟的老司機一定在 J-Link Commander 命令行工具(即 SEGGERJLink_VxxxJLink.exe)下敲過命令,讀寫內(nèi)存、下載文件、操控內(nèi)核無所不能。這個底層工具其實也是 JLink 精華所在,今天痞子衡要講的 JLink Script 文件主題其實就是依賴這個工具。
?
一、JLink Script 作用
如果你有腳本語言經(jīng)驗(比如 Python),你應該很熟悉腳本語言那一套規(guī)則,腳本語言不同于一般編譯型語言(比如 C),編譯型語言經(jīng)過編譯鏈接生成的二進制機器碼被 CPU 直接識別執(zhí)行,但腳本不需要預編譯,它是由配套解釋器動態(tài)翻譯執(zhí)行的,而 CPU 負責執(zhí)行的是腳本解釋器。
基于上述概念 JLink.exe 就是一個解釋器,它能解釋執(zhí)行 JLink Script 文件,其命令格式如下,使用 -JLinkScriptFile 參數(shù)指定 JLink Script 文件路徑便可執(zhí)行 JLink Script 文件里的語句。
- 命令格式:JLink.exe -JLinkScriptFile MyFile.JLinkScript
為什么需要 JLink Script 文件?有些情況下,需要定制 J-Link 執(zhí)行的某些操作,比如 J-Link 連接順序或者執(zhí)行復位的方式等,或者一些定制的硬件板需要一些特殊處理,這些動作沒法直接集成到 J-Link 軟件的通用處理里,因此需要被放在單獨的 JLink Script 文件里,根據(jù)連接的具體目標對象來指定加載執(zhí)行。
- Note:其實除了常見的明文腳本(.JLinkScript)文件之外,JLink Script 文件還有另外一種經(jīng)過預編譯的文件形式(.pex),這種格式是純二進制的,可以保護腳本內(nèi)容。
二、JLink Script 文件基礎
JLink Script 這一套東西整體上由五大部分組成:基本語法、全局 DLL 變量、全局 DLL 常量、系統(tǒng) API 接口、用戶自定義動作集。
?
2.1 腳本基礎語法
JLink Script 并不是一個通用的腳本語言,因此其并不像你熟知的那些 Python 之類的腳本語言那樣語法完善,它僅是為了配合 JLink 完成一些必要操作。JLink Script 語法跟 C 語言類似,支持 C 語言中允許的大多數(shù)語句(if else,while,變量聲明,…),但不是所有的語句。
此外,還有一些語句是特定于 JLink Script 的,JLink Script 已經(jīng)盡可能允許最大的靈活性,因此幾乎任何必要的目標初始化操作都可以得到支持。
- 語法簡明手冊:https://wiki.segger.com/J-Link_script_files#Script_file_language
?
2.2 全局 DLL 常 / 變量
JLink Script 在被解釋執(zhí)行時,其實是和 JLink DLL(即 SEGGERJLink_VxxxJLinkARM.dll)聯(lián)動的,DLL 里存放了 JLink 各種底層功能集合,同時也默認預定義一些全局變量,這些變量用于 DLL 配置,需要在 JLink Script 中被賦值。比如最基礎的變量 CPU,用于指示連接的目標內(nèi)核類型,而支持的全部 CPU 類型都定義在全局常量里。
- 變量列表:https://wiki.segger.com/J-Link_script_files#Global_DLL_variables 常量列表:https://wiki.segger.com/J-Link_script_files#Global_DLL_constants
?
2.3 系統(tǒng)內(nèi)置的 API 接口
JLink DLL 中實現(xiàn)了很多基礎操作功能,這些功能通過 API 函數(shù)接口形式開放給 JLink Script 來調(diào)用,這些 API 全部以 JLINK_ 為前綴。舉一個比較常用的 API 函數(shù) JLINK_TARGET_Halt(),這個函數(shù)功能就是掛起目標內(nèi)核。
- API 接口列表:https://wiki.segger.com/J-Link_script_files#Script_file_API_functions
?
2.4 用戶可自定義動作集
終于要講到 JLink Script 最關鍵的部分了,前面都是基礎,而 JLink Script 最核心的功能其實在用戶自定義動作集合里,這些動作由 JLink 預先定義,但是內(nèi)部具體操作可由用戶來編寫。在 IDE 在線下載調(diào)試過程中按規(guī)定觸發(fā)條件來調(diào)用執(zhí)行這些動作,下表列出了全部動作,其中藍框標出的四個動作最常用。
- InitTarget():替換 J-Link DLL 的目標 CPU 自動查找過程。對于默認情況下不可訪問且需要執(zhí)行一些特殊步驟才能成功執(zhí)行常規(guī)調(diào)試連接過程的目標 CPU 非常有用。SetupTarget():在 InitTarget()以及 JLink 常規(guī)調(diào)試連接序列之后被調(diào)用,通常用于更高級別的 CPU 調(diào)試設置,如寫入某些內(nèi)存位置、初始化 PLL 以加快下載速度等。ResetTarget():替換 DLL 的復位策略。無論在 DLL 中選擇了什么復位類型,如果存在此函數(shù),將調(diào)用它而不是 DLL 內(nèi)部復位。AfterResetTarget():在 ResetTarget()之后調(diào)用。復位結束后,用于初始化一些必要外設(比如看門狗)。除此之外,對于某些內(nèi)核類型有必要在復位后執(zhí)行一些特殊操作,以保證復位后的設備功能正常。
- 自定義動作列表:https://wiki.segger.com/J-Link_script_files#Customizable_actions
?
三、JLink Script 在 IAR 下調(diào)用方法
單純的 JLink Script 沒有意義,需要和工具鏈配合使用才能發(fā)揮最大作用,除了 SEGGER 工具之外(Embedded Studio、Ozone、SystemView),JLink Script 還可以和常見的 IDE 環(huán)境(IAR/Keil/Eclipse)一起工作,痞子衡以 IAR 為例介紹三種調(diào)用 JLink Script 的方法(使用的是恩智浦 i.MXRT685-EVK 開發(fā)板做的測試)。
?
3.1 JLinkDevices.xml 中指定
第一種方法是在 SEGGERJLink_VxxxJLinkDevices.xml 文件中指定,如果你對這個文件不了解,可先回顧下痞子衡之前寫的文章 《串行 NOR Flash 下載算法(J-Link 工具篇)》。
給板卡通上電,連上 J-Link 調(diào)試器,隨便打開一個測試工程(SDK_xxx_EVK-MIMXRT685boardsevkmimxrt685demo_appshello_worldiar),選擇 flash_debug,將其工程選項做如下更改:
這么做是為了在 IAR 下載時不用 NXP MIMXRT685S_CM33 默認指定的 JLink 下載算法,而彈出一個框讓用戶主動選擇合適的 JLink 下載算法,我們修改 JLinkDevices.xml 如下:
- Note:SEGGERJLink_VxxxDevicesNXPiMXRT6xx_UFLiMXRT6xx_CortexM33.JLinkScript 便是我們要測試的 JLink Script,在里面我們可以加一句 JLINK_SYS_Report("J-Link script: This UFL script comes from Segger package"); 便于檢查調(diào)用結果。
選好 MIMXRT685_UFL 這個指定下載算法后,直接在 IAR 里點擊下載,進入正常調(diào)試后,可以在 Debug Log 里看到 iMXRT6xx_CortexM33.JLinkScript 確實被調(diào)用了。
?
3.2 工程選項 Debugger/Extra Options 中指定
在上一小節(jié)測試基礎上,將 JLinkDevices.xml 里的 JLinkScriptFile="Devices/NXP/iMXRT6xx_UFL/iMXRT6xx_CortexM33.JLinkScript" 這一句去掉,即不在下載算法里直接調(diào)用 JLink Script。然后將 iMXRT6xx_CortexM33.JLinkScript 文件拷貝一份放到 SDK_xxx_EVK-MIMXRT685boardsevkmimxrt685demo_appshello_worldiar 目錄下,并在 IAR 工程選項中做如下設置:
- Note:SDK_xxx_EVK-MIMXRT685boardsevkmimxrt685demo_appshello_worldiariMXRT6xx_CortexM33.JLinkScript 便是我們要測試的 JLink Script,在里面我們可以加一句 JLINK_SYS_Report("J-Link script: This UFL script comes from Extra Option"); 便于檢查調(diào)用結果。
再次在 IAR 里點擊下載,進入正常調(diào)試后,可以在 Debug Log 里看到新的 iMXRT6xx_CortexM33.JLinkScript 確實被調(diào)用了。
?
3.3 工程目錄 settings 文件下指定
在上一小節(jié)測試基礎上,不勾選 IAR 工程選項 Extra Options 中 Use command line options。然后將 iMXRT6xx_CortexM33.JLinkScript 文件拷貝一份放到 SDK_xxx_EVK-MIMXRT685boardsevkmimxrt685demo_appshello_worldiarsettings 目錄下,需要重命名 JLink Script 文件與測試工程名一致:
- Note:SDK_xxx_EVK-MIMXRT685boardsevkmimxrt685demo_appshello_worldiarsettingshello_world_flash_debug.JLinkScript 便是我們要測試的 JLink Script,在里面我們可以加一句 JLINK_SYS_Report("J-Link script: This UFL script comes from settings"); 便于檢查調(diào)用結果。
再次在 IAR 里點擊下載,進入正常調(diào)試后,可以在 Debug Log 里看到 hello_world_flash_debug.JLinkScript 確實被調(diào)用了。
至此,JLink Script 文件基礎及其在 IAR 下調(diào)用方法痞子衡便介紹完畢了,掌聲在哪里~~~