痞子衡嵌入式:JLink Script文件基礎及其在IAR下調用方法


  你們好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給你們分享的是JLink Script文件基礎及其在IAR下調用方法html

  JLink能夠說是MCU開發者最熟悉的調試工具了,相比於其餘調試器(好比DAPLink、ST-LINK、I-jet等),JLink除了性能強大以外,還勝在其配套各類軟件小工具至關方便易用。JLink工具玩得熟的老司機必定在J-Link Commander命令行工具(即\SEGGER\JLink_Vxxx\JLink.exe)下敲過命令,讀寫內存、下載文件、操控內核無所不能。這個底層工具其實也是JLink精華所在,今天痞子衡要講的JLink Script文件主題其實就是依賴這個工具。算法

  若是你有腳本語言經驗(好比Python),你應該很熟悉腳本語言那一套規則,腳本語言不一樣於通常編譯型語言(好比C),編譯型語言通過編譯連接生成的二進制機器碼被CPU直接識別執行,但腳本不須要預編譯,它是由配套解釋器動態翻譯執行的,而CPU負責執行的是腳本解釋器。api

  基於上述概念JLink.exe就是一個解釋器,它能解釋執行JLink Script文件,其命令格式以下,使用-JLinkScriptFile參數指定JLink Script文件路徑即可執行JLink Script文件裏的語句。微信

  • 命令格式: JLink.exe -JLinkScriptFile MyFile.JLinkScript

  爲何須要JLink Script文件?有些狀況下,須要定製J-Link執行的某些操做,好比J-Link鏈接順序或者執行復位的方式等,或者一些定製的硬件板須要一些特殊處理,這些動做無法直接集成到J-Link軟件的通用處理裏,所以須要被放在單獨的JLink Script文件裏,根據鏈接的具體目標對象來指定加載執行。app

  • Note:其實除了常見的明文腳本(.JLinkScript)文件以外,JLink Script文件還有另一種通過預編譯的文件形式(.pex),這種格式是純二進制的,能夠保護腳本內容。

  JLink Script這一套東西總體上由五大部分組成:基本語法、全局DLL變量、全局DLL常量、系統API接口、用戶自定義動做集。函數

2.1 腳本基礎語法

  JLink Script並非一個通用的腳本語言,所以其並不像你熟知的那些Python之類的腳本語言那樣語法完善,它僅是爲了配合JLink完成一些必要操做。JLink Script語法跟C語言相似,支持C語言中容許的大多數語句(if else,while,變量聲明,…),但不是全部的語句。工具

  此外,還有一些語句是特定於JLink Script的,JLink Script已經儘量容許最大的靈活性,所以幾乎任何須要的目標初始化操做均可以獲得支持。性能

2.2 全局DLL常/變量

  JLink Script在被解釋執行時,實際上是和JLink DLL(即\SEGGER\JLink_Vxxx\JLinkARM.dll)聯動的,DLL裏存放了JLink各類底層功能集合,同時也默認預約義一些全局變量,這些變量用於DLL配置,須要在JLink Script中被賦值。好比最基礎的變量CPU,用於指示鏈接的目標內核類型,而支持的所有CPU類型都定義在全局常量裏。測試

2.3 系統內置的API接口

  JLink DLL中實現了不少基礎操做功能,這些功能經過API函數接口形式開放給JLink Script來調用,這些API所有以JLINK_爲前綴。舉一個比較經常使用的API函數JLINK_TARGET_Halt(),這個函數功能就是掛起目標內核。.net

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()以後調用。復位結束後,用於初始化一些必要外設(好比看門狗)。除此以外,對於某些內核類型有必要在復位後執行一些特殊操做,以保證復位後的設備功能正常。

  單純的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,將其工程選項作以下更改:

  1. 設置內核爲Cortex-M33,即不啓用Device裏的NXP MIMXRT685S_CM33設置
  2. 調試器選擇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主頁知乎主頁微信公衆號 平臺上。

微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就能夠在手機上第一時間看了哦。

相關文章
相關標籤/搜索