<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 戰經(jīng)驗 | Cortex-M核除0操作的報錯機制話(huà)題

戰經(jīng)驗 | Cortex-M核除0操作的報錯機制話(huà)題

作者: 時(shí)間:2025-01-21 來(lái)源:STM32 收藏

1. 前言

本文引用地址:http://dyxdggzs.com/article/202501/466513.htm

除0操作屬于錯誤操作,在A(yíng)RM 平臺上會(huì )有相應的報錯機制。但這邊會(huì )涉及到整型數的除0以及浮點(diǎn)數的除0,另外還會(huì )涉及錯誤產(chǎn)生后的報錯機制,是中斷還是錯誤位,本文會(huì )對這個(gè)報錯機制加以說(shuō)明。使用H723做為測試芯片。

2. 整形數除0操作報錯

默認情況下,H723對整形數的除0操作,會(huì )忽略掉錯誤,原因在于默認情況下 SCB->CCR寄存器默認配置中這個(gè)除0操作是非捕獲狀態(tài),如果想要系統報錯,需要把 DIV_0_TRP這個(gè)位置1,這樣,當執行除0操作的時(shí)候會(huì )進(jìn)入hardfault,并且有標志位產(chǎn)生。

▲ 圖1. SCB CCR默認地址和復位初值



▲ 圖2. DIV_0_TRP位于bit4

▲ 圖3. DIV_0_TRP參數說(shuō)明

測試執行整型數除0操作代碼。












/* Enable System clock */  __HAL_RCC_SYSCFG_CLK_ENABLE();  /* Enable DIV_0_TRP */  SCB->CCR |= (1<<4);  /* Div value set to 0 */  IDiv = 0;  /* Exctue div 0 */  Iout = Iin/IDiv;

▲ 圖4. Fault Report-除0錯誤

▲ 圖5. 查看進(jìn)入Hardfault的程序位置

▲ 圖6. 找到因為除0導致的進(jìn)入Hardfault

3. 浮點(diǎn)數除0的報錯機制

浮點(diǎn)數的除0操作,沒(méi)有專(zhuān)門(mén)的Hardfault觸發(fā)機制,也就不能產(chǎn)生中斷,只能通過(guò)對FPU單元的讀取進(jìn)行判別,而且在調試模式下,通過(guò)IAR讀取寄存器的結果是正確的,而通過(guò)Keil的讀取會(huì )有錯誤,實(shí)際已經(jīng)發(fā)生了浮點(diǎn)除0操作,但Keil的FPU->SCR寄存器DZC沒(méi)有置位。

▲ 圖7. FPSCR寄存器

執行浮點(diǎn)除0的測試代碼:













static volatile float fin = 0.9f,fout,fdiv; static volatile uint16_t Mark; /* Div value set to 0 */ fdiv = 0.0f; /* Exctue float div 0 */ fout  = fin/fdiv; /* Get wrong mask value */ Mark = __get_FPSCR();



▲ 圖8. IAR的浮點(diǎn)除0后DZC標志位置位

▲ 圖9. Keil浮點(diǎn)除0后DZC標志位有誤

讀取FPSCR寄存器,返回錯誤碼0x02(除0操作)。



▲ 圖10. 讀取FPSCR

4. 結論

本文通過(guò)對除0操作的報錯機制做細致說(shuō)明,可以看到整型除0可以有Hardfault的中斷產(chǎn)生,而浮點(diǎn)的除0只能通過(guò)標志位判別,實(shí)際使用過(guò)程中盡量避免這種錯誤的操作。



關(guān)鍵詞: STM32 Cortex-M

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>