大家好,我是痞子衡,是正經搞技術的痞子,今天痞子衡給大家分享的是IAR在線除錯時設不同復位型別可能會導致i.MXRT下除錯現象不一致,
做Cortex-M內核MCU嵌入式軟體開發,可用的集成開發環境(IDE)非常多,經典的GCC咱們就不提了,選擇不同MCU主控,如果MCU來自知名大廠,廠商也會配套推出專用IDE(比如恩智浦半導體的MCUXpresso IDE,意法半導體的TrueSTUDIO、STM32CubeIDE),除此以外,還有幾個來自專門軟體公司的獨立IDE,比如Keil MDK、IAR EWARM,因為獨立IDE不與具體MCU廠商捆綁,并且為了保持商業上的競爭力,往往在性能和易用性上表現得更好,所以市場占有率居高不下,
痞子衡求學期間主要使用Keil MDK,參加作業后一直在用IAR EWARM,剛畢業的時候用的IAR版本是v6.50,七年過去了,如今IAR也發展到了v8.50,界面變得更漂亮了,功能也越發強大,所以底下痞子衡會陸續介紹IAR使用經驗小細節,痞子衡今天要講的是在線除錯時的復位型別設定對i.MXRT除錯執行的影響,
一、IAR除錯機制
在講IAR除錯中復位型別設定小細節前先給大家簡單介紹一下IAR的除錯機制,下圖是典型的嵌入式開發除錯硬體連接,首先你得有一塊MCU主控板,板子上要引出除錯口(JTAG/SWD),然后你得有一個硬體仿真器(比如J-Link/DAPLink),通過仿真器將你的PC和MCU板連接起來,PC上用IAR打開你的應用程式工程,然后你就可以愉快地除錯解bug了,

你應該知道MCU里內置了Cortex-M除錯模塊,IAR借助硬體仿真器可以通過除錯口與MCU除錯模塊互動,收發除錯資料,但是你知道IAR里是誰在負責除錯功能嗎?是C-SPY,它是IAR內置的專用除錯組件,你在除錯時查看匯編代碼,修改變數資料,設斷點,單步,檢查call stack等功能全是它在后臺默默完成的,下圖是C-SPY與所有潛在目標系統的聯合作業簡圖,其中藍色框標出來的方式適用我們常見的與J-Link/DAPLink聯合使用的場景:

C-SPY支持的硬體仿真器型別非常全,這都是通過設計對應的C-SPY驅動來實作的,不同的仿真器下支持的除錯特性不同,具體可以查看 \IAR Systems\Embedded Workbench x.xx.x\arm\doc\EWARM_DebuggingGuide.ENU 檔案中的"Driver differences, I-jet, J-Link/J-Trace and ST-LINK"一表,
二、兩種除錯分類(在Flash/在RAM)
在i.MXRT上根據應用程式代碼(read only段)鏈接位置所屬的存盤器性質,在線除錯主要分為兩類:在外部Flash除錯和在內部SRAM除錯(在外部SDRAM/HyperRAM除錯暫不在考慮范疇),
因為外部Flash資料不能像內部SRAM上那樣直接寫入,需要呼叫額外的Flash下載演算法才能寫入,因此C-SPY處理在Flash除錯和在SRAM除錯的流程有一些區別,
首先來看C-SPY處理在內部SRAM除錯的流程,C-SPY除錯器啟動后設定好合適的JTAG速度后便開始掛起目標板上的CPU(即MCU中Cortex-M內核),然后直接通過JTAG口和AHB總線往目標板上的MCU內部SRAM里寫入應用程式鏡像資料,寫完再進行可選的資料校驗和用戶Reset/Setup后便可以操控CPU開始執行SRAM里的應用程式,

再來看C-SPY處理在外部Flash除錯的流程,C-SPY除錯器掛起CPU后先是往MCU內部SRAM里加載了一個Flashloader程式(即Flash下載演算法),然后讓CPU執行Flashloader來完成應用程式鏡像資料的Flash燒寫,燒寫完成之后再次掛起CPU,進行可選的資料校驗和用戶Reset/Setup后便操控CPU開始執行Flash里的應用程式,

你需要特別留意一下這兩張流程圖里可選的CPU reset動作,我們看到在SRAM除錯流程中僅在寫入應用程式鏡像前有一次CPU reset,而在Flash除錯流程中燒寫應用程式鏡像前后均有一次CPU reset動作,為什么在Flash除錯需要多一次CPU reset?這是因為Flashloader程式會初始化MCU外設模塊(比如Clock,GPIO,FlexSPI等),這些初始化過的MCU外設模塊如果不復位到初始狀態可能會對后面應用程式的執行產生一定影響,
三、復位型別全決議
好了,現在我們進入正題,開始介紹復位型別,上一節講的CPU reset其實只是一個籠統的說法,其具體復位行為在IAR里是可配的,不同硬體仿真器下復位型別命名有差異,痞子衡主要介紹i.MXRT上兩種最常用的仿真器:J-Link和DAPLink,
3.1 Cortex-M7復位功能
不管是哪種仿真器,其都借助了Cortex-M7內核功能,內核在SCB模塊的AIRCR暫存器中集成了復位的支持,打開CM7的Generic User Guide手冊,可以找到如下AIRCR暫存器定義:

