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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 關(guān)于中斷時的堆棧溢出

          關(guān)于中斷時的堆棧溢出

          作者: 時間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
          pic16f876堆棧只有8級,每發(fā)生一次子程序調(diào)用(或中斷),將當(dāng)前13位地址壓到堆棧,PC=子程序起始地址低8位+PCLATH(或04H),子程序返回時將13位地址從堆棧中彈出=PC。
          堆棧的操作由CPU控制不可監(jiān)控,溢出不報警,子程序調(diào)用(或中斷)超過8次嵌套時,最先壓到堆棧的13位地址被沖掉,子程序返回時將回不到調(diào)用前的PC,程序。
          一般使用不會達到8次嵌套,但如果有5、6 次子程序嵌套,而中斷服務(wù)程序中有1、2次子程序調(diào)用便相當(dāng)危險。調(diào)試時很難完全模擬所有實際情況,
          一般的避免方法:
          1、一般的子程序調(diào)用不要超過6次子程序嵌套,在開始編程前最好畫一下流程。
          2、盡量避免在不可確定發(fā)生時刻的中斷(如串口接收、定時器)程序中加子程序調(diào)用。中斷服務(wù)程序中盡量用GOTO語句。
          3、在6次子程序嵌套發(fā)生前屏蔽總中斷。
          4、廠家提供的器件讀寫驅(qū)動例子一般喜歡用很多子程序,用之前最好改一下。
          5、可以將CALL改用GOTO,比如:
          AAA .......
          REYURN
          .......
          BBB CALLAAA
          可以改為:
          AAA......
          MOVFW PCLATH_TEMP
          MOVWF PCLATH
          MOVFW PC_RETURN
          MOVWF PCL
          ......
          BBB
          MOVFW HIGHCCC
          MOVWF PCLATH_TEMP
          MOVFW HIGHAAA
          MOVWF PCLATH
          MOVLW CCC
          MOVWFPC_RETURN
          GOTO AAA
          CCC NOP
          ................
          6、如果嫌麻煩,可以用C編程,C編譯出來之所以大,與為避免堆棧溢出而作的繞彎處理不無關(guān)系


          關(guān)鍵詞: 中斷堆棧溢

          評論


          技術(shù)專區(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); })();