<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          戰(zhàn)經(jīng)驗(yàn) | Cortex-M核除0操作的報(bào)錯(cuò)機(jī)制話(huà)題

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

          1. 前言

          本文引用地址:http://www.ex-cimer.com/article/202501/466513.htm

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

          2. 整形數(shù)除0操作報(bào)錯(cuò)

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

          ▲ 圖1. SCB CCR默認(rèn)地址和復(fù)位初值



          ▲ 圖2. DIV_0_TRP位于bit4

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

          測(cè)試執(zhí)行整型數(shù)除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錯(cuò)誤

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

          ▲ 圖6. 找到因?yàn)槌?導(dǎo)致的進(jìn)入Hardfault

          3. 浮點(diǎn)數(shù)除0的報(bào)錯(cuò)機(jī)制

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

          ▲ 圖7. FPSCR寄存器

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













          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標(biāo)志位置位

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

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



          ▲ 圖10. 讀取FPSCR

          4. 結(jié)論

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



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

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();