|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請問各位大俠一個我不懂的問題? |
| 作者:lifengshun 欄目:單片機 |
你好! 請問當我的程序有中斷產(chǎn)生后,運行中斷服務程序,運行完后它會自動反回到被中斷程序繼續(xù)往下執(zhí)行,但是如果我在中斷程序中已經(jīng)達到我的目的,不想它返回到被中斷程序繼續(xù)往下執(zhí)行,而是回到程式的最頂端從頭開始,問我用怎么樣的辦法才可以. |
| 2樓: | >>參與討論 |
| 作者: tyw 于 2007/5/13 18:33:00 發(fā)布:
直接"LJMP 000H"好象應該沒多大問題 進中斷時,CPU把當時的PC指針壓入堆棧,而把相應的中斷矢量地址裝入PC,而正常RETI中斷返回時僅清除"優(yōu)先級激活"觸發(fā)器(該觸發(fā)器在響應中斷時被置位),以及從堆棧中彈出下一條指令地址裝入PC.這些動作若是程序從000H開始的話,影響不大,PC變00H了,IP在初始化中會重設,只是堆棧指針沒有復原.所以你只要比較一下,這種"熱啟動"與上電復位"冷啟動"的區(qū)別,不影響程序繼續(xù)正常運行,是可以直接"LJMP 000H"的. 記得初始化中要有堆棧指針SP定位的指令哦,否則你的"熱啟動"會讓你的堆棧溢出的拉. * - 本貼最后修改時間:2007-5-13 19:05:57 修改者:tyw |
|
| 3樓: | >>參與討論 |
| 作者: conwh 于 2007/5/13 18:51:00 發(fā)布:
用比較保險的,操作又簡單的,就是將返回地址改為你的目標地址 |
|
| 4樓: | >>參與討論 |
| 作者: tyw 于 2007/5/13 18:59:00 發(fā)布:
to conwh: 問題是LZ的中斷結果有兩種可能 若中斷未達到目的時,并不希望返到000H LZ能說說這種非正常動作的原因嗎?因為你這是在給自已找麻煩哦 * - 本貼最后修改時間:2007-5-13 19:03:23 修改者:tyw |
|
| 5樓: | >>參與討論 |
| 作者: xwj 于 2007/5/13 19:06:00 發(fā)布:
判斷后彈出2字節(jié)(原返回地址),再把跳轉(zhuǎn)地址壓入棧,再RETI |
|
| 6樓: | >>參與討論 |
| 作者: computer00 于 2007/5/13 19:13:00 發(fā)布:
把堆棧里面的返回地址改為0,然后RETI應該就可以了吧 |
|
| 7樓: | >>參與討論 |
| 作者: tyw 于 2007/5/13 19:14:00 發(fā)布:
LS高家莊滴很哦 一看就知道是個不守墨規(guī)的分子,哈哈 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() * - 本貼最后修改時間:2007-5-13 19:17:55 修改者:tyw |
|
| 8樓: | >>參與討論 |
| 作者: xwj 于 2007/5/13 19:23:00 發(fā)布:
蛋蛋的那種做法實際用時會存在很多問題哦 |
|
| 9樓: | >>參與討論 |
| 作者: conwh 于 2007/5/13 19:24:00 發(fā)布:
呵呵,主要是LZ是新手,對直接返回0時有些特殊位要進行操作 所以我說用修改返回地址的辦法,這樣就不用考慮什么了。如果是多項選擇,可以用特殊標志也就可以了。 |
|
| 10樓: | >>參與討論 |
| 作者: myfaith 于 2007/5/13 22:59:00 發(fā)布:
這很簡單啊 把你要進行中斷處理的部分寫一個子程序,中斷后滿足條件了就$,還沒滿足就繼續(xù)執(zhí)行程序,你只要在中斷服務程序里轉(zhuǎn)到那個子程序去執(zhí)行,不就OK了 |
|
| 11樓: | >>參與討論 |
| 作者: bg6nw 于 2007/5/13 23:36:00 發(fā)布:
也曾有同樣的困惑 我剛開始學編程的時候也在這方面絆倒過,后來壇子里的幾位前輩給指點的,才解決了想破頭也沒解決的問題。我當時也是這樣想的,在中斷里面判斷條件,符合條件后直接返回主程序頭部,但是當時學藝不精,返回的時候沒有用reti命令,而是直接jmp,導致第二次中斷時失去反應,因為在中斷時被置位的中斷優(yōu)先級觸發(fā)器必須靠reti指令釋放,在上一次中斷后直接跳出去,第二次就不靈光啦。 實際上這種動作應該是軟復位我認為,但是軟復位不是那么簡單的,如果程序比較大的話,半路上單片機里面的很多狀態(tài)都改變了,包括觸發(fā)器寄存器等等,在主程序頭部要一一設定好才穩(wěn)妥。這樣在reti到程序頂端的時候不至于出現(xiàn)意想不到的莫名其妙的故障。 我現(xiàn)在大部分的設計都是用這樣的方法:(獨創(chuàng)的,LS的前輩見笑了) 找一個閑置的端口,用電阻限流后接一個三極管的基極,三極管集電極和發(fā)射機和復位電容并聯(lián),在需要回到主程序頂端的時候,直接把這個端口置位,就可以引發(fā)硬件復位,這樣單片機的所有寄存器和鎖存器都置位了,降低了寫程序的難度,減少了不可預見的故障。自認為此法不錯,屢試不爽。 |
|
| 12樓: | >>參與討論 |
| 作者: conwh 于 2007/5/13 23:40:00 發(fā)布:
呵呵,LS的真有心。只要各種情況都考慮好了,也就不必要這樣做了 一般很少在程序執(zhí)行中,再從0開始執(zhí)行的。即便是這樣(要這樣)做,還不如把狗給餓死,不也就達到你的要求了。 |
|
| 13樓: | >>參與討論 |
| 作者: conwh 于 2007/5/14 1:01:00 發(fā)布:
呵呵,還有愛護小動物協(xié)會的,再等一會躺 |
|
| 14樓: | >>參與討論 |
| 作者: ayb_ice 于 2007/5/14 7:51:00 發(fā)布:
用軟件復位最好.... |
|
| 15樓: | >>參與討論 |
| 作者: xwj 于 2007/5/14 8:26:00 發(fā)布:
哪有小動物?拉過來看看... |
|
| 16樓: | >>參與討論 |
| 作者: lifengshun 于 2007/5/14 9:02:00 發(fā)布:
多謝各位高手的回答,我先去找點書參考參考. 多謝各位高手的回答,我已經(jīng)知道答案的方向了,我先去找點這方面的書參考參考.特別感謝tyw與bg6nw的回答,你們回答得很祥細,給了我方向.謝謝 |
|
| 17樓: | >>參與討論 |
| 作者: 懶人 于 2007/5/14 11:09:00 發(fā)布:
搞不懂為什么非得這樣做,,,奇思妙想 |
|
| 18樓: | >>參與討論 |
| 作者: 寒雨飛揚 于 2007/5/14 11:15:00 發(fā)布:
使用軟件陷阱 在中斷程序的開始首先進行壓棧: PUSH 00h PUSH 00h 不要寫出棧語句,這樣可以自動回到程序最頂端。 |
|
| 19樓: | >>參與討論 |
| 作者: ayb_ice 于 2007/5/14 11:23:00 發(fā)布:
隨便說說 直接(或間接)跳轉(zhuǎn)到00H處雖可以運行,但SFR沒有被初始化... |
|
| 20樓: | >>參與討論 |
| 作者: shiaf 于 2007/5/14 12:57:00 發(fā)布:
實在不明白為什么一定要這么干? 51 MCU 還好辦,象 PIC 這種硬件堆棧,還真不知道怎么弄。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |