大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是MCUXpresso IDE下在線調(diào)試時(shí)使用不同復(fù)位策略的現(xiàn)象總結(jié)。
本篇實(shí)際上是《IAR在線調(diào)試時(shí)設(shè)不同復(fù)位類型可能會(huì)導(dǎo)致i.MXRT下調(diào)試現(xiàn)象不一致》的同系列篇,計(jì)劃中痞子衡是要把幾大經(jīng)典IDE(IAR EWARM、Keil MDK、MCUXpresso IDE)下的復(fù)位策略都寫一遍,但一直沒抽出時(shí)間。今天痞子衡恰好幫助一位印度同事解決了在客戶板子上使用MCUXpresso在線調(diào)試的問(wèn)題,因此順便認(rèn)真研究了下MCUXpresso IDE下復(fù)位策略,特地分享給大家。
在讀本文前,最好把痞子衡先前寫過(guò)的一篇 《MCUXpresso IDE下使用J-Link下載算法在Flash調(diào)試注意事項(xiàng)》 瀏覽一下,本文要探討的問(wèn)題比先前那篇文章要更深入。
- Note: 痞子衡測(cè)試的MCUXpresso IDE版本是v11.3.0_5222。
一、在客戶板卡上遇到的調(diào)試問(wèn)題
先來(lái)回顧下客戶遇到的調(diào)試問(wèn)題。據(jù)印度同事介紹,客戶自己設(shè)計(jì)的i.MXRT1052板卡,使用的Flash是Cypress生產(chǎn)的S25FL128LAGMFI01,客戶寄了一塊樣卡給我同事,我同事在客戶板卡上隨便找了個(gè)SDK里的hello world工程(MCUXpresso IDE)去在線調(diào)試,調(diào)試器是恩智浦的LPC-Link2。
i.MXRT1050 SDK工程里默認(rèn)選擇的下載算法是適用官方EVK上默認(rèn)Hyper Flash的,并不適用客戶這塊板卡上的QSPI Flash,因此印度同事為客戶制作了一個(gè)LinkServer Flash Driver(MCUX下載算法),使用這個(gè)新制作的下載算法可以去下載(至少?gòu)腗CUX的下載日志里可以看到Flash Write Done),但是斷點(diǎn)沒能停在main函數(shù),因此無(wú)法單步調(diào)試,而且在IDE里檢查0x60000000處空間,看到的是如下無(wú)效數(shù)據(jù),就像是程序根本沒有下載進(jìn)去,這到底是怎么回事?痞子衡接下來(lái)就先為大家分析MCUXpresso IDE下復(fù)位策略,最后再給大家解謎。
關(guān)于LinkServer Flash Driver的制作可參考痞子衡之前寫過(guò)的 《串行NOR Flash下載算法(MCUXpresso IDE篇)》,但其實(shí)這個(gè)客戶選擇的S25FL128LAGMFI01就是塊普通的符合JEDEC SFDP標(biāo)準(zhǔn)的QSPI NOR,在MCUXpresso IDE安裝目錄下的MIMXRT1050_SFDP_QSPI.cfx算法是可以直接使用的(路徑是 MCUXpressoIDE_11.3.0_5222idebinariesFlash)。
二、MCUXpresso IDE調(diào)試機(jī)制與調(diào)試分類
關(guān)于MCUXpresso IDE下的調(diào)試機(jī)制原理在 MCUXpressoIDE_11.3.0_5222MCUXpresso_IDE_User_Guide.pdf 手冊(cè)里并沒有找到設(shè)計(jì)性的介紹,雖然手冊(cè)里一共有如下四個(gè)章節(jié)涉及到了下載調(diào)試,但更多是介紹如何在IDE里使用下載調(diào)試功能。
10. Debug Solutions Overview
11. Debugging a Project
14. The GUI Flash Tool
15. LinkServer Flash Support
不過(guò)調(diào)試機(jī)制在各IDE上大同小異,設(shè)計(jì)理念都是一致的,這部分建議參考 《IAR在線調(diào)試時(shí)設(shè)不同復(fù)位類型可能會(huì)導(dǎo)致i.MXRT下調(diào)試現(xiàn)象不一致》 里的一、二章節(jié)。
三、復(fù)位類型全解析
好了,現(xiàn)在我們進(jìn)入正題,開始介紹MCUXpresso IDE下復(fù)位類型。我們知道不同硬件仿真器下復(fù)位功能有差異,痞子衡主要介紹i.MXRT上兩種最常用的仿真器:J-Link和DAPLink。此外不管是哪種仿真器,其都借助了Cortex-M7內(nèi)核功能,內(nèi)核在SCB模塊的AIRCR寄存器中集成了復(fù)位的支持,詳見 《IAR在線調(diào)試時(shí)設(shè)不同復(fù)位類型可能會(huì)導(dǎo)致i.MXRT下調(diào)試現(xiàn)象不一致》 的 3.1 Cortex-M7復(fù)位功能 小節(jié)。
3.1 J-Link復(fù)位類型
MCUXpresso IDE下設(shè)置J-Link復(fù)位類型一共有如下圖所示三處,其本質(zhì)上都是借助Jlink底層命令,具體可在 SEGGERJLink_V686fDocManualsUM08001_JLink.pdf 文檔中的 Supported remote (monitor) commands 小節(jié)里的reset命令以及 List of available commands 小節(jié)里的SetResetType命令里找到詳細(xì)解釋。
UM08001_JLink.pdf 文檔中的 7.10.2 Strategies for Cortex-M devices 小節(jié)一共列出了如下三種復(fù)位類型:
- Normal(復(fù)位編號(hào)0):默認(rèn)的復(fù)位策略,對(duì)于i.MXRT來(lái)說(shuō)等同于Core and peripherals方式Core(復(fù)位編號(hào)1):借助Cortex-M內(nèi)核模塊SCB中的AIRCR寄存器的VECTRESET位功能來(lái)復(fù)位CoreReset Pin(復(fù)位編號(hào)2):通過(guò)拉低J-Link的RESET引腳(一般也會(huì)接到MCU reset腳)來(lái)復(fù)位MCU
上圖復(fù)位類型設(shè)置框中的三處設(shè)置,雖然都能使能復(fù)位操作,但是階段不同,其中紅框2處設(shè)置是的下載前操作,紅框3處設(shè)置是下載后的操作,紅框1處設(shè)置是執(zhí)行前的操作。如果你對(duì)這個(gè)順序不了解,可以做個(gè)試驗(yàn),比如我們?cè)诩t框3處設(shè)置復(fù)位類型1,在紅框1處設(shè)置復(fù)位類型2,進(jìn)入調(diào)試后在日志窗口找到JLinkServer日志,在日志中查看具體順序。
在實(shí)際使用中,痞子衡推薦不使能紅框1中的"Reset before running"選項(xiàng),并且僅在紅框3中設(shè)置復(fù)位類型,經(jīng)測(cè)試這種方式與其他IDE下的調(diào)試體驗(yàn)最一致。但還是有如下兩點(diǎn)注意事項(xiàng):
- Note1: 復(fù)位命令后,必須增加一個(gè)monitor reg pc設(shè)置,否則無(wú)法正常調(diào)試。Note2: 復(fù)位類型是0的情況下,如果此時(shí)BootROM沒能正常啟動(dòng)App(即應(yīng)該不能正常調(diào)試),但在IDE界面里有時(shí)候還是會(huì)停在main函數(shù),這其實(shí)是假象(應(yīng)該跟cache有關(guān)),并不能正常調(diào)試,點(diǎn)擊suspend按鈕就能看到跑飛。
3.2 LinkServer復(fù)位類型
LinkServer即對(duì)應(yīng)DAPLink調(diào)試器,是MCUXpresso IDE默認(rèn)的調(diào)試器類型,IDE里為這個(gè)默認(rèn)調(diào)試器實(shí)現(xiàn)了友好的復(fù)位類型選項(xiàng)。
上圖復(fù)位類型設(shè)置紅框1中的“Reset handling”一共提供了五種復(fù)位選擇。這五種復(fù)位除了SOFT外,其余都不會(huì)主動(dòng)設(shè)PC指針,默認(rèn)全靠breakpoint去觸發(fā)調(diào)試。
- Default:等同于于SYSRESETREQ方式SYSRESETREQ:借助Cortex-M內(nèi)核模塊SCB中的AIRCR寄存器的SYSRESETREQ位來(lái)同時(shí)復(fù)位MCU外設(shè)模塊VECTRESET:借助Cortex-M內(nèi)核模塊SCB中的AIRCR寄存器的VECTRESET位功能來(lái)復(fù)位CoreSOFT:直接將CPU的PC指針重置到應(yīng)用程序入口函數(shù),相當(dāng)于軟復(fù)位空:等同于SYSRESETREQ方式
同上節(jié)JLink復(fù)位類型一樣,LinkServer下也提供了額外的Commands設(shè)置(紅框2/3),具體命令寫法需查看 MCUXpresso_IDE_User_Guide.pdf 手冊(cè),本文就不詳細(xì)介紹了。
關(guān)于Reset handling選擇SOFT方式的結(jié)果,有一點(diǎn)需要特別指出,我們?cè)谌缦聦?duì)應(yīng)日志里可以看到,下載完成后調(diào)用了soft reset并且從0x60000000處拿了SP和PC,即MCUXpresso IDE認(rèn)為下載首地址就是程序中斷向量表起始地址,這個(gè)假定在i.MXRT的XIP工程上其實(shí)是不成立的,我們知道正確的中斷向量表起始地址應(yīng)該是0x60002000。如想讓MCUXpresso IDE拿到正確的SP/PC,應(yīng)該在XIP工程預(yù)編譯選項(xiàng)里把XIP_BOOT_HEADER_ENABLE設(shè)成0(也可以研究下在紅框3中增加LinkServer命令去設(shè)置PC),否則沒法正常調(diào)試。
四、復(fù)位類型對(duì)在線調(diào)試的影響
復(fù)位類型對(duì)在線調(diào)試的影響分兩種:一、是否影響應(yīng)用程序正常調(diào)試;二、是否影響應(yīng)用程序正常運(yùn)行。對(duì)于第二點(diǎn),因?yàn)閼?yīng)用程序的設(shè)計(jì)差異,無(wú)法確定復(fù)位類型的不同導(dǎo)致的未復(fù)位模塊對(duì)其產(chǎn)生何種影響,因此我們暫不討論這點(diǎn),我們主要看第一點(diǎn)。
設(shè)置不同的復(fù)位類型是否影響應(yīng)用程序正常調(diào)試(能否停在程序入口函數(shù),能否進(jìn)行單步)?痞子衡在MIMXRT1050-EVKB上實(shí)測(cè)了SDK里的led_blinky例程,選取了flexspi_nor_debug(在Flash)build做了很多組測(cè)試,結(jié)果如下:
例程Build | 仿真器 | 復(fù)位類型 | BootMode | 調(diào)試現(xiàn)象 |
---|---|---|---|---|
flexspi_nor_debug | J-Link | monitor reset 1 | 2'b01 - SDP 2'b10 - Flash Boot |
正常下載與調(diào)試 |
flexspi_nor_debug | J-Link | monitor reset 0/2 | 2'b01 - SDP | 正常下載,無(wú)法調(diào)試 |
flexspi_nor_debug | J-Link | monitor reset 0/2 | 2'b10 - Flash Boot | 正常下載與調(diào)試 |
flexspi_nor_debug | LinkServer | - SOFT | 2'b01 - SDP 2'b10 - Flash Boot |
正常下載與調(diào)試,注意程序不能含XIP頭 |
flexspi_nor_debug | LinkServer | - 除SOFT外其余四種 | 2'b01 - SDP | 正常下載,無(wú)法調(diào)試 |
flexspi_nor_debug | LinkServer | - 除SOFT外其余四種 | 2'b10 - Flash Boot | 正常下載與調(diào)試 |
從上表的測(cè)試結(jié)果,我們可以得到如下結(jié)論:
- 結(jié)論1:在Flash調(diào)試,要想正常調(diào)試,要么不復(fù)位片上外設(shè)(保留Flashloader對(duì)FlexSPI等模塊的初始化),要么啟動(dòng)模式設(shè)成Flash Boot(讓BootROM完成FlexSPI等模塊的初始化),因?yàn)镃lock/GPIO/FlexSPI的初始化必須保留,CPU才能正常獲得Flash里指令。結(jié)論2:JLink復(fù)位下,MCUXpresso IDE調(diào)試體驗(yàn)與其他IDE是一致的。結(jié)論3:LinkServer復(fù)位下,MCUXpresso IDE下VECTRESET方式復(fù)位達(dá)不到其他IDE下同等方式的效果,因?yàn)槌跏糚C無(wú)法得到。
五、客戶板卡上調(diào)試問(wèn)題的原因
最后回到客戶板上的問(wèn)題,痞子衡的印度同事其實(shí)是非常有經(jīng)驗(yàn)的,板卡啟動(dòng)模式設(shè)置,F(xiàn)lash下載算法,工程里的FDCB頭全部都是正確的,但是經(jīng)查明板卡i.MXRT1052芯片的eFuse中BOOT_CFG2[3]位被燒寫成了1,即芯片進(jìn)入了inifnite loop模式,PC永遠(yuǎn)停在BootROM里,客戶App不會(huì)被啟動(dòng),因此無(wú)法硬復(fù)位后進(jìn)調(diào)試。
BootROM中系統(tǒng)初始化函數(shù)里對(duì)BOOT_CFG2[3]位的處理代碼:
volatile uint32_t infinite_loop;
void SystemInit (void)
{
#if ((__FPU_PRESENT == 1) && (__FPU_USED == 1))
SCB->CPACR |= ((3UL << 10*2) | (3UL << 11*2)); /* set CP10, CP11 Full Access */
#endif /* ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) */
TRACE("BootROM: SystemInitn");
rtwdog_disable();
/* Below codes is used for issue troubleshooting on real chip */
if ((ROM_OCOTP_INFINITE_LOOP_VALUE() == 1) && (ROM_OCOTP_DIR_BT_DIS_VALUE() == 0))
{
infinite_loop = 1;
while(infinite_loop)
{
}
}
// 代碼省略
}
至此,MCUXpresso IDE下在線調(diào)試時(shí)使用不同復(fù)位策略的現(xiàn)象總結(jié)痞子衡便介紹完畢了,掌聲在哪里~~~