|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
如何用c語言實(shí)現(xiàn)中斷響應(yīng)后保護(hù)現(xiàn)場前關(guān)中斷 |
| 作者:huanhuan03 欄目:單片機(jī) |
大家都知道當(dāng)中斷響應(yīng)后,一般要先關(guān)中斷,再現(xiàn)場保護(hù),用匯編時可以自己控制操作,那么用c語言如何實(shí)現(xiàn)這一部分呢?在中斷響應(yīng)函數(shù)中寫入ES=0已經(jīng)來不及了?該如何處理。 還有恢復(fù)現(xiàn)場時也如此,應(yīng)該先恢復(fù)現(xiàn)場然后再開中斷,可在c中都相反,該如何處理? 焦急啊,愁啊 |
| 2樓: | >>參與討論 |
| 作者: javie 于 2006/1/11 11:53:00 發(fā)布:
寫一個函數(shù) |
|
| 3樓: | >>參與討論 |
| 作者: hiberhe 于 2006/1/11 12:04:00 發(fā)布:
C51中處理中斷其實(shí)很簡單的 c51中,中斷函數(shù)的生成與一般函數(shù)的生成不一樣,編譯器會保存和恢復(fù)現(xiàn)場的(如ACC,B,DTPR,...),看一下手冊和反匯編代碼就知道了。 如果你要關(guān)中斷,那么直接用EA=0之類就可以了。但是本身的標(biāo)志沒有必要去清,比如在串口中斷服務(wù)程序中,沒有必要去ES=0,你要做的是趕緊處理完,越快越好,然后走人! 建議樓主看一下中斷處理那部分,其實(shí)非常簡單,注意中斷處理與匯編類似,沒有參數(shù),沒有返回值,注意自己的全局變量使用上的保護(hù)等就好了。 另外,如果你想在指行某個函數(shù)時,關(guān)中斷,在c51中有#disable之類的預(yù)處理語句。 |
|
| 4樓: | >>參與討論 |
| 作者: computer00 于 2006/1/11 12:29:00 發(fā)布:
一般來說,C語言寫的中斷,編譯器會自動生成保護(hù)現(xiàn)場的代碼 所以你不用保護(hù)現(xiàn)場,只負(fù)責(zé)寫處理的代碼就行。 除非你要弄操作系統(tǒng),任務(wù)切換時,就需要程序來負(fù)責(zé)保護(hù)現(xiàn)場。 |
|
| 5樓: | >>參與討論 |
| 作者: huanhuan03 于 2006/1/11 18:41:00 發(fā)布:
不是要保護(hù)現(xiàn)場 我不是要保護(hù)現(xiàn)場;保護(hù)現(xiàn)場的時候?yàn)榱送暾_的保護(hù)現(xiàn)場,最好先禁止所有中斷,保護(hù)好現(xiàn)場后可以再次關(guān)中斷,在匯編時我們可以在中斷入口處先禁止所有中斷,然后再保護(hù)現(xiàn)場,可在C中,中斷響應(yīng)函數(shù)只要響應(yīng)中斷即先保護(hù)現(xiàn)場,然后再執(zhí)行中斷函數(shù)中的語句,例如下邊的例子 void int4 (void) interrupt 4 {ES=0; RI=0; an_center(); SM2=1; ES=1;//與中心站通信完畢允許中斷 } 串行口中斷函數(shù),編譯后出現(xiàn)的語句是先保護(hù)現(xiàn)場然后執(zhí)行ES=0;執(zhí)行完之后先開中斷然后恢復(fù)現(xiàn)場,這和我們所要求的先禁止中斷之后保護(hù)現(xiàn)場,先恢復(fù)現(xiàn)場之后開中斷剛好相反,如何解決這個問題呢? |
|
| 6樓: | >>參與討論 |
| 作者: computer00 于 2006/1/11 18:45:00 發(fā)布:
那只好用匯編語言來寫中斷服務(wù)程序了。 不知道是否可以設(shè)置編譯器,讓編譯器不自動生成現(xiàn)場保護(hù)的代碼? |
|
| 7樓: | >>參與討論 |
| 作者: javie 于 2006/1/11 18:46:00 發(fā)布:
那要看是什么編譯器了 |
|
| 8樓: | >>參與討論 |
| 作者: AIRWILL 于 2006/1/11 18:52:00 發(fā)布:
想來想去沒有這個必要 |
|
| 9樓: | >>參與討論 |
| 作者: javie 于 2006/1/11 18:54:00 發(fā)布:
沒有什么必要啊? |
|
| 10樓: | >>參與討論 |
| 作者: huanhuan03 于 2006/1/11 18:54:00 發(fā)布:
我用的是keil 我用的是KEIL,應(yīng)該有人遇到過這種情況吧。 不知道中斷服務(wù)函數(shù)的入口程序在哪里,更改那個程序應(yīng)該是可以的阿 |
|
| 11樓: | >>參與討論 |
| 作者: huanhuan03 于 2006/1/12 9:38:00 發(fā)布:
找到了 #pragma disable放在中斷函數(shù)之前即可,看其編譯后的語句很好 |
|
| 12樓: | >>參與討論 |
| 作者: 夏蟲 于 2006/1/12 9:41:00 發(fā)布:
不知道為什么要這么用 要是怕別的中斷有干擾,那就設(shè)置優(yōu)先級嘛 |
|
| 13樓: | >>參與討論 |
| 作者: awey 于 2006/1/12 10:52:00 發(fā)布:
51中的中斷又不能嵌套,不知這么做有什么必要? 在一個中斷服務(wù)執(zhí)行過程中,不管ES值是什么,新的中斷都不能響應(yīng)。 |
|
| 14樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2006/1/12 11:44:00 發(fā)布:
保護(hù)是后續(xù)中斷(嵌套)的職責(zé) 就如果在主程序里面不需要保護(hù)現(xiàn)場,而在中斷中需要一樣,中斷的保護(hù)是相對主程序而言的。如果有嵌套發(fā)生,嵌套中斷的保護(hù)是相對低級中斷而言的。所以不需要關(guān)閉中斷,即使在低級中斷保護(hù)現(xiàn)場時被高等級中斷了,也沒關(guān)系,因?yàn)楦叩燃壷袛嘁矔鐾瑯拥氖虑椤?br> 不然,高等級中斷為什么要保護(hù)現(xiàn)場? ES=0是沒必要寫的,硬件已經(jīng)自動屏蔽了自身中斷,就是說自身中斷重入不會發(fā)生。 |
|
| 15樓: | >>參與討論 |
| 作者: computer00 于 2006/1/12 12:37:00 發(fā)布:
也許樓主是不想讓別的中斷源打斷他的中斷服務(wù)程序? |
|
| 16樓: | >>參與討論 |
| 作者: soho 于 2006/1/12 15:04:00 發(fā)布:
我也認(rèn)為沒必要 1. 自身中斷不會重入; 2. 低優(yōu)先中斷是否及時響應(yīng),還得看高優(yōu)先的是否在執(zhí)行,你跟誰搶幾個指令的時間? 所以,要想中斷快,設(shè)為高優(yōu)先. |
|
| 17樓: | >>參與討論 |
| 作者: lyhui1976 于 2006/1/12 17:12:00 發(fā)布:
樓上有理 |
|
| 18樓: | >>參與討論 |
| 作者: zzwj5120 于 2006/1/15 13:41:00 發(fā)布:
樓上的還是先回去看看書再問,根本不必關(guān)中斷 用KEIL C51的時候注意不要使用using 0 否則編譯器生成的中斷代碼不會將R0-R7保存, 這是KEIL C51編譯器的一個bug |
|
| 19樓: | >>參與討論 |
| 作者: linwei1234 于 2006/1/15 21:52:00 發(fā)布:
C應(yīng)該和編譯器有關(guān)吧! |
|
| 20樓: | >>參與討論 |
| 作者: 567 于 2006/1/17 12:57:00 發(fā)布:
多此一舉 |
|
| 21樓: | >>參與討論 |
| 作者: cock 于 2006/1/19 1:00:00 發(fā)布:
從EA=0來判斷51系列,進(jìn)入中斷后就不再響應(yīng)同級中斷,無須關(guān)中斷! |
|
| 22樓: | >>參與討論 |
| 作者: tyhtal 于 2006/1/19 15:16:00 發(fā)布:
沒有特殊要求,不用考慮 |
|
| 23樓: | >>參與討論 |
| 作者: Harvard 于 2006/1/19 15:17:00 發(fā)布:
附和一聲 我也覺得沒有必要,要不要編譯器做甚!除非使用RTOS |
|
| 24樓: | >>參與討論 |
| 作者: tzfzephyr 于 2006/2/7 20:03:00 發(fā)布:
你的意思是? 你怕其他的任務(wù)打擾這個中斷?? C語言中處理這些是有優(yōu)先級的,沒事。如果這個任務(wù)優(yōu)先級高后面的只能排隊(duì)。 |
|
| 25樓: | >>參與討論 |
| 作者: sun8990 于 2006/2/15 14:50:00 發(fā)布:
應(yīng)該不用 應(yīng)該不用吧 |
|
| 26樓: | >>參與討論 |
| 作者: qianjin 于 2010/6/30 8:56:00 發(fā)布:
中斷響應(yīng)時,什么情況下要進(jìn)行現(xiàn)場保護(hù)?如何保護(hù)? |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |