大家好,我是痞子衡,是正經搞技術的痞子,今天痞子衡給大家分享的是JLink Script檔案基礎及其在IAR下呼叫方法,
JLink可以說是MCU開發者最熟悉的除錯工具了,相比于其他除錯器(比如DAPLink、ST-LINK、I-jet等),JLink除了性能強大之外,還勝在其配套各種軟體小工具相當方便易用,JLink工具玩得熟的老司機一定在J-Link Commander命令列工具(即\SEGGER\JLink_Vxxx\JLink.exe)下敲過命令,讀寫記憶體、下載檔案、操控內核無所不能,這個底層工具其實也是JLink精華所在,今天痞子衡要講的JLink Script檔案主題其實就是依賴這個工具,

一、JLink Script作用
如果你有腳本語言經驗(比如Python),你應該很熟悉腳本語言那一套規則,腳本語言不同于一般編譯型語言(比如C),編譯型語言經過編譯鏈接生成的二進制機器碼被CPU直接識別執行,但腳本不需要預編譯,它是由配套解釋器動態翻譯執行的,而CPU負責執行的是腳本解釋器,
基于上述概念JLink.exe就是一個解釋器,它能解釋執行JLink Script檔案,其命令格式如下,使用-JLinkScriptFile引數指定JLink Script檔案路徑便可執行JLink Script檔案里的陳述句,
- 命令格式: JLink.exe -JLinkScriptFile MyFile.JLinkScript
為什么需要JLink Script檔案?有些情況下,需要定制J-Link執行的某些操作,比如J-Link連接順序或者執行復位的方式等,或者一些定制的硬體板需要一些特殊處理,這些動作沒法直接集成到J-Link軟體的通用處理里,因此需要被放在單獨的JLink Script檔案里,根據連接的具體目標物件來指定加載執行,
- Note:其實除了常見的明文腳本(.JLinkScript)檔案之外,JLink Script檔案還有另外一種經過預編譯的檔案形式(.pex),這種格式是純二進制的,可以保護腳本內容,
二、JLink Script檔案基礎
JLink Script這一套東西整體上由五大部分組成:基本語法、全域DLL變數、全域DLL常量、系統API介面、用戶自定義動作集,
2.1 腳本基礎語法
JLink Script并不是一個通用的腳本語言,因此其并不像你熟知的那些Python之類的腳本語言那樣語法完善,它僅是為了配合JLink完成一些必要操作,JLink Script語法跟C語言類似,支持C語言中允許的大多數陳述句(if else,while,變數宣告,…),但不是所有的陳述句,
此外,還有一些陳述句是特定于JLink Script的,JLink Script已經盡可能允許最大的靈活性,因此幾乎任何必要的目標初始化操作都可以得到支持,
- 語法簡明手冊: https://wiki.segger.com/J-Link_script_files#Script_file_language
2.2 全域DLL常/變數
JLink Script在被解釋執行時,其實是和JLink DLL(即\SEGGER\JLink_Vxxx\JLinkARM.dll)聯動的,DLL里存放了JLink各種底層功能集合,同時也默認預定義一些全域變數,這些變數用于DLL配置,需要在JLink Script中被賦值,比如最基礎的變數CPU,用于指示連接的目標內核型別,而支持的全部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 系統內置的API介面
JLink DLL中實作了很多基礎操作功能,這些功能通過API函式介面形式開放給JLink Script來呼叫,這些API全部以JLINK_為前綴,舉一個比較常用的API函式JLINK_TARGET_Halt(),這個函式功能就是掛起目標內核,
- API介面串列: https://wiki.segger.com/J-Link_script_files#Script_file_API_functions
2.4 用戶可自定義動作集
終于要講到JLink Script最關鍵的部分了,前面都是基礎,而JLink Script最核心的功能其實在用戶自定義動作集合里,這些動作由JLink預先定義,但是內部具體操作可由用戶來撰寫,在IDE在線下載除錯程序中按規定觸發條件來呼叫執行這些動作,下表列出了全部動作,其中藍框標出的四個動作最常用,
- InitTarget():替換J-Link DLL的目標CPU自動查找程序,對于默認情況下不可訪問且需要執行一些特殊步驟才能成功執行常規除錯連接程序的目標CPU非常有用,
- SetupTarget():在InitTarget()以及JLink常規除錯連接序列之后被呼叫,通常用于更高級別的CPU除錯設定,如寫入某些記憶體位置、初始化PLL以加快下載速度等,
- ResetTarget():替換DLL的復位策略,無論在DLL中選擇了什么復位型別,如果存在此函式,將呼叫它而不是DLL內部復位,
- AfterResetTarget():在ResetTarget()之后呼叫,復位結束后,用于初始化一些必要外設(比如看門狗),除此之外,對于某些內核型別有必要在復位后執行一些特殊操作,以保證復位后的設備功能正常,

