痞子衡嵌入式:Keil線上除錯時設不同復位型別可能會導致i.MXRT下除錯現象不一致(J-Link/DAPLink)

痞子衡發表於2021-06-20

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是Keil線上除錯時設不同復位型別可能會導致i.MXRT下除錯現象不一致

  本篇是 《IAR EWARM復位型別》《MCUXpresso IDE復位型別》的同系列篇,三大經典IDE(IAR EWARM、Keil MDK、MCUXpresso IDE)下的復位策略只剩 Keil MDK 沒介紹了,心事不了,覺睡不好。今天痞子衡就來認真講一下搞嵌入式生涯裡最早接觸的 IDE - Keil,完結這個系列。

  • Note: 痞子衡測試的Keil MDK版本是v5.31。

一、Keil除錯機制與除錯分類

  關於 Keil MDK 下的除錯機制原理在 \Keil_v5\ARM\Hlp 目錄下沒有找到專門的設計性文件,IDE 幫助手冊 uv4.chm 裡 Debugging 章節更多是介紹如何在 IDE 裡使用下載除錯功能。

  不過除錯機制在各 IDE 上大同小異,設計理念都是一致的,這部分建議參考 《IAR EWARM復位型別》 裡的一、二章節。

二、復位型別全解析

  好了,現在我們進入正題,開始介紹 Keil 下復位型別。我們知道不同硬體模擬器下復位功能有差異,痞子衡主要介紹 i.MXRT 上兩種最常用的模擬器:J-Link 和 DAPLink。此外不管是哪種模擬器,其都藉助了 Cortex-M7 核心功能,核心在 SCB 模組的 AIRCR 暫存器中整合了復位的支援,詳見 《IAR EWARM復位型別》3.1 Cortex-M7復位功能 小節。

2.1 J-Link復位型別

  Keil 裡關於 J-Link 連線(Connect)和復位(Reset)是兩級設定,先連線後復位,並且復位動作僅在勾選了"Reset after Connect"之後才有效。實際使用中推薦 Connect 選項固定設為"Normal",且勾選上"Reset after Connect",然後在 Reset 選項裡指定想要的復位型別。

Note: 詳細介紹可以檢視 \Keil_v5\ARM\Hlp\jlink.chm 文件中 Debug 小節

  連線型別選項:

  • Normal:預設的連線策略,連線後只是將 PC 停在當前執行的指令處
  • with Pre–reset:在連線前,先執行一次 HW RESET
  • under Reset:在連線過程中一直保持 HW RESET 有效(該選項適用於使用者程式誤將 JTAG/SWD 禁掉的情況)

  復位型別選項:

  • Normal(復位編號0):預設的復位策略,對於i.MXRT來說等同於Core and peripherals方式
  • Core(復位編號1):藉助Cortex-M核心模組SCB中的AIRCR暫存器的VECTRESET位功能來複位Core
  • Reset Pin(復位編號2):通過拉低J-Link的RESET引腳(一般也會接到MCU reset腳)來複位MCU
  • Core and peripherals(復位編號8):藉助Cortex-M核心模組SCB中的AIRCR暫存器的VECTRESET位和SYSRESETREQ位來同時復位Core和MCU外設模組

  剩下幾種復位型別不適用i.MXRT,暫不介紹。

2.2 DAPLink復位型別

  Keil 裡關於 DAP-Link 連線(Connect)和復位(Reset)也是兩級設定,先連線後復位,並且復位動作僅在勾選了"Reset after Connect"之後才有效。實際使用中推薦 Connect 選項固定設為"Normal",且勾選上"Reset after Connect",然後在 Reset 選項裡指定想要的復位型別。此外相比 J-Link 還多一個 "Stop after Reset "選項,這個選項用於永久使能應用程式復位向量的捕獲,我們一般不勾選。

