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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機C程序的中斷函數(shù)調(diào)用子程序沖突問題

          單片機C程序的中斷函數(shù)調(diào)用子程序沖突問題

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

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

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

          void display(void)//供main函數(shù)調(diào)用
          {
          write_com(0x01);
          ……
          ……;
          }
          void display_interrupt(void)//供interrupt函數(shù)調(diào)用
          {
          write_com_interrupt(0x01);//所有被調(diào)用的子函數(shù)都應(yīng)備份
          ……;
          ……;
          }



          評論


          技術(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); })();