91精品一区二区三区久久久久久_欧美一级特黄大片色_欧美一区二区人人喊爽_精品一区二区三区av

位置:51電子網 » 技術資料 » 單 片 機

關于單片機中斷多優先級的軟件擴展方法

發布時間:2009/2/4 0:00:00 訪問次數:697

  1 引言

  所謂中斷是指當cpu正在處理某件事情的時候,外部發生的某一事件(如一個電平的變化,一個脈沖沿的發生或定時器計數溢出等)請求cpu迅速去處理,于是cpu暫時中止當前的工作,轉去處理所發生的事件。中斷服務處理完該事件以后,再回到原來被中止的地方繼續原來的工作,這樣的一個過程稱之為中斷。以8051為例,中斷系統含有5個中斷源,分別是外部中斷0請求(int0),外部中斷1請求(int1),定時/計數器0溢出中斷請求(t0),定時/計數器1溢出中斷請求(t1)以及串行口中斷請求(tx/rx)。既然系統含有5個中斷源,就有可能出現數個中斷源同時提出中斷請求的情況,這樣,設計人員必須事先根據它們的輕重緩急來為每個中斷源確定cpu對其的響應順序。然而,對于中斷優先級寄存器ip來說,只可能設定兩級優先,即控制位為1時對應的中斷源為高級中斷,反之,控制位為0時對應的為低級中斷。這樣就出現一個問題:如果一個中斷正在執行,如何才能讓它響應同級甚至是低級中斷請求呢?

  2 中斷多優先級的擴展

  根據8051的結構特點,其中斷系統中含有兩個不可尋址的“優先級生效”觸發器。一個用于指出cpu是否正在執行高優先級的中斷服務程序,這個觸發器為1時,系統將屏蔽所有的中斷請求;另一個則指出cpu是否正在執行低優先級中斷服務程序,該觸發器為1時,將阻止除高優先級以外的一切中斷請求。由此可見,若要響應同級甚至是低級中斷請求,必須使得該“優先級生效”觸發器清零。但該觸發器又是不可尋址的,所以無法用軟件直接清零。遍歷系統所提供的111條指令,只有reti可以達到此目的。該指令可在cpu執行該指令時,一方面清除中斷響應時所置位的“優先級生效”觸發器,另一方面可從當前棧頂彈出斷點地址送入程序計數pc,從而返回主程序。

  3 軟件擴展方法

  3.1 高級中斷源響應低級中斷源的軟件設計

  現以當前ie=84h(開放外部中斷1及總控制位),ip=04h設定int1為高優先級 正在執行外部中斷1服務子程序為例來進行說明。如欲響應串行口中斷,也就是要實現高級中斷源響應低級中斷源,設計時可加入如下代碼而無須改變ip寄存器的內容:

  push ie ;ie內容入棧保護

  mov ie , #10010000b ;開放串行口中斷

  call pp ;繼續執行原中斷子程序,但可

  隨時響應串行口中斷請求

  ...

  pop ie ;恢復原ie內容

  reti

  pp: reti

  3.2 同級中斷源之間的響應

  上述代碼體現了高級中斷源(int1)響應低級中斷源(串行口)的軟件實現方法。但是, 8051系統共含有5個中斷源,因此必須解決同優先級中斷之間的嵌套問題,具體源程序如下:

  org 0000h

  ljmp main

  org 0003h

  ljmp x0 ;int0入口地址

  org 000bh

  ljmp t0 ;t0入口地址

  org 0013h

  ljmp x1 ;int1入口地址

  org 001bh

  ljmp t1 ;t1入口地址

  org 0023h

  ljmp ss ;串行口入口地址

  main: mov ie ,#9fh ;開放所有中斷

  mov ip,#03h ;設定int0、t0為高優先級

  sjmp $

  x0: push dpl

  push dph

  mov dptr,#x0rl

  push dpl

  push dph

  reti ;(pc)=x0rl,清"高優先級生效"

  觸發器,此時可響應其它中斷請求

  x0rl:· ;int0子程序的真實入口地址

  ·

  ·

  ·

  pop dph

  pop dpl

  reti

  t0: push dpl

  push dph

  mov dptr,#t0rl

  push dpl

  push dph

  reti ;(pc)=t0rl,清"高優先級生效"

  觸發器,此時可響應其它中斷請求

  t0rl: · ;t0子程序的真實入口地址

  ·

  ·

  ·

  pop dph

  pop dpl

  reti

  x1: push dpl

  push dph

  mov dptr,#x1rl

  push dpl

 

  1 引言

  所謂中斷是指當cpu正在處理某件事情的時候,外部發生的某一事件(如一個電平的變化,一個脈沖沿的發生或定時器計數溢出等)請求cpu迅速去處理,于是cpu暫時中止當前的工作,轉去處理所發生的事件。中斷服務處理完該事件以后,再回到原來被中止的地方繼續原來的工作,這樣的一個過程稱之為中斷。以8051為例,中斷系統含有5個中斷源,分別是外部中斷0請求(int0),外部中斷1請求(int1),定時/計數器0溢出中斷請求(t0),定時/計數器1溢出中斷請求(t1)以及串行口中斷請求(tx/rx)。既然系統含有5個中斷源,就有可能出現數個中斷源同時提出中斷請求的情況,這樣,設計人員必須事先根據它們的輕重緩急來為每個中斷源確定cpu對其的響應順序。然而,對于中斷優先級寄存器ip來說,只可能設定兩級優先,即控制位為1時對應的中斷源為高級中斷,反之,控制位為0時對應的為低級中斷。這樣就出現一個問題:如果一個中斷正在執行,如何才能讓它響應同級甚至是低級中斷請求呢?

  2 中斷多優先級的擴展

  根據8051的結構特點,其中斷系統中含有兩個不可尋址的“優先級生效”觸發器。一個用于指出cpu是否正在執行高優先級的中斷服務程序,這個觸發器為1時,系統將屏蔽所有的中斷請求;另一個則指出cpu是否正在執行低優先級中斷服務程序,該觸發器為1時,將阻止除高優先級以外的一切中斷請求。由此可見,若要響應同級甚至是低級中斷請求,必須使得該“優先級生效”觸發器清零。但該觸發器又是不可尋址的,所以無法用軟件直接清零。遍歷系統所提供的111條指令,只有reti可以達到此目的。該指令可在cpu執行該指令時,一方面清除中斷響應時所置位的“優先級生效”觸發器,另一方面可從當前棧頂彈出斷點地址送入程序計數pc,從而返回主程序。

  3 軟件擴展方法

  3.1 高級中斷源響應低級中斷源的軟件設計

  現以當前ie=84h(開放外部中斷1及總控制位),ip=04h設定int1為高優先級 正在執行外部中斷1服務子程序為例來進行說明。如欲響應串行口中斷,也就是要實現高級中斷源響應低級中斷源,設計時可加入如下代碼而無須改變ip寄存器的內容:

  push ie ;ie內容入棧保護

  mov ie , #10010000b ;開放串行口中斷

  call pp ;繼續執行原中斷子程序,但可

  隨時響應串行口中斷請求

  ...

  pop ie ;恢復原ie內容

  reti

  pp: reti

  3.2 同級中斷源之間的響應

  上述代碼體現了高級中斷源(int1)響應低級中斷源(串行口)的軟件實現方法。但是, 8051系統共含有5個中斷源,因此必須解決同優先級中斷之間的嵌套問題,具體源程序如下:

  org 0000h

  ljmp main

  org 0003h

  ljmp x0 ;int0入口地址

  org 000bh

  ljmp t0 ;t0入口地址

  org 0013h

  ljmp x1 ;int1入口地址

  org 001bh

  ljmp t1 ;t1入口地址

  org 0023h

  ljmp ss ;串行口入口地址

  main: mov ie ,#9fh ;開放所有中斷

  mov ip,#03h ;設定int0、t0為高優先級

  sjmp $

  x0: push dpl

  push dph

  mov dptr,#x0rl

  push dpl

  push dph

  reti ;(pc)=x0rl,清"高優先級生效"

  觸發器,此時可響應其它中斷請求

  x0rl:· ;int0子程序的真實入口地址

  ·

  ·

  ·

  pop dph

  pop dpl

  reti

  t0: push dpl

  push dph

  mov dptr,#t0rl

  push dpl

  push dph

  reti ;(pc)=t0rl,清"高優先級生效"

  觸發器,此時可響應其它中斷請求

  t0rl: · ;t0子程序的真實入口地址

  ·

  ·

  ·

  pop dph

  pop dpl

  reti

  x1: push dpl

  push dph

  mov dptr,#x1rl

  push dpl

 

相關IC型號

熱門點擊

 

推薦技術資料

硬盤式MP3播放器終級改
    一次偶然的機會我結識了NE0 2511,那是一個遠方的... [詳細]
版權所有:51dzw.COM
深圳服務熱線:13692101218  13751165337
粵ICP備09112631號-6(miitbeian.gov.cn)
公網安備44030402000607
深圳市碧威特網絡技術有限公司
付款方式


 復制成功!
宜都市| 类乌齐县| 稷山县| 陇南市| 乐亭县| 克拉玛依市| 兴业县| 平定县| 澄城县| 沿河| 贵南县| 泾阳县| 镇安县| 鄂托克前旗| 辽源市| 田阳县| 南康市| 深水埗区| 大竹县| 福海县| 陵川县| 柳林县| 清远市| 三明市| 浏阳市| 合江县| 获嘉县| 德州市| 交口县| 祥云县| 泰和县| 惠来县| 海兴县| 海南省| 金坛市| 西盟| 峡江县| 张掖市| 汉寿县| 买车| 旺苍县|