- 自定義動作串列: https://wiki.segger.com/J-Link_script_files#Customizable_actions
三、JLink Script在IAR下呼叫方法
單純的JLink Script沒有意義,需要和工具鏈配合使用才能發揮最大作用,除了SEGGER工具之外(Embedded Studio、Ozone、SystemView),JLink Script還可以和常見的IDE環境(IAR/Keil/Eclipse)一起作業,痞子衡以IAR為例介紹三種呼叫JLink Script的方法(使用的是恩智浦i.MXRT685-EVK開發板做的測驗),
3.1 JLinkDevices.xml中指定
第一種方法是在 \SEGGER\JLink_Vxxx\JLinkDevices.xml 檔案中指定,如果你對這個檔案不了解,可先回顧下痞子衡之前寫的文章 《串行NOR Flash下載演算法(J-Link工具篇)》,
給板卡通上電,連上J-Link除錯器,隨便打開一個測驗工程(\SDK_xxx_EVK-MIMXRT685\boards\evkmimxrt685\demo_apps\hello_world\iar),選擇flash_debug,將其工程選項做如下更改:
- 設定內核為Cortex-M33,即不啟用Device里的NXP MIMXRT685S_CM33設定
- 除錯器選擇J-Link/J-Trace,且不要勾選Use flash loader(s)

這么做是為了在IAR下載時不用NXP MIMXRT685S_CM33默認指定的JLink下載演算法,而彈出一個框讓用戶主動選擇合適的JLink下載演算法,我們修改JLinkDevices.xml如下:
- Note: \SEGGER\JLink_Vxxx\Devices\NXP\iMXRT6xx_UFL\iMXRT6xx_CortexM33.JLinkScript便是我們要測驗的JLink Script,在里面我們可以加一句JLINK_SYS_Report("J-Link script: This UFL script comes from Segger package"); 便于檢查呼叫結果,

選好MIMXRT685_UFL這個指定下載演算法后,直接在IAR里點擊下載,進入正常除錯后,可以在Debug Log里看到iMXRT6xx_CortexM33.JLinkScript確實被呼叫了,

3.2 工程選項Debugger/Extra Options中指定
在上一小節測驗基礎上,將JLinkDevices.xml里的 JLinkScriptFile="Devices/NXP/iMXRT6xx_UFL/iMXRT6xx_CortexM33.JLinkScript" 這一句去掉,即不在下載演算法里直接呼叫JLink Script,然后將iMXRT6xx_CortexM33.JLinkScript檔案拷貝一份放到\SDK_xxx_EVK-MIMXRT685\boards\evkmimxrt685\demo_apps\hello_world\iar目錄下,并在IAR工程選項中做如下設定:
- Note: \SDK_xxx_EVK-MIMXRT685\boards\evkmimxrt685\demo_apps\hello_world\iar\iMXRT6xx_CortexM33.JLinkScript便是我們要測驗的JLink Script,在里面我們可以加一句JLINK_SYS_Report("J-Link script: This UFL script comes from Extra Option"); 便于檢查呼叫結果,

再次在IAR里點擊下載,進入正常除錯后,可以在Debug Log里看到新的iMXRT6xx_CortexM33.JLinkScript確實被呼叫了,

3.3 工程目錄settings檔案下指定
在上一小節測驗基礎上,不勾選IAR工程選項Extra Options中Use command line options,然后將iMXRT6xx_CortexM33.JLinkScript檔案拷貝一份放到\SDK_xxx_EVK-MIMXRT685\boards\evkmimxrt685\demo_apps\hello_world\iar\settings目錄下,需要重命名JLink Script檔案與測驗工程名一致:
- Note: \SDK_xxx_EVK-MIMXRT685\boards\evkmimxrt685\demo_apps\hello_world\iar\settings\hello_world_flash_debug.JLinkScript便是我們要測驗的JLink Script,在里面我們可以加一句JLINK_SYS_Report("J-Link script: This UFL script comes from settings"); 便于檢查呼叫結果,

再次在IAR里點擊下載,進入正常除錯后,可以在Debug Log里看到hello_world_flash_debug.JLinkScript確實被呼叫了,

至此,JLink Script檔案基礎及其在IAR下呼叫方法痞子衡便介紹完畢了,掌聲在哪里~~~
歡迎訂閱
文章會同時發布到我的 博客園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上,
微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦,

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/225077.html
標籤:其他
上一篇:痞子衡嵌入式:JLink Script檔案基礎及其在IAR下呼叫方法
下一篇:安卓系統默認UVC攝像頭怎么做?
