找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2427|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

keil C 是如何保護(hù)中斷現(xiàn)場(chǎng)的?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
50黑幣
突然想到個(gè)問(wèn)題,keil C 是如何保護(hù)中斷現(xiàn)場(chǎng)的?哪位大佬能指點(diǎn)下,或者給個(gè)資料或鏈接。謝謝

最佳答案

查看完整內(nèi)容

Keil C 是一個(gè)流行的微控制器開(kāi)發(fā)軟件,用于編寫(xiě)和調(diào)試使用匯編或 C 語(yǔ)言編寫(xiě)的代碼。在處理中斷時(shí),Keil C 通過(guò)使用特定的硬件中斷機(jī)制和編程技巧來(lái)保護(hù)中斷現(xiàn)場(chǎng)。 中斷處理通常涉及如下關(guān)鍵步驟: 1. **保護(hù)寄存器狀態(tài)**:在中斷進(jìn)入時(shí),會(huì)調(diào)用中斷服務(wù)程序 (ISR),在該程序中要確保不會(huì)發(fā)生任何可能導(dǎo)致上下文混亂的指令執(zhí)行。這通常涉及保護(hù)寄存器狀態(tài),例如基地址寄存器(例如,SP、BP、IP 等),并保存當(dāng)前正在執(zhí)行的指令 ...
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:982617 發(fā)表于 2024-8-5 14:27 | 只看該作者
Keil C 是一個(gè)流行的微控制器開(kāi)發(fā)軟件,用于編寫(xiě)和調(diào)試使用匯編或 C 語(yǔ)言編寫(xiě)的代碼。在處理中斷時(shí),Keil C 通過(guò)使用特定的硬件中斷機(jī)制和編程技巧來(lái)保護(hù)中斷現(xiàn)場(chǎng)。
中斷處理通常涉及如下關(guān)鍵步驟:
1. **保護(hù)寄存器狀態(tài)**:在中斷進(jìn)入時(shí),會(huì)調(diào)用中斷服務(wù)程序 (ISR),在該程序中要確保不會(huì)發(fā)生任何可能導(dǎo)致上下文混亂的指令執(zhí)行。這通常涉及保護(hù)寄存器狀態(tài),例如基地址寄存器(例如,SP、BP、IP 等),并保存當(dāng)前正在執(zhí)行的指令的地址(通常保存在狀態(tài)寄存器或中斷服務(wù)程序的局部變量中)。
2. **設(shè)置中斷屏蔽**:在某些微控制器中,可以通過(guò)設(shè)置中斷屏蔽寄存器來(lái)暫時(shí)禁用其他中斷,以避免在處理一個(gè)中斷時(shí)被另一個(gè)中斷打斷。
3. **執(zhí)行中斷服務(wù)程序**:中斷服務(wù)程序中執(zhí)行特定的中斷處理任務(wù)。這可能包括讀取或修改輸入/輸出設(shè)備狀態(tài)、更新?tīng)顟B(tài)變量、執(zhí)行事件處理、調(diào)整系統(tǒng)狀態(tài)等。
4. **恢復(fù)寄存器狀態(tài)**:在中斷服務(wù)程序執(zhí)行完畢后,需要將中斷前保存的寄存器狀態(tài)恢復(fù),以便繼續(xù)執(zhí)行中斷發(fā)生前的代碼。這通常包括恢復(fù)堆棧指針 (SP), 鏈接寄存器 (BP), 指令指針 (IP) 等。
5. **退出中斷**:最后,通過(guò)特定的中斷退出指令(如 `RETI`)來(lái)安全地退出中斷狀態(tài),回到中斷發(fā)生前的代碼執(zhí)行流程。
在 Keil C 中進(jìn)行中斷處理時(shí),開(kāi)發(fā)者通常使用預(yù)定義的中斷服務(wù)程序入口點(diǎn)(例如,`void __interrupt isr_name __attribute__((interrupt))`),并在這些函數(shù)中實(shí)現(xiàn)上述步驟。Keil C 編譯器通常會(huì)自動(dòng)或通過(guò)編程者手動(dòng)管理堆棧,確保中斷上下文的正確保護(hù)和恢復(fù)。
此外,在使用堆棧進(jìn)行中斷保護(hù)時(shí),需要確保提供的堆?臻g足夠大以容納必要的上下文信息,并且堆棧中沒(méi)有其他數(shù)據(jù)覆蓋中斷處理的所需信息。在編寫(xiě)中斷服務(wù)程序時(shí),應(yīng)避免使用任何可能需要全局或靜態(tài)變量的數(shù)據(jù),以減少產(chǎn)生錯(cuò)誤或不一致?tīng)顟B(tài)的風(fēng)險(xiǎn)。
Keil C 通過(guò)提供中斷機(jī)制支持和適當(dāng)?shù)木幊虒?shí)踐,幫助開(kāi)發(fā)者有效地保護(hù)中斷現(xiàn)場(chǎng),并安全地管理中斷處理過(guò)程。
回復(fù)

