中斷時(shí)一種處理器與外設(shè)進(jìn)行通信的機(jī)制,用于通知處理器外部有“重要事件”發(fā)生,一般情況下中斷需要被處理器響應(yīng)。
站在用戶的角度思考問題,與客戶深入溝通,找到扎魯特旗網(wǎng)站設(shè)計(jì)與扎魯特旗網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋扎魯特旗地區(qū)。
1.從外設(shè)中讀取中斷寄存器的值,以便了解中斷的類型
2.根據(jù)中斷類型具體設(shè)計(jì)處理邏輯
3.清除外設(shè)狀態(tài)寄存器中的中斷標(biāo)志位
4.清理處理器中的中斷標(biāo)識(shí)位
整個(gè)處理器過程如下所示:
軟件工程師眼中的中斷服務(wù)程序:
— 不能有返回值,不能有參數(shù)傳遞
— 必須短小而高效,避免浮點(diǎn)運(yùn)算
錯(cuò)誤示例:
__interrupt double compute_area(double radius)
{
double area = PI radius radius;
printf (“\n area = %f”, area);
return area;
}
—中斷的意義在于應(yīng)用程序不必關(guān)心中斷的發(fā)生與處理
—中斷服務(wù)程序不必關(guān)系應(yīng)用程序的執(zhí)行狀態(tài)
—中斷是“上層應(yīng)用”與“底層代碼”的分割邊界。
—硬中斷:通過處理器中斷信號(hào)線產(chǎn)生的中斷
CPU和外部設(shè)備是分別獨(dú)立的硬件執(zhí)行單元,CPU對(duì)全部設(shè)備進(jìn)行管理和資源調(diào)度處理,CPU要想知道外部設(shè)備的運(yùn)行狀態(tài),要么CPU定時(shí)的去查看外部設(shè)備特定寄存器,要么讓外部設(shè)備在出現(xiàn)需要CPU干涉處理時(shí)“打斷”CPU,讓它來處理外部設(shè)備的請(qǐng)求,毫無疑問第二種方式更合理,可以讓CPU“專心”去工作,這里的“打斷”操作就叫做中斷請(qǐng)求,根據(jù)請(qǐng)求的緊急情況,中斷請(qǐng)求分一般中斷和快速中斷,快速中斷具有最高中斷優(yōu)先級(jí)和最小的中斷延遲,通常用于處理高速數(shù)據(jù)傳輸及通道的中數(shù)據(jù)恢復(fù)處理,如DMA等,絕大部分外設(shè)使用一般中斷請(qǐng)求。
—軟中斷:通過非法指令或者特殊指令出發(fā)的中斷(或者稱為異常)
異常是應(yīng)用程序自己調(diào)用時(shí)產(chǎn)生的,用于用戶程序申請(qǐng)?jiān)L問硬件資源時(shí),例如:printf()打 印函數(shù),要將用戶數(shù)據(jù)打印到顯示器上,用戶程序要想實(shí)現(xiàn)打印必須申請(qǐng)使用顯示器,而用戶程序又沒有外設(shè)硬件的使用權(quán),只能通過使用軟件中斷指令切換到內(nèi)核態(tài),通過操作系統(tǒng)內(nèi)核代碼來訪問外設(shè)硬件,內(nèi)核態(tài)是工作在特權(quán)模式下,操作系統(tǒng)在特權(quán)模式下完成將用戶數(shù)據(jù)打印到顯示器上。這樣做的目的無非是為了保護(hù)操 作系統(tǒng)的安全和硬件資源的合理使用,該異常在管理模式下處理。
多個(gè)中斷同時(shí)出現(xiàn)時(shí),處理器會(huì)優(yōu)先響應(yīng)高優(yōu)先級(jí)的中斷,低優(yōu)先級(jí)的中斷ISR執(zhí)行時(shí)可以被高優(yōu)先級(jí)的中斷打斷。
思考:CPU如何保證fiq比irq快?有2個(gè)原因:
第一,fiq模式有專用的r8~r12,因此在fiq的isr中可以直接使用r8-r12而不用保存,這就能節(jié)省時(shí)間;
第二,異常向量表中fiq是最后一個(gè)異常向量入口。因此fiq的isr不需要跳轉(zhuǎn),可以直接寫在原地,這樣就比其他異常少跳轉(zhuǎn)一次,省了些時(shí)間。
A.斷點(diǎn)指的是調(diào)試工具用于暫停代碼執(zhí)行的指令位置、
B.斷點(diǎn)的實(shí)現(xiàn)為處理器的中斷支持
軟件斷點(diǎn):利用非法指令異常產(chǎn)生中斷實(shí)現(xiàn)(軟中斷)
硬件中斷:利用中斷寄存器的特定產(chǎn)生中斷實(shí)現(xiàn)
斷點(diǎn)程序的原理:
1.獲取源程序制定行對(duì)應(yīng)的代碼地址
2.把代碼地址中的指令替換為中斷觸發(fā)指令
3.在中斷服務(wù)程序中將控制權(quán)交給調(diào)試程序
4.調(diào)試程序讀取源程序上下文信息
5.調(diào)試程序?qū)⒋a中的指令還原
6.源程序從斷點(diǎn)處繼續(xù)向下執(zhí)行
上述過程和中斷的處理過程完全一致,圖解如下:
背景:嵌入式產(chǎn)品的實(shí)時(shí)性要求很高,各個(gè)task 有嚴(yán)格的時(shí)間要求,斷點(diǎn)調(diào)試不可用,只能依賴于打印調(diào)試(日志調(diào)試發(fā)),但是打印調(diào)試,打印的數(shù)據(jù)分布于產(chǎn)品各個(gè)角落,難以分析和定位,同時(shí)打印操作設(shè)計(jì)到IO操作,會(huì)影響產(chǎn)品效率
解決思路:結(jié)合日志調(diào)試發(fā)和斷點(diǎn)調(diào)試法的優(yōu)點(diǎn),使得實(shí)時(shí)系統(tǒng)調(diào)試時(shí),能夠任意查看制定代碼行上下文信息;并且不增加打印語句,不暫停執(zhí)行。
最終方案:
1.獲取原程序制定行對(duì)應(yīng)的代碼地址
2.把代碼地址中的指令替換為中斷觸發(fā)指令
3.在中斷服務(wù)程序中抓取全局信息和棧信息
4.抓取的信息發(fā)送會(huì)調(diào)試程序解析并輸出
本文參考自狄泰課程,特此致謝。