新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 關于中斷時的堆棧溢出

        關于中斷時的堆棧溢出

        作者: 時間:2016-11-13 來源:網絡 收藏
        pic16f876堆棧只有8級,每發生一次子程序調用(或中斷),將當前13位地址壓到堆棧,PC=子程序起始地址低8位+PCLATH(或04H),子程序返回時將13位地址從堆棧中彈出=PC。
        堆棧的操作由CPU控制不可監控,溢出不報警,子程序調用(或中斷)超過8次嵌套時,最先壓到堆棧的13位地址被沖掉,子程序返回時將回不到調用前的PC,程序。
        一般使用不會達到8次嵌套,但如果有5、6 次子程序嵌套,而中斷服務程序中有1、2次子程序調用便相當危險。調試時很難完全模擬所有實際情況,
        一般的避免方法:
        1、一般的子程序調用不要超過6次子程序嵌套,在開始編程前最好畫一下流程。
        2、盡量避免在不可確定發生時刻的中斷(如串口接收、定時器)程序中加子程序調用。中斷服務程序中盡量用GOTO語句。
        3、在6次子程序嵌套發生前屏蔽總中斷。
        4、廠家提供的器件讀寫驅動例子一般喜歡用很多子程序,用之前最好改一下。
        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編譯出來之所以大,與為避免堆棧溢出而作的繞彎處理不無關系


        關鍵詞: 中斷堆棧溢

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 泸西县| 寿光市| 格尔木市| 龙南县| 综艺| 长丰县| 天门市| 连南| 疏附县| 房山区| 民和| 秀山| 屯留县| 高碑店市| 永修县| 娄烦县| 大厂| 金阳县| 宁海县| 南皮县| 仁怀市| 沅江市| 清苑县| 冕宁县| 屯留县| 云龙县| 清水河县| 彰化县| 休宁县| 修文县| 呼图壁县| 来安县| 郴州市| 民乐县| 邯郸市| 贵溪市| 南靖县| 高密市| 临颍县| 石城县| 红安县|