為什麼需要JLink Script檔案?有些情況下,需要定制J-Link執行的某些操作,比如J-Link連接配接順序或者執行複位的方式等,或者一些定制的硬體闆需要一些特殊處理,這些動作沒法直接內建到J-Link軟體的通用處理裡,是以需要被放在單獨的JLink Script檔案裡,根據連接配接的具體目标對象來指定加載執行。
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是JLink Script檔案基礎及其在IAR下調用方法。
JLink可以說是MCU開發者最熟悉的調試工具了,相比于其他調試器(比如DAPLink、ST-LINK、I-jet等),JLink除了性能強大之外,還勝在其配套各種軟體小工具相當友善易用。JLink工具玩得熟的老司機一定在J-Link Commander指令行工具(即\SEGGER\JLink_Vxxx\JLink.exe)下敲過指令,讀寫記憶體、下載下傳檔案、操控核心無所不能。這個底層工具其實也是JLink精華所在,今天痞子衡要講的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這一套東西整體上由五大部分組成:基本文法、全局DLL變量、全局DLL常量、系統API接口、使用者自定義動作集。
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
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
JLink DLL中實作了很多基礎操作功能,這些功能通過API函數接口形式開放給JLink Script來調用,這些API全部以JLINK_為字首。舉一個比較常用的API函數JLINK_TARGET_Halt(),這個函數功能就是挂起目标核心。
API接口清單: https://wiki.segger.com/J-Link_script_files#Script_file_API_functions
終于要講到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沒有意義,需要和工具鍊配合使用才能發揮最大作用,除了SEGGER工具之外(Embedded Studio、Ozone、SystemView),JLink Script還可以和常見的IDE環境(IAR/Keil/Eclipse)一起工作,痞子衡以IAR為例介紹三種調用JLink Script的方法(使用的是恩智浦i.MXRT685-EVK開發闆做的測試)。
第一種方法是在 \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确實被調用了。
在上一小節測試基礎上,将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确實被調用了。
在上一小節測試基礎上,不勾選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首頁、知乎首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。