大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是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主頁、知乎主頁、微信公眾號 平臺上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。