能有方法實現嗎,哪位大蝦指點一把
網友評論:中斷是不可重入的
網友評論:終審判決:自身中斷是不能嵌套的.
可以認為同一中斷源是同一優先級,則不能打斷前一中斷響應,等前一中斷響應完成后再響應后一次中斷請求.
本判決為終審判決,不可上訴.
本貼討論到此為止
網友評論:免得誤導別人
網友評論:dengm大蝦的方法甚妙!可以看作是中斷嵌套!
網友評論:dengm和prcxf兩位沒有理解"嵌套"的含義吧,dengm那不是中斷嵌套,也不可以看成是嵌套,只是在中斷服務程序里的一個跳轉語句而已,跟本貼討論的"同一中斷的嵌套"沒有干系
正確答案在27樓
28樓說我不懂在誤導別人,你自以為很懂的話總是回答和樓主的問題不相關的話,人家既然問自身嵌套你就不要說其它嵌套很容易,也不要你管它為什么要自身嵌套、有沒有必要嵌套?你只管回答行還是不行,并給出理由就行了,還說樓主新手錯誤問題,表達錯誤,想法錯誤,哼哼,懂點皮毛就不得了了,看你的積分排名和你說的話不相稱
網友評論:終審
終審判決:自身中斷是不能嵌套的.
可以認為同一中斷源是同一優先級,則不能打斷前一中斷響應,等前一中斷響應完成后再響應后一次中斷請求.
本判決為終審判決,不可上訴.
本貼討論到此為止
網友評論:31樓的conwh朋友叫我來回答什么叫中斷是什么意思?莫非又是一個"高手"來考驗我這個"新手"?中斷定義:中斷是指
計算機暫時停止原程序的執行轉而為外部設備服務(執行中斷服務程序),并在服務完成后自動返回原程序執行的過程.
不知conwh朋友是否滿意我的解釋
網友評論:51可以完成類似RISC的中斷(只是響應中斷功能時不能自動關中斷),當然也要編程實現,一般的書是不會介紹的,INTEL的8051用戶手冊上有介紹,但RISC不能完成51的中斷嵌套功能(通過軟件編程也不能完全實現)...
51的中斷優先級方式是科學的...
RISC的中斷處理方法主要是考慮降低
硬件的復雜性...
網友評論:雖然沒用過,據說很費RAM的,建議你再想別的思路,不行就換片子吧,別難為51了,普通的51就256個
寄存器,除了其他用途的,能有多少剩余的?
網友評論:不要用這種辦法
網友評論:程序重入還必須考慮現場數據的保護,否則只是一個玩意而已。
網友評論:我在27樓難到對"中斷"的概念有什么不妥的說法?先撇開27樓對"能否自身嵌套"問題的說法是否正確,依conwh朋友的語氣好象我在27樓里還有對"中斷"這個概念的錯誤表述和認識,請conwh朋友明確的指出錯誤所在?
[我猜測conwh朋友的意思可能是指我27樓所表述的"不能打斷前一中斷"所以不叫中斷,所以說我沒理解中斷的概念.如果他是這個意思的話,那么在高優先級的中斷服務在執行時發生了低優先級中斷請求,那么是否也不能稱這個低優先級的中斷為"中斷"呢?照此推下去書上全錯了,因為幾乎所有單片機的書上都有這樣的描述:“如果新來的中斷其優先級比正在服務的優先級低,則CPU必須等到現有中斷服務完成以后才會自動響應新來的中斷請求”(第211頁,胡漢才,單片機原理及其接口技術,北京:清華大學出版社,2004)不知我對conwh朋友的意思的猜測是否正確,還請conwh朋友自己明確的把自己的意思表達出來]
網友評論:你也不需要引舉經典,我不是在34樓中明確說明你在33樓中回答準確嗎?
可是你看的書是指,“在撤消中斷標志之前”才有“如果新來的中斷其優先級比正在服務的優先級低,則CPU必須等到現有中斷服務完成以后才會自動響應新來的中斷請求”。如果高級的中斷發生了,并且在中斷中間(先甭管它是否有意義)交出了中斷級別,那么這是較低級的中斷也可以照樣發生和執行的。書是應該活著看,如果把它看死了,那看書就沒有什么意義了。你說我說的對否。
網友評論:“如果高級的中斷發生了,并且在中斷中間(先甭管它是否有意義)交出了中斷級別,那么這是較低級的中斷也可以照樣發生和執行的。”你的這句話是對的,可是你有沒有看清楚我在27樓說的“可以認為同一中斷源是同一優先級,則不能打斷前一中斷響應,等前一中斷響應完成后再響應后一次中斷請求”這句話?我的前提是“同一中斷源”,是同一中斷源請問就算在中斷服務中交出優先權是否還會如你所說能被自己再次打斷???書的確是死的,但你活著看也不要把一匹死馬也被你看得活起來了,這樣的活看比死看更無意義。你說我說的對否。
網友評論:不能響應第二次響應?按照你的原話是:
我的前提是“同一中斷源”,是同一中斷源請問就算在中斷服務中交出優先權是否還會如你所說能被自己再次打斷???
問題是越來越清楚了,答案就是:當然可以。
不知道你知道否,有個系統:就是分時系統,它就利用時間將各個進程給分割開,然后就是利用不同的狀態對各個進程進行連接,在表面看各個任務是獨立、并行完成,可實際就是時間割裂各進程單獨完成的。
網友評論:我認為,多任務系統的時分復用不屬于"自身嵌套"之列,它的分時復用時在一個中斷中執行同一中斷也不能稱為是像通常那樣的是在中斷服務中執行新的中斷請求,因為分時割裂進程這種情況在實際上并不是被同一中斷源打斷
再編輯加一句話:歡迎LS繼續辯駁,這兩天有事不來上網,過幾天再來聆聽高論!
網友評論:所以說:中斷是可以重復的,但不能是相同功能(自身)重復中斷。
網友評論:鄧喵的程序你到底仔細看了沒有?
我換種方式跟你解釋吧:
首先
ORG0023H;INTFORUART串口中斷入口,進入后本級中斷優先級被占用,也就是說不能響應本級或更低的中斷了,對吧?(1)
....;中斷程序
....
....
INT_RET:RETI;執行RETI,退出本中斷并釋放本級的中斷優先級占用,這時就能再響應本級優先級的中斷了,對吧?(2)
好,那再看下面的代碼:
;當前執行的程序段B
...
...
...
...
ACALL標號;執行到這一句,程序會把下一條指令地址壓棧,并跳轉到標號執行程序段A,對吧?(3)
NEXT:
....
....
;放在別的地方的另外一段程序
標號:;程序段A
....
....
RET;到這一句時,會把當前堆棧的2字節(之前ACALL壓棧的2字節)彈出到PC+1指針,下一條指令會接著執行ACALL標號的下一句(NEXT標號處的指令)以及后面的程序,對吧?(4)
如果你覺得問題(1)(2)(3)(4)的答案都是對的,那么繼續往下看:
我們在上面的程序中加幾句代碼,如下:
ORG0023H;INTFORUART串口中斷入口,進入后本級中斷優先級被占用,也就是說不能響應本級或更低的中斷了,對吧?(1)
SUB_TX:
....
ACALLINT_RET;執行到這一句,程序會把下一條指令地址壓棧,并跳轉到INT_RET:,對吧?(3)
;好,那我們跳到后面的INT_RET標號繼續跟蹤程序
NEXT:;ACALLINT_RET的下一句,為了好找我們做個記號
....;中斷程序
....
....
INT_RET:RETI;執行RETI,退出本中斷并釋放本級的中斷優先級占用,這時就能再響應本級優先級的中斷了,對吧?(2)
;INT_RET只有一句話:RETI,那這是會執行RETI,對吧?
;執行RETI的話,釋放本級的中斷優先級占用,并執行類似RET的功能把當前堆棧的2字節(之前ACALL壓棧的2字節)彈出到PC+1指針,下一條指令會接著執行ACALLINT_RET的下一句(NEXT標號處的指令)以及后面的程序,對吧?(4)
;這時原來的中斷程序是不是還能照樣執行,一直到RETI呢?
;是的話,那么這時再發生本級優先級的中斷請求,會不會響應呢??
;這時如果再有串口中斷請求,那么會不會再次響應呢?會不會再從ORG0023H;INTFORUART串口中斷入口進入串口中斷呢???
;如果會的話那這時是否嵌套了呢???
;如果你非要說不是什么“自嵌套”,那好,我在NEXT號后面加一句SETBRI或SETBTI,那會發生什么事呢????
;那就會不停的進中斷0023H,變成死循環了:-)當然,這是不允許的了:-)
你有耐心的話一個一個的做判斷題吧,判斷完了也就會有答案了...
網友評論:不過我覺得已經不是嵌套了.我想嵌套該是滿足FILO.否則何以稱"嵌套",頂多是重入.要想真正的嵌套需要找到其他途徑突破35樓說的硬件優先級判斷.
此外,我很同意xwj的觀點--原則上根本不該有這樣的設計.我沒能想出需要這個的理由.
大家歇歇氣.
網友評論:xwj你是不是有點想當然了?沒有發現你程序中RETI指令使用錯誤嗎?還正在暗自得意是吧?現在是深夜12:33我要睡覺了,明天一大早出去有事大后天才會回來,現在必須睡覺了所以對于你的錯誤我這里只提醒你就不詳細指出了,等大后天回來再給你細細道來.希望你自己能夠自己悟出并改正
網友評論:我也偷偷背了一遍.比起"前后臺"是有些優勢,但還是屬于非典作風.
網友評論:我45樓的貼只是為了讓你便于理解,自然不能說得太復雜,照那樣寫一次中斷自然會執行兩次RETI,真要實用自然是有辦法考慮到的,就不用你提醒了
中斷重入、如何可靠軟復位,這可以說是用的不能再用、討論的不想再討論的話題了,所以我前面都是一筆帶過了
你如果覺得這樣用RETI不正確,那么恭喜你,你是個很按規矩辦事的人!
但是,我也可以告訴你,我們公司十幾年前的程序中就有這樣的應用,而且可以說這么多年來都是可靠運行的。
而且,你去研究研究別人的OS代碼,你也會發現很多的這種應用的
非典的設計能實現很多看似不能或想象不到的功能,但也要做好承受代價的準備--稍有考慮不周就可能出些你意想不到的問題:-)
--雖然我很不贊成這種編程風格,一般都盡量避免,但在必要時也不會拒絕這種寫法
PS:這些都是很基礎的問題,我不覺得有什么好得意的地方,也不知道我哪里讓你覺得我“自鳴得意”了,
而且,最近我現在也確實很忙,白天基本上都很少灌水了,這帖子都是半夜爬起來碼的字,所以很多問題都是三言兩語指出關鍵避免走入彎路就沒管了,相信有心學習、樂于思考的人自己能找出答案的。
我不是21ic的版主,但我回答的問題比很多版主都多得多,但一直有個基本原則:不懂的決不說,只說對的!
比起直接給出答案,我更覺得提供線索、方向,讓疑問者自己去思考出答案應該能得到更多的收獲:-)
也只有碰到實在點不破的
燈籠或可能誤導新人的問題,才會詳細解答
網友評論:不過新手要先研究通鄧苗同志的寫法后再應用,否則可能要傷身體的~~~
網友評論:“中斷服務”在未結束前,降低自己的優先級。
如不要嵌套可這樣寫:
ORG0023H
JBCRI,SUB_RX
JBCTI,SUB_TX
INT_RET:
IRET
NOP
;---------------------
ORG0050H
sub_rx:;不要嵌套的
MOVBUF_SBUF,SBUF
CLRES;停本中斷源,不要嵌套
ACALLINT_RET;降低自己的優先級
;“中斷服務”還繼續。。。。。
XCHA,R1
ANLA,#1FH
ORLA,#60H;IN_BUF:60H-7FH
XCHA,R1
XCHA,BUF_SBUF
MOV@R1,A
INCR1
INCIN_LEN
MOVA,BUF_SBUF
SETBES;開本中斷源
;中斷相關指令,下一"ret"之前不會被中斷打斷,
RET;(在就是Intel的高明!!!)及時出棧
;------------------------------------------------------------
SUB_TX:;下面為嵌套的
ACALLINT_RET;降低自己的優先級
XCHA,OUT_LEN
JZSUB_TX_EX
;--------------------------
XCHA,OUT_INDEX
ANLA,#1FH
ORLA,#40H;OUT_BUF:40HTO5FH
XCHA,R0
XCHA,@R0
MOVSBUF,A
MOVA,@R0
XCHA,R0
INCA
XCHA,OUT_INDEX
DECA
SUB_TX_EX:
XCHA,OUT_LEN
RET
;----------------------------
網友評論:自己能中斷自己嗎?都是用一個中斷啊,是同一個中斷優先級,
我感覺不行
高手來說說,,看看能行不?//
網友評論:你的問題前面已經說了答案了...
網友評論:ISR:PUSHNext的地址
RETI;實際就是跳轉到Next去運行,并且把中斷標志清了
Next:
;做你要作的事
RET
搞定。
網友評論:xwj是其中之一,干著急,人家還死命要他醒悟,難辦哦難辦
網友評論:reti后,我認為中斷就已經結束了。我想,這樣的看法符合一個完整中斷過程的定義。
所以不是降為平民,是偷偷退出了。
-----
這段時間我對降為平民比較敏感。哈哈!
網友評論:以后都叫你“白板”了
這個名字不錯吧?比你那個“高潮”好吧?
相關鏈接:http://www.21icbbs.com/club/bbs/list.asp?boardid=7&t=2536231&tp=%u4E3A%u4E86%u7EAA%u5FF521ic%u6709%u53F2%u4EE5%u6765%u6700%u767D%u7684%u6591%u7AF9%uFF0C%u6211%u51B3%u5B9A%u4EE5%u540E%u90FD%u53EB%u7248%u4E3B%u201C%u767D%u677F%u201D%u4E86
網友評論:利用堆棧操作的技巧,偷偷更換了返回地址。其實已經返回了一次。
網友評論:應該可以的啊,可以做實驗驗證一下