新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機C程序的中斷函數調用子程序沖突問題

        單片機C程序的中斷函數調用子程序沖突問題

        作者: 時間:2016-11-25 來源:網絡 收藏
        單片機或者ARM的使用過程中,必會遇到使用片上中斷資源的時候,中斷單片機的靈魂和精髓所在,像定時/計數器一樣有很重要的作用。設置中斷的作用是能及時響應重要的程序響應,以提高MCU和MPU的對重要資源的響應速度。在響應中斷的過程中,系統會自動保存斷點(C語言編程中),等到中斷響應結束之后,程序會再次回到斷點處繼續執行main函數。這就出現了問題:有可能在中斷函數中調用的子函數和main函數中調用的子函數重復,比如,在main函數執行到display()顯示函數的時候,發生了ESUART中斷,這是程序需要保存現場和斷點,將現在的main正在執行的一些資源壓入堆棧。如果在interrupt()函數中也調用display()函數的話,會導致中斷中的函數執行不正常,即顯示亂碼或者不顯示,在返回main函數時,也有可能導致之前壓入堆棧的資源發生改變,導致main()顯示異常,發生不可預料的結果。但是若main函數中沒有執行display函數時發生中斷,則中斷函數中的display函數則能正常顯示。

        解決這一問題的一個辦法是復制一套需要調用的子函數,給這些子函數重新命名,包括子函數中調用的子函數。這樣,主函數和中斷函數調用的子函數就不會發生沖突,兩邊都可正常執行。

        本文引用地址:http://www.104case.com/article/201611/321263.htm

        void display(void)//供main函數調用
        {
        write_com(0x01);
        ……
        ……;
        }
        void display_interrupt(void)//供interrupt函數調用
        {
        write_com_interrupt(0x01);//所有被調用的子函數都應備份
        ……;
        ……;
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 永兴县| 临清市| 响水县| 邹平县| 阿图什市| 长沙市| 永丰县| 花莲县| 兴业县| 武城县| 文化| 黄山市| 四子王旗| 榆社县| 三都| 攀枝花市| 陈巴尔虎旗| 永安市| 原平市| 毕节市| 通许县| 沙河市| 朝阳市| 息烽县| 潢川县| 定襄县| 英德市| 稷山县| 九龙县| 新民市| 伊川县| 开江县| 宝清县| 郴州市| 淳化县| 疏勒县| 海淀区| 四子王旗| 乐安县| 金门县| 喜德县|