使用道具 舉報(bào)

板凳
ID:1109793 發(fā)表于 2024-8-5 15:02 | 只看該作者
都用C了,還管這些干嘛?
回復(fù)

使用道具 舉報(bào)

地板
ID:624769 發(fā)表于 2024-8-5 15:56 | 只看該作者
簡(jiǎn)單來(lái)講,就是在中斷函數(shù)中需要用到寄存器,在進(jìn)入中斷函數(shù)之初進(jìn)行入棧操作,在離開(kāi)中斷函數(shù)前進(jìn)行出棧操作。對(duì)于增強(qiáng)型51單片機(jī),這個(gè)保護(hù)可能不徹底,這時(shí)候需要用 _PUSH_() 函數(shù) 和 _POP_() 函數(shù)來(lái)手動(dòng)補(bǔ)缺。
回復(fù)

使用道具 舉報(bào)

5#
ID:526108 發(fā)表于 2024-8-5 16:42 | 只看該作者
keil c51不需要考慮中斷保護(hù)
回復(fù)

使用道具 舉報(bào)

6#
ID:57657 發(fā)表于 2024-8-5 16:59 | 只看該作者
你要搞清楚Keil使用什么內(nèi)核,多少位的編譯器,不同編譯器的底層結(jié)構(gòu)都不一樣:
回復(fù)

使用道具 舉報(bào)

7#
ID:1034262 發(fā)表于 2024-8-5 17:41 | 只看該作者
你看下反匯編就知道了。
回復(fù)

使用道具 舉報(bào)

8#
ID:466250 發(fā)表于 2024-8-5 18:24 | 只看該作者
主要是保存acc,運(yùn)算標(biāo)志位以及間接尋址寄存器。如果自己要做os,
看生成的匯編,一目了然
回復(fù)

使用道具 舉報(bào)

9#
ID:1126070 發(fā)表于 2024-8-6 13:47 | 只看該作者
在Keil C中,保護(hù)中斷現(xiàn)場(chǎng)是一個(gè)關(guān)鍵的過(guò)程,它確保了當(dāng)中斷發(fā)生時(shí),當(dāng)前程序的狀態(tài)(包括寄存器的值、程序計(jì)數(shù)器等)能夠被妥善保存,以便中斷服務(wù)程序(ISR)執(zhí)行完畢后能夠恢復(fù)到中斷發(fā)生前的狀態(tài),從而繼續(xù)執(zhí)行原來(lái)的程序。
以下是Keil C保護(hù)中斷現(xiàn)場(chǎng)的主要方式和步驟:
1、自動(dòng)保存寄存器
2、使用堆棧
3、Keil C的編譯器和庫(kù)支持
4、中斷服務(wù)程序的編寫(xiě)
回復(fù)

使用道具 舉報(bào)

10#
ID:21455 發(fā)表于 2024-8-6 18:50 | 只看該作者
1、感謝大家的熱心幫助。謝謝!
2、其實(shí),我是想看到KEIL C 的保護(hù)現(xiàn)場(chǎng)機(jī)制或叫思想,看它是否有特別的構(gòu)思。這個(gè)要求,估計(jì)難為大家了。
3、再次鳴謝大家!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表