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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Codewarrior for HCS12的中斷服務(wù)程序編寫說明

          Codewarrior for HCS12的中斷服務(wù)程序編寫說明

          作者: 時間:2016-11-24 來源:網(wǎng)絡(luò) 收藏

          在CW4.6環(huán)境下,中斷編程主要有兩種方式:

          第一種是使用“interrupt”關(guān)鍵字,“interrupt”關(guān)鍵字是一個非標(biāo)準ANSI-C的關(guān)鍵字,因此,它不能被所有ANSI-C編譯器廠商所支持。同樣,對不同的編譯器,interrupt”關(guān)鍵字的用法可能會改變。“interrupt”關(guān)鍵字同樣會提示編譯器下面的函數(shù)是一個中斷服務(wù)例程。
          例: void interrupt 20 SCI0_ISR(void);
          其中,interrupt表示該函數(shù)為終端服務(wù)程序,后面的20表示中斷號20,在這里SCI0的中斷向量號就是20.
          這種方法寫起來非常簡單,但是,在S12單片機實際使用中,中斷號并沒有在手冊中給出,通常需要自己在中斷向量表中從上往下數(shù)出來,或者根據(jù)中斷向量計算得到,很容易出錯。
          于是有了第二種方法:
          在ISR程序之前,使用符號“#pragma TRAP_PROC”,TRAP_PROC 提示編譯器下面的函數(shù)是中斷服務(wù)例程。編譯器會用一個特殊的中斷返回指令來結(jié)束這個函數(shù)。
          此時,中斷函數(shù)的書寫如下所示:
          #pragma TRAP_PROC
          void SCI0_ISR(void){
          ...
          }
          這時候編譯器不知道這個ISR指向那個中斷向量,我們需要在鏈接文件即:prm文件中指定之。
          使用 VECTOR命令來實現(xiàn)中斷向量與ISR程序的連接。
          例:
          VECTOR 0 _Startup//這是系統(tǒng)默認prm文件中自帶的,即復(fù)位后0號中斷即復(fù)位中斷的ISR為_Startup()
          我們可以這樣寫:
          VECTOR 20 SCI0_ISR //指定中斷號
          或者
          VECTOR ADDRESS 0xFFD6 SCI0_ISR //直接指定中斷向量地址
          注:使用#pragma TRAP_PROC與修改prm文件的方法,在中斷服務(wù)子程序的結(jié)尾處必須要手動加入返回主程序的指令,包括取出堆棧、中斷返回兩個步驟。
          在S12單片機中,可以寫作
          asm {
          pula;
          rti;
          }
          尾注:
          兩種方法所寫的中斷服務(wù)子程序必須被放在非分頁存儲區(qū)內(nèi),即non_blanked code seg.
          其中一種常用的方法是在服務(wù)子程序前聲明:
          //下面代碼放在NON_BANKED區(qū)
          #pragma CODE_SEG NON_BANKED
          在中斷程序后聲明:
          //下面內(nèi)容按默認放置
          #pragma CODE_SEG DEFAULT



          評論


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