<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

芯片不定時跑飛和復位的五大原因

中穎電子 ? 來源:中穎電子 ? 作者:中穎電子 ? 2022-06-09 16:24 ? 次閱讀

MCU程序開發調試過程中,總會發現很多的程序bug。有一些bug是邏輯問題,規格書理解問題,筆誤問題等,以上列出的這些問題,通過斷點,單步等調試手段,很容易發現并解決問題。但是有一些程序的bug就比較難通過常規手段定位出問題的地點和原因,例如:芯片不定時跑飛和復位。

以下總結了芯片不定時跑飛和復位的5大原因

1、看門狗復位

原因:程序中使用了看門狗,但是沒有及時清看門狗,從而導致看門狗復位,使程序直接跳到復位位置。

解決方法:通過讀或寫RSTSTAT寄存器,在程序中清看門狗。

示例:

A.程序中寫RSTSTAT寄存器清看門狗。

9e9dd592-e7cb-11ec-ba43-dac502259ad0.png

2、中斷服務程序缺失

原因:程序中打開了某個中斷,但是沒有相應的中斷服務程序,從而導致在中斷發生后,找不到中斷服務程序入口,從而導致程序跑飛。

解決方法:檢查程序中是否存在打開了某個中斷,但是沒有相對應的中斷服務程序。

示例:

A.使能外部中斷0,并且屏蔽外部中斷0服務程序。

9ef0d634-e7cb-11ec-ba43-dac502259ad0.png

9f8cfa64-e7cb-11ec-ba43-dac502259ad0.png

B.下降沿觸發外部中斷0后,程序跑到地址0x0003處(INT0向量地址為0x0003),由于沒有中斷服務程序,該地址的指令被編譯器填充為初始化程序,因此導致程序跑飛。

9fb4fb90-e7cb-11ec-ba43-dac502259ad0.png

3、 中斷服務程序沒有對bank壓棧和出棧

原因:主程序在操作bank1寄存器時,進入中斷沒有對bank1壓棧,此時切換到bank0對寄存器操作,退出中斷后由于沒有保存bank1的狀態,導致主程序在bank0中對bank1的寄存器操作,誤改bank0寄存器的值,程序可能會運行異常。

解決方法:進入中斷服務程序后,對bank進行壓棧,退出中斷之前對bank進行出棧,這樣無論主程序在操作bank0還是bank1,中斷里面都會保存進中斷之前bank狀態,退出中斷后會還原bank狀態,這樣就不會因為切換bank導致寄存器的值被誤改。

示例:

A.在主循環操作bank1寄存器,定時器Timer3中斷里面不進行壓棧和出棧操作,直接操作bank0寄存器。

9fe85d5a-e7cb-11ec-ba43-dac502259ad0.png

B.退出中斷后此時程序狀態為bank0,下一步返回主程序,本來應該改變的是P5_0的值,由于沒有切換到bank1,所以在bank0中將相同地址的寄存器P0_0的值誤改,同時導致P5_0的值修改無效。

a00c6cae-e7cb-11ec-ba43-dac502259ad0.png

a037c62e-e7cb-11ec-ba43-dac502259ad0.png

a0855a06-e7cb-11ec-ba43-dac502259ad0.png

4、數組越界

原因:程序中定義的數組元素的個數小于程序中實際使用的數組元素的個數,數組使用循環函數時,如果循環變量沒控制好則會出現數組越界,意外修改其他變量值可能會導致程序異常。

解決方法:檢查函數中調用的數組是否存在越界的情況。

示例:

A.定義SendBuffer和RecBuffer兩個數組變量,數組長度為5,初值均為0。

a0ac7a82-e7cb-11ec-ba43-dac502259ad0.png

B.主程序中對數組SendBuffer[0]~ SendBuffer[4]賦值,此時SendBuffer[5]和SendBuffer[6]也被意外賦值,從watch窗口可以看出,這兩個值改變了原來RecBuffer[0]和RecBuffer[1]的值,可能會造成程序異常。

a0fb8744-e7cb-11ec-ba43-dac502259ad0.png

a1206ee2-e7cb-11ec-ba43-dac502259ad0.png

5、堆棧溢出

原因:函數嵌套太深或者局部變量太多導致超出堆??臻g,正常數據被改寫。

解決方法:盡量減少函數調用層級,局部變量不要使用太多,尤其是局部大數組,從而減少壓棧的時候所需的空間。

示例:

A.定義4個全局變量和1個局部變量數組,總共占用RAM空間為249個字節

a146a724-e7cb-11ec-ba43-dac502259ad0.png

a1bdc34a-e7cb-11ec-ba43-dac502259ad0.png

B.計算程序中所需的堆棧大小,主程序中調用Delay()函數,占用2個字節,中斷服務函數占用16個字節,中斷嵌套調用leddisplay()函數,占用2個字節,總共需要20個字節堆??臻g,由A可知,系統只剩下6個字節堆??臻g,所以程序運行后,堆棧一定會溢出。

a20edcee-e7cb-11ec-ba43-dac502259ad0.png

a235424e-e7cb-11ec-ba43-dac502259ad0.png

a2a332ae-e7cb-11ec-ba43-dac502259ad0.png

C.運行程序,正?,F象為P40端口一直翻轉,TestData變量值始終為0,觸發外部中斷0,進入中斷服務程序后,可以看到SP堆棧指針已經溢出,同時將R7寄存器的值壓棧到0x08的地址上,通過.m51文件可以查到0x08正好是TestData變量地址,所以TestData的值被誤改為0x01,導致主程序中條件判斷出錯,程序異常。

a2c4aa2e-e7cb-11ec-ba43-dac502259ad0.png

