大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是i.MXRT1170上安全調試策略實現對JLink調試的影響。
痞子衡之前寫過一篇舊文 《i.MXRT600的ISP模式下用J-Link連接后PC總是停在0x1c04a》,這篇文章詳細解釋了 Debug Mailbox 機制對 J-Link 調試體驗的影響。我們知道 Debug Mailbox 是 i.MXRT 三位數系列(i.MXRT500/600)獨有的外設模塊,但是在 i.MXRT1170 上使用 J-Link 調試似乎存在跟 i.MXRT 三位數系列下類似的體驗,這個體驗明顯跟 i.MXRT10xx 系列下不同,而且 i.MXRT1170 中沒有 Debug Mailbox 模塊,這是怎么回事?且聽痞子衡細聊:
一、引出調試問題
按照我們之前在 i.MXRT1050 上的調試經驗,將芯片設為串行下載模式后,使用 JLink 連接上芯片,並 halt 住內核,此時芯片 PC 是正常停在 ROM 區域的(不斷 go 和 halt 命令交替執行,PC 值是一直在變化的),讓我們同樣的過程在 i.MXRT1170 上也操作一次:
我們發現 PC 固定指向了 0x223104,並且不管你如何 reset 再重新 halt,它一直停在這個地方,這是怎么回事?
二、ROM中調試安全策略實現
不同於 i.MXRT 三位數系列中有專門寄存器 RSTCTRL0->SYSRSTSTAT[5] 記錄內核軟復位狀態(warm reset)以便 BootROM 初始化階段根據此狀態來進入 Debug Mailbox 安全調試流程,在 i.MXRT1170 上是一種全新的方式,BootROM 利用了一個未開放的調試中斷(中斷號 52),該調試中斷被使能后,當調試口接收到調試請求時,該中斷便會被觸發。
i.MXRT1170 BootROM 初始化階段會立即使能這個 Reserved68_IRQn 中斷,並且用一個全局變量(is_debug_pending)記錄該中斷觸發狀態。在 BootROM 執行過程中,一旦調試中斷觸發,在其中斷響應函數里會將 is_debug_pending 置起來,並且立刻關閉 Reserved68_IRQn 中斷(不需要二次響應),然后 BootROM 兩個主階段( Serial Downloader 和 Device Boot)流程里都會有對 is_debug_pending 狀態的處理,只要 is_debug_pending 被置起來,BootROM 就會立即結束正常主流程,轉而做一些安全化的處理(HAB狀態清理、恢復時鍾/外設、中斷相關狀態善后),最后便進入如下 debug_loop_routine() 函數,__ASM("B .") 指令地址就在 0x223104,這就是 i.MXRT1170 上的調試安全設計,其實是一種簡化的 Debug Mailbox 機制。
#define LPSR_GPR41 (*(volatile uint32_t *)0x40c0c0a4)
void debug_loop_routine(void)
{
while (!(LPSR_GPR41 & (1ul << 24)));
register uint32_t dummy = OCOTP->VERSION;
#if (defined(__ICCARM__))
__ASM("B .");
#endif
}
三、安全策略對JLink調試的影響
基於上面分析,最后痞子衡再總結一下這個安全策略對 JLink 調試的影響:
- 當芯片在ROM中執行(比如SDP模式,比如Flash中沒有應用程序)時,用JLink連接芯片,halt住內核,PC總是停在0x223104,這是安全調試策略決定的。
- 當芯片正常啟動Flash里的應用程序后(即離開了ROM),用JLink連接芯片,halt住內核,PC指向的是真實的應用程序位置。
- 當JLink連接上芯片后,只要執行reset命令,都會直接進入安全調試模式(PC停在0x223104)。
至此,i.MXRT1170上安全調試策略實現對JLink調試的影響痞子衡便介紹完畢了,掌聲在哪里~~~
歡迎訂閱
文章會同時發布到我的 博客園主頁、CSDN主頁、知乎主頁、微信公眾號 平台上。
微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。