
關(guān)鍵詞:TrustZone,HardFault
目錄預(yù)覽
1、簡(jiǎn)介
2、問(wèn)題分析
3、總結(jié)
01
簡(jiǎn)介
客戶(hù)使用 STM32U5 進(jìn)行開(kāi)發(fā),并使能了 TrustZone 架構(gòu),程序需要從 bootloader 跳轉(zhuǎn)到app。在之前版本都是正常跳轉(zhuǎn)的,某一天 IAR 從 9.20 升級(jí)到 9.30 后,程序跳轉(zhuǎn)失敗,并且會(huì)導(dǎo)致 hardfault,想知道為什么會(huì)失敗。

圖1.IAR9.20 和 IAR9.30 生成的匯編代碼對(duì)比
02
問(wèn)題分析
通過(guò)斷點(diǎn)和單步調(diào)試,我們發(fā)現(xiàn)出現(xiàn)問(wèn)題的指令如下所示:

圖2.程序下一步將 Hardfault
而沒(méi)有發(fā)生 hardfault 的版本匯編代碼,如下圖:

圖3.程序不會(huì)發(fā)生 Hardfault
通過(guò)單步調(diào)試,我們知道了 VLSTM SP 這條指令導(dǎo)致了 hardfault。接著我們?cè)俅_認(rèn)下 SP 指針,錯(cuò)誤版本的 SP 的內(nèi)容為:0x300020b4,正確版本的 SP 內(nèi)容為:0x30000258。首先,我們對(duì)比了生成的 map 文件中 stack 的地址信息,發(fā)現(xiàn)其中 Stack 的地址和這里 SP 指令是相符的。
然后繼續(xù)查找了 VLSTM 這條指令相關(guān)的描述,關(guān)于 VLSTM 在 PM0264 中有以下描述:

圖4.關(guān)于 VLSTM 指令
從上圖可以看到,VLSTM SP 這條指令會(huì)把安全的浮點(diǎn)運(yùn)算寄存器的值保存到 SP 地址中,并清除安全浮點(diǎn)寄存器的內(nèi)容,如果 CPU 的狀態(tài)是非安全的,那么這條指令相當(dāng)于空指令,也不會(huì)導(dǎo)致 hard fault,所有從這里也還是分析不出為什么會(huì)導(dǎo)致 hard fault。
重新回到這條指令,現(xiàn)在問(wèn)題可能比較大的就是 SP 的地址了。有問(wèn)題的版本的 SP 內(nèi)容為:0x300020b4,會(huì)不會(huì)是對(duì)齊導(dǎo)致的呢?
基于這個(gè)猜測(cè),我們直接在 IAR 界面強(qiáng)制修改了 SP 的地址為 0x300020b8,并繼續(xù)單步執(zhí)行,然后程序可以正常執(zhí)行了。所以目前所知的結(jié)論就是 VLSTM SP 這條指令,要求 SP 必須 8 字節(jié)對(duì)齊,可能 IAR 在編譯的時(shí)候并沒(méi)有注意到這一點(diǎn)。
然后,把這些信息反饋到 IAR 以后,IAR 的工程師回復(fù)如下:
根據(jù)目前的信息,問(wèn)題應(yīng)該是在 VLSTM 要求 8 字節(jié)對(duì)齊上。在 9.30.1 中,由于 PUSH.W {R4, R5, R7-R11}指令執(zhí)行后,相當(dāng)于占用了 28 個(gè)字節(jié)的??臻g,導(dǎo)致了 SP 和 9.20.1 相比,不是 8 字節(jié)對(duì)齊。
03
總結(jié)
在調(diào)試 TrustZone 工程的時(shí)候,由于使用了新的架構(gòu)及新的匯編指令,需要對(duì)這些指令有一定基本的了解。在調(diào)查問(wèn)題的時(shí)候,可以進(jìn)行單步調(diào)試來(lái)定位發(fā)生問(wèn)題的指令,然后再繼續(xù)深入了解下為什么會(huì)導(dǎo)致 hardfault。

完整內(nèi)容請(qǐng)點(diǎn)擊“閱讀原文”下載原文檔。
原文標(biāo)題:實(shí)戰(zhàn)經(jīng)驗(yàn) | TrustZone 架構(gòu)下 LPBAM 使用導(dǎo)致的 HardFault
文章出處:【微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
單片機(jī)
+關(guān)注
關(guān)注
6076文章
45502瀏覽量
670893 -
STM32
+關(guān)注
關(guān)注
2310文章
11167瀏覽量
373612
原文標(biāo)題:實(shí)戰(zhàn)經(jīng)驗(yàn) | TrustZone 架構(gòu)下 LPBAM 使用導(dǎo)致的 HardFault
文章出處:【微信號(hào):STM32_STM8_MCU,微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
GPS時(shí)鐘授時(shí)裝置常見(jiàn)問(wèn)題與實(shí)戰(zhàn)經(jīng)驗(yàn)分享
雪深數(shù)據(jù)精準(zhǔn)采集:激光傳感器抗干擾技術(shù)實(shí)戰(zhàn)指南
LAT1199+TrustZone 架構(gòu)下使用 LPBAM 導(dǎo)致的 HardFault應(yīng)用筆記
車(chē)載音頻功放芯片實(shí)戰(zhàn)經(jīng)驗(yàn)與深度疑問(wèn)
SD-WAN部署避坑指南——從選型到上線(xiàn)的實(shí)戰(zhàn)攻略
解鎖物聯(lián)網(wǎng)攝像頭潛力:低成本低功耗硬件設(shè)計(jì)實(shí)戰(zhàn)技巧!
main線(xiàn)程創(chuàng)建中的rt_memset導(dǎo)致hardfault是為什么?
數(shù)據(jù)庫(kù)慢查詢(xún)分析與SQL優(yōu)化實(shí)戰(zhàn)技巧
Linux企業(yè)網(wǎng)絡(luò)安全防護(hù)體系建設(shè)
Linux服務(wù)器性能調(diào)優(yōu)的核心技巧和實(shí)戰(zhàn)經(jīng)驗(yàn)
main線(xiàn)程的棧大小設(shè)置成2048的時(shí)候rt_memset導(dǎo)致hardfault,為什么?
移動(dòng)電源EMC整改:認(rèn)證失敗到一次通過(guò)的實(shí)戰(zhàn)經(jīng)驗(yàn)
國(guó)產(chǎn)芯片多架構(gòu)開(kāi)發(fā)實(shí)踐:從工業(yè)控制到邊緣AI的硬件設(shè)計(jì)經(jīng)驗(yàn)
高低頻介電常數(shù)測(cè)試儀實(shí)戰(zhàn)經(jīng)驗(yàn):從原理到場(chǎng)景全解析?
TrustZone介紹及用途
實(shí)戰(zhàn)經(jīng)驗(yàn) | TrustZone 架構(gòu)下 LPBAM 使用導(dǎo)致的 HardFault
評(píng)論