1. 程式人生 > >痞子衡嵌入式:JLink Script檔案基礎及其在IAR下呼叫方法

痞子衡嵌入式:JLink Script檔案基礎及其在IAR下呼叫方法

----   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是**JLink Script檔案基礎及其在IAR下呼叫方法**。   JLink可以說是MCU開發者最熟悉的除錯工具了,相比於其他偵錯程式(比如DAPLink、ST-LINK、I-jet等),JLink除了效能強大之外,還勝在其配套各種軟體小工具相當方便易用。JLink工具玩得熟的老司機一定在J-Link Commander命令列工具(即\SEGGER\JLink_Vxxx\JLink.exe)下敲過命令,讀寫記憶體、下載檔案、操控核心無所不能。這個底層工具其實也是JLink精華所在,今天痞子衡要講的JLink Script檔案主題其實就是依賴這個工具。 ![](http://henjay724.com/image/cnblogs/JLinkScriptFile_commander_snap.PNG) ### 一、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()之後呼叫。復位結束後,用於初始化一些必要外設(比如看門狗)。除此之外,對於某些核心型別有必要在復位後執行一些特殊操作,以保證復位後的裝置功能正常。 ![](http://henjay724.com/image/cnblogs/JLinkScriptFile_dll_api_list.PNG) > * 自定義動作列表: 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工具篇)》](https://www.cnblogs.com/henjay724/p/13770137.html)。   給板卡通上電,連上J-Link偵錯程式,隨便開啟一個測試工程(\SDK_xxx_EVK-MIMXRT685\boards\evkmimxrt685\demo_apps\hello_world\iar),選擇flash_debug,將其工程選項做如下更改: > 1. 設定核心為Cortex-M33,即不啟用Device裡的NXP MIMXRT685S_CM33設定 > 2. 偵錯程式選擇J-Link/J-Trace,且不要勾選Use flash loader(s) ![](http://henjay724.com/image/cnblogs/JLinkScriptFile_iar_proj_opt_cm33_jlink_flm.PNG)   這麼做是為了在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"); 便於檢查呼叫結果。 ![](http://henjay724.com/image/cnblogs/JLinkScriptFile_test_jlinkdevices_xml.PNG)   選好MIMXRT685_UFL這個指定下載演算法後,直接在IAR裡點選下載,進入正常除錯後,可以在Debug Log裡看到iMXRT6xx_CortexM33.JLinkScript確實被呼叫了。 ![](http://henjay724.com/image/cnblogs/JLinkScriptFile_test_iar_debug_info_for_jlinkdevices_xml.PNG) #### 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"); 便於檢查呼叫結果。 ![](http://henjay724.com/image/cnblogs/JLinkScriptFile_iar_proj_opt_extra_options.PNG)   再次在IAR裡點選下載,進入正常除錯後,可以在Debug Log裡看到新的iMXRT6xx_CortexM33.JLinkScript確實被呼叫了。 ![](http://henjay724.com/image/cnblogs/JLinkScriptFile_test_iar_debug_info_for_extra_option.PNG) #### 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"); 便於檢查呼叫結果。 ![](http://henjay724.com/image/cnblogs/JLinkScriptFile_test_put_script_to_settings.PNG)   再次在IAR裡點選下載,進入正常除錯後,可以在Debug Log裡看到hello_world_flash_debug.JLinkScript確實被呼叫了。 ![](http://henjay724.com/image/cnblogs/JLinkScriptFile_test_iar_debug_info_for_settings.PNG)   至此,JLink Script檔案基礎及其在IAR下呼叫方法痞子衡便介紹完畢了,掌聲在哪裡~~~ ### 歡迎訂閱 文章會同時釋出到我的 [部落格園主頁](https://www.cnblogs.com/henjay724/)、[CSDN主頁](https://blog.csdn.net/henjay724)、[知乎主頁](https://www.zhihu.com/people/henjay724)、[微信公眾號](http://weixin.sogou.com/weixin?type=1&query=痞子衡嵌入式) 平臺上。 微信搜尋"__痞子衡嵌入式__"或者掃描下面二維碼,就可以在手機上第一時間看了哦。 ![](http://henjay724.com/image/github/pzhMcu_qrcode_258x