- VECTRESET:這種復位的作用范圍覆寫整個CM7處理器中,除了除錯邏輯之外的所有角落,但是它不會影響到CM7處理器外部的任何電路,所以MCU上的片上外設和其它電路都不受影響,
- SYSRESETREQ:這種復位則會波及整個芯片上的電路:它會使CM7處理器把送往系統復位發生器的請求線置為有效,但是系統復位發生器不是CM7的一部分,而是由芯片廠商實作,因此不同的芯片對此復位的回應也不同,
3.2 J-Link復位型別

- Normal(復位編號0):默認的復位策略,對于i.MXRT來說等同于Core and peripherals方式
- Core(復位編號1):借助Cortex-M內核模塊SCB中的AIRCR暫存器的VECTRESET位功能來復位Core
- Core and peripherals(復位編號8):借助Cortex-M內核模塊SCB中的AIRCR暫存器的VECTRESET位和SYSRESETREQ位來同時復位Core和MCU外設模塊
- Reset Pin(復位編號2):通過拉低J-Link的RESET引腳(一般也會接到MCU reset腳)來復位MCU
剩下幾種復位型別不適用i.MXRT,暫不介紹,
3.3 DAPLink復位型別

- Disabled (no reset):顧名思義,沒有reset動作
- Software:直接將CPU的PC指標重置到應用程式入口函式,相當于軟復位
- Hardware:通過翻轉DAPLink的nSRST/nRESET引腳(一般也會接到MCU reset腳)來復位MCU
- Core:借助Cortex-M內核模塊SCB中的AIRCR暫存器的VECTRESET位功能來復位Core
- System:借助Cortex-M內核模塊SCB中的AIRCR暫存器的VECTRESET位和SYSRESETREQ位來同時復位Core和MCU外設模塊
剩下幾種復位型別在i.MXRT上意義不大,暫不介紹,
四、復位型別對在線除錯的影響
復位型別對在線除錯的影響分兩種:一、是否影回應用程式正常除錯;二、是否影回應用程式正常運行,對于第二點,因為應用程式的設計差異,無法確定復位型別的不同導致的未復位片上外設對其產生何種影響,因此我們暫不討論這點,我們主要看第一點,
設定不同的復位型別是否影回應用程式正常除錯(能否停在程式入口函式,能否進行單步)?痞子衡在MIMXRT1060-EVK上實測了SDK里的led_blinky例程,選取了debug(在SRAM)和flexspi_nor_debug(在Flash)兩個build做了很多組測驗,結果如下:
| 例程Build | 仿真器 | 復位型別 | BootMode | 除錯現象 |
|---|---|---|---|---|
| debug | J-Link DAPLink |
所有的 | 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 - Reset Pin |
2'b01 - SDP | 正常下載,0x60000000處校驗失敗,無法除錯 |
| flexspi_nor_debug | J-Link | - Reset Pin | 2'b10 - Flash Boot | 正常下載與除錯 |
| flexspi_nor_debug | J-Link | - Normal - Core and peripherals |
2'b10 - Flash Boot | 正常下載,0x60000000處校驗警告,但能正常除錯 |
| flexspi_nor_debug | DAPLink | - Disabled (no reset) - Software - Core |
2'b01 - SDP 2'b10 - Flash Boot |
正常下載與除錯 |
| flexspi_nor_debug | DAPLink | - Hardware - System |
2'b01 - SDP | 正常下載,0x60000000處校驗失敗,無法除錯 |
| flexspi_nor_debug | DAPLink | - Hardware | 2'b10 - Flash Boot | 正常下載與除錯 |
| flexspi_nor_debug | DAPLink | - System | 2'b10 - Flash Boot | 正常下載,0x60000000處校驗警告,但能正常除錯 |
從上表的測驗結果,我們可以得到如下結論:
- 結論1:在SRAM除錯,完全不受復位型別和芯片啟動模式影響(僅有掉電破壞SRAM里內容才可能影響除錯)
- 結論2:在Flash除錯,要想正常除錯,要么不復位片上外設(保留Flashloader對FlexSPI等模塊的初始化),要么啟動模式設成Flash Boot(讓BootROM完成FlexSPI等模塊的初始化),因為Clock/GPIO/FlexSPI的初始化必須保留,CPU才能正常獲得Flash里指令
至此,IAR在線除錯時設不同復位型別可能會導致i.MXRT下除錯現象不一致現象痞子衡便介紹完畢了,掌聲在哪里~~~
歡迎訂閱
文章會同時發布到我的 博客園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上,
微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦,

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/46340.html
標籤:嵌入式
上一篇:簡單行程啟動耗時怎么該怎么分析