a2df18be-e7cb-11ec-ba43-dac502259ad0.png

a2f123ce-e7cb-11ec-ba43-dac502259ad0.png

a3142716-e7cb-11ec-ba43-dac502259ad0.png

在調試MCU程序過程中,由于程序書寫的不規范產生程序漏洞,跑飛現象比較常見,如果我們提前了解程序可能跑飛的原因,對于快速定位問題有很大幫助,從而提高分析和解決問題的效率,減少產品的開發周期,加速產品的上市時間。

原文標題:中穎8bit MCU程序跑飛原因分析

文章出處:【微信公眾號:中穎電子】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 芯片
    +關注

    關注

    447

    文章

    48172

    瀏覽量

    410924
  • mcu
    mcu
    +關注

    關注

    146

    文章

    16090

    瀏覽量

    344482
  • 復位
    +關注

    關注

    0

    文章

    159

    瀏覽量

    24072
  • 中穎電子
    +關注

    關注

    4

    文章

    169

    瀏覽量

    7248

原文標題:中穎8bit MCU程序跑飛原因分析

文章出處:【微信號:SINO_25181447,微信公眾號:中穎電子】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    TC233使用QSPISPI程序單片機不定時復位原因?

    使用TC233使用QSPI外設,SPI作為從機和其他單片機進行SPI通訊,不定時重啟,如果數據收發比較快的話復位頻率就比較高,如果延時一秒發送同樣會復位,只是頻率會低一些,另外我是用SPI3當從機
    發表于 02-02 07:58

    【每周論點】 DSP程序原因有哪些?你是如何解決的?.

    ,說來奇怪,名稱完全相同,封裝不同,加上管腳定義不同,造成了看門狗芯片復位電壓總是低電壓。終于找到問題了。那么你在開發過程是否也遇到了DSP程序的bug呢,你是如何解決的,歡迎大
    發表于 02-17 22:27

    五大原廠解決方案,下載即可贏取“豪禮”

    `五大原廠解決方案,下載即可贏取“豪禮”【活動時間】:2014年9月1日——2014年11月30日【活動介紹】:貿澤解決方案中心,重磅推出五大廠家解決方案。即日起下載即可贏取“豪禮”【資料下載
    發表于 09-16 10:12

    五大原廠解決方案,下載即可贏取“豪禮”

    `五大原廠解決方案,下載即可贏取“豪禮”【活動時間】:2014年9月1日——2014年11月30日【活動介紹】:貿澤解決方案中心,重磅推出五大廠家解決方案。即日起下載即可贏取“豪禮”【資料下載
    發表于 09-16 14:05

    五大原廠解決方案,下載即可贏取“豪禮”

    `五大原廠解決方案,下載即可贏取“豪禮”【活動時間】:2014年9月1日——2014年11月30日【活動介紹】:貿澤解決方案中心,重磅推出五大廠家解決方案。即日起下載即可贏取“豪禮”【資料下載
    發表于 09-16 14:08

    五大原廠解決方案,下載即可贏取“豪禮”

    五大原廠解決方案,下載即可贏取“豪禮”【活動時間】:2014年9月1日——2014年11月30日【活動介紹】:貿澤解決方案中心,重磅推出五大廠家解決方案。即日起下載即可贏取“豪禮”【資料下載
    發表于 09-16 14:10

    [轉帖]單片機程序死機大原因

    單片機程序死機,飛了可以從以下幾個方面查找原因:1.意外中斷。是否打開了某個中斷,但是沒有響應和**中端標志,導致程序一直進入中斷,造成死機假象。2. 中斷變量處理不妥。若定義某些會在中斷中修改
    發表于 04-06 13:25

    單片機程序死機原因

    轉帖:單片機程序死機原因單片機程序死機,飛了可以從以下幾個方面查找原因:1.意外中斷。是否打開了某個中斷,但是沒有響應和清除中端標志,
    發表于 10-13 20:49

    單片機/ARM死機或的診斷療法

    干擾的原因,在非預期的情況下,使得程序計數器PC 的值發生隨機的變化,從而使得程序的流向指向不確定區域,這便是程序的。程序后或者會使
    發表于 08-26 16:16

    單片機/ARM死機或的診斷療法

    經常出現的程序現象。 在單片機系統中,因為干擾的原因,在非預期的情況下,使得程序計數器PC 的值發生隨機的變化,從而使得程序的流向指向不確定區域,這便是程序的
    發表于 05-06 15:10

    FPGA狀態機原因是什么

    FPGA狀態機為什么會呢?FPGA狀態機原因是什么?
    發表于 11-01 07:52

    如何利用TIMx定時復位模式串口接收不定長數據呢

    TIMx定時器有哪幾種模式呢?如何利用TIMx定時復位模式串口接收不定長數據呢?
    發表于 11-23 06:21

    單片機程序原因是什么

    中有看門狗,長時間不喂狗,程序就會復位。為什么長時間不喂狗呢?這是因為程序飛了,拋開外部因素不談。今天就和大家分享一下,單片機程序的幾個原因
    發表于 12-13 07:17

    單片機程序的幾種原因

    幾種可能的原因:1、 數組越界/溢出現象:程序在函數中運行時,總是在運行到函數末尾,要跳出函數時,程序。解決方法:如果在調試程序時,發現程序總是在函數執行完畢時
    發表于 11-30 12:57

    從LED光源的五大原物料淺析LED死燈的25種原因

    以失效分析大數據顯示,LED死燈的原因可能過百種,限于時間,今天我們僅以LED光源為例,從LED光源的五大原物料(芯片、支架、熒光粉、固晶膠、封裝膠和金線)的入手,介紹部分可能導致死燈的原因
    發表于 04-26 16:59 ?6219次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>