Note: 詳細介紹可以檢視 \Keil_v5\ARM\Hlp\dapdebug.chm 文件中 Debug 小節

  連線型別選項:

  • Normal:預設的連線策略,連線後只是將 PC 停在當前執行的指令處
  • with Pre–reset:在連線前,先執行一次 HW RESET
  • under Reset:在連線過程中一直保持 HW RESET 有效(該選項適用於使用者程式誤將 JTAG/SWD 禁掉的情況)
  • without Stop:連線後任 CPU 自由執行(適用於觀測儲存器或者外設 SFR 情況)

  復位型別選項:

  • HW RESET:通過翻轉DAPLink的nSRST/nRESET引腳(一般也會接到MCU reset腳)來複位MCU
  • SYSRESETREQ:藉助Cortex-M核心模組SCB中的AIRCR暫存器的SYSRESETREQ位來同時復位MCU外設模組
  • VECTRESET:藉助Cortex-M核心模組SCB中的AIRCR暫存器的VECTRESET位功能來複位Core

三、復位型別對線上除錯的影響

  復位型別對線上除錯的影響分兩種:一、是否影響應用程式正常除錯;二、是否影響應用程式正常執行。對於第二點,因為應用程式的設計差異,無法確定復位型別的不同導致的未復位模組對其產生何種影響,因此我們暫不討論這點,我們主要看第一點。

  設定不同的復位型別是否影響應用程式正常除錯(能否停在程式入口函式,能否進行單步)?痞子衡在MIMXRT1050-EVKB上實測了SDK裡的led_blinky例程,選取了flexspi_nor_debug(在Flash)build做了很多組測試,結果如下:

例程Build 模擬器 復位型別 BootMode 除錯現象
debug J-Link
DAPLink
所有的(除了DAPLink下HW RESET) 2'b01 - SDP
2'b10 - Flash Boot
正常下載與除錯
flexspi_nor_debug J-Link - Core 2'b01 - SDP
2'b10 - Flash Boot
正常下載與除錯
flexspi_nor_debug J-Link - Normal
- Core and peripherals
2'b01 - SDP 關閉校驗後可正常下載,但無法除錯
flexspi_nor_debug J-Link - Normal
- Core and peripherals
2'b10 - Flash Boot 關閉校驗後可正常下載,能正常除錯
flexspi_nor_debug J-Link - Reset Pin 2'b01 - SDP 正常下載,但無法除錯
flexspi_nor_debug J-Link - Reset Pin 2'b10 - Flash Boot 正常下載與除錯
flexspi_nor_debug DAPLink - VECTRESET 2'b01 - SDP
2'b10 - Flash Boot
正常下載與除錯
flexspi_nor_debug DAPLink - SYSRESETREQ 2'b01 - SDP 關閉校驗後可正常下載,但無法除錯
flexspi_nor_debug DAPLink - SYSRESETREQ 2'b10 - Flash Boot 正常下載與除錯
flexspi_nor_debug DAPLink - HW RESET 2'b01 - SDP
2'b10 - Flash Boot
無法下載,報錯無法停止CPU

  從上表的測試結果,我們可以得到如下結論:

  • 結論1:在Flash除錯,要想正常除錯,要麼不復位片上外設(保留Flashloader對FlexSPI等模組的初始化),要麼啟動模式設成Flash Boot(讓BootROM完成FlexSPI等模組的初始化),因為Clock/GPIO/FlexSPI的初始化必須保留,CPU才能正常獲得Flash裡指令。
  • 結論2:JLink復位下,Keil MDK除錯體驗與其他IDE是一致的。
  • 結論3:DAPLink復位下,Keil MDK下HW RESET方式復位可能會報奇怪的核心連線錯誤。

  至此,Keil線上除錯時設不同復位型別可能會導致i.MXRT下除錯現象不一致現象痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

文章會同時釋出到我的 部落格園主頁CSDN主頁知乎主頁微信公眾號 平臺上。

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

相關文章