關(guān)于中斷部分系列篇將用三篇詳細說明整個過程.
中斷概念篇中斷概念很多,比如中斷控制器,中斷源,中斷向量,中斷共享,中斷處理程序等等.本篇做一次整理.先了解透概念才好理解中斷過程.本篇的主角是海公公,用海公公打比方說明白中斷各個概念.
中斷管理篇從中斷初始化HalIrqInit開始,到注冊中斷的LOS_HwiCreate函數(shù),到消費中斷函數(shù)的HalIrqHandler,剖析鴻蒙內(nèi)核實現(xiàn)中斷的過程,很像設(shè)計模式中的觀察者模式. 可前往鴻蒙內(nèi)核源碼分析(總目錄)查看.
中斷切換篇用自下而上的方式,從中斷源頭純匯編代碼往上跟蹤代碼細節(jié).說清楚保存和恢復(fù)中斷現(xiàn)場TaskIrqContext過程.可前往鴻蒙內(nèi)核源碼分析(總目錄)查看.
中斷概念
中斷模塊的核心是中斷控制器,這可是皇上(CPU)身邊的大紅人海公公,外部人員找皇上辦點事都必須經(jīng)過它.
什么是中斷?
中斷是指出現(xiàn)需要時,CPU暫停執(zhí)行當(dāng)前程序,轉(zhuǎn)而執(zhí)行新程序的過程。即在程序運行過程中,出現(xiàn)了一個必須由CPU立即處理的事務(wù)。此時,CPU暫時中止當(dāng)前程序的執(zhí)行轉(zhuǎn)而處理這個事務(wù),這個過程就叫做中斷。如圖:
外設(shè)可以在沒有CPU介入的情況下完成一定的工作,但某些情況下也需要CPU為其執(zhí)行一定的工作。通過中斷機制,在外設(shè)不需要CPU介入時,CPU可以執(zhí)行其它任務(wù),而當(dāng)外設(shè)需要CPU時,將通過產(chǎn)生中斷信號使CPU立即中斷當(dāng)前任務(wù)來響應(yīng)中斷請求。這樣可以使CPU避免把大量時間耗費在等待、查詢外設(shè)狀態(tài)的操作上,大大提高系統(tǒng)實時性以及執(zhí)行效率。
中斷相關(guān)的硬件介紹
與中斷相關(guān)的硬件可以劃分為三類:設(shè)備(找皇上辦事的事多了去)、中斷控制器(海公公)、CPU(皇上威武,執(zhí)天下耳)。
設(shè)備發(fā)起中斷的源,當(dāng)設(shè)備需要請求CPU時,產(chǎn)生一個中斷信號,該信號連接至中斷控制器。
中斷控制器中斷控制器是CPU眾多外設(shè)中的一個,管理外設(shè)的外設(shè),外設(shè)要使用CPU得先經(jīng)過它仲裁, 它一方面接收其它外設(shè)中斷引腳的輸入,另一方面它會發(fā)出中斷信號給CPU。所以可以通過對中斷控制器編程來打開和關(guān)閉中斷源、設(shè)置中斷源的優(yōu)先級和觸發(fā)方式。說的是海公公有權(quán)屏蔽大臣們的折子,降低娘娘們被臨幸的等級,讓你們見不到咱皇上. 常用的中斷控制器有VIC(Vector Interrupt Controller)和GIC(General Interrupt Controller)。在ARM Cortex-M系列中使用的中斷控制器是NVIC(Nested Vector Interrupt Controller)。在ARM Cortex-A7中使用的中斷控制器是GIC。
CPU中斷控制器分發(fā)的中斷源的請求給各個CPU,CPU收到請求便中斷當(dāng)前正在執(zhí)行的任務(wù),轉(zhuǎn)而執(zhí)行中斷處理程序。 用二張圖說明下三者的關(guān)系,能看出咱海公公的權(quán)利有多大.
中斷控制器文檔可前往ARM中斷控制器 gic_v2.pdf查看每個寄存器的作用.以下為鴻蒙內(nèi)核一小部分GIC寄存器的配置.
#ifdef LOSCFG_PLATFORM_BSP_GIC_V2 #define GICC_CTLR (GICC_OFFSET + 0x00) /* CPU Interface Control Register */ //CPU接口控制寄存器 #define GICC_PMR (GICC_OFFSET + 0x04) /* Interrupt Priority Mask Register */ //中斷優(yōu)先級屏蔽寄存器 #define GICC_BPR (GICC_OFFSET + 0x08) /* Binary Point Register */ //二進制點寄存器 #define GICC_IAR (GICC_OFFSET + 0x0c) /* Interrupt Acknowledge Register */ //中斷確認(rèn)寄存器 #define GICC_EOIR (GICC_OFFSET + 0x10) /* End of Interrupt Register */ //中斷結(jié)尾寄存器 #define GICC_RPR (GICC_OFFSET + 0x14) /* Running Priority Register */ //運行優(yōu)先寄存器 #define GICC_HPPIR (GICC_OFFSET + 0x18) /* Highest Priority Pending Interrupt Register */ //最高優(yōu)先級掛起中斷寄存器 #endif
中斷源
所謂中斷源,即引起中斷的事件或原因,或發(fā)出中斷申請的來源. 可分為外部中斷源和內(nèi)部中斷源兩大類。
外部中斷源是指由CPU的外部事件引發(fā)的中斷。主要包括:
一般中、慢速外設(shè),如鍵盤、打印機、鼠標(biāo)等;
數(shù)據(jù)通道,如磁盤、數(shù)據(jù)采集裝置、網(wǎng)絡(luò)等;
故障源,如電源掉電、外設(shè)故障、存儲器讀出出錯以及越限報警等事件。
內(nèi)部中斷源是指由CPU的內(nèi)部事件(異常)引發(fā)的中斷,主要包括:
由CPU執(zhí)行中斷指令I(lǐng)NT n引起的中斷;
由CPU的某些運算錯誤引起的中斷,如除數(shù)為0或商數(shù)超過了寄存器所能表達的范圍、溢出等;
為調(diào)試程序設(shè)置的中斷,如單步中斷、斷點中斷;
由特殊操作引起的異常,如存儲器越限、缺頁等。
核間中斷,比如cpu a 讓 cpu b 停止工作,產(chǎn)生調(diào)度等等.
這些都是想找咱皇上辦事的人.
中斷類型
把中斷源劃分為三種中斷類型
PPI:私有外設(shè)中斷(Private Peripheral Interrupt),是每個CPU私有的中斷。最多支持16個PPI中斷,硬件中斷號從ID16~ID31。PPI通常會送達到指定的CPU上,應(yīng)用場景有CPU本地時鐘。 類似于皇上自己的一些私事,不方便說的,比如大明湖畔的夏雨荷來了.
SGI:軟件觸發(fā)中斷(Software Generated Interrupt)通常用于多核間通訊,最多支持16個SGI中斷,硬件中斷號從ID0~ID15。SGI通常在內(nèi)核中被用作核間中斷(inter-processor interrupts),信號會送達到系統(tǒng)指定的CPU上. 主要用于多個皇上(CPU)并存的情況,皇上們直接約一起玩.
SPI:公用外設(shè)中斷(Shared Peripheral Interrupt),最多可以支持988個外設(shè)中斷,硬件中斷號從ID32~ID1019。 屬于外部公事,這種事比較多,比如無法預(yù)測的吳三桂同志突然造反了,黃河決堤了等等,所以排號也多,除了前面兩種其他的都屬于這類的.
中斷請求
“緊急事件”需向CPU提出申請(發(fā)一個電脈沖信號),要求CPU暫停當(dāng)前執(zhí)行的任務(wù),轉(zhuǎn)而處理該“緊急事件”,這一申請過程稱為中斷請求,這個申請必須經(jīng)過中斷控制器仲裁.
找皇上辦事的人先寫報告走流程,要求都要經(jīng)過咱海公公處過濾.
中斷觸發(fā)
中斷源向中斷控制器發(fā)送中斷信號(電平觸發(fā)或邊沿觸發(fā)),中斷控制器對中斷進行仲裁,確定優(yōu)先級,將中斷信號送給CPU。中斷源產(chǎn)生中斷信號的時候,會將中斷觸發(fā)器置“1”,表明該中斷源產(chǎn)生了中斷,要求CPU去響應(yīng)該中斷。
相當(dāng)于辦事的折子,折子統(tǒng)一到了海公公這處理,編號.
中斷優(yōu)先級
為使系統(tǒng)能夠及時響應(yīng)并處理所有中斷,系統(tǒng)根據(jù)中斷時間的重要性和緊迫程度,將中斷源分為若干個級別,稱作中斷優(yōu)先級。
海公公給折子分好優(yōu)先級.如花娘娘優(yōu)先級最高,西施娘娘給的銀子少優(yōu)先級最低.
中斷處理程序
當(dāng)外設(shè)產(chǎn)生中斷請求后,CPU暫停當(dāng)前的任務(wù),轉(zhuǎn)而響應(yīng)中斷申請,即執(zhí)行中斷處理程序。產(chǎn)生中斷的每個設(shè)備都有相應(yīng)的中斷處理程序。
海公公把折子交給了咱皇上,皇上一一處理所有折子.
中斷向量表
中斷號 :每個中斷請求信號都會有特定的標(biāo)志,使得計算機能夠判斷是哪個設(shè)備提出的中斷請求,這個標(biāo)志就是中斷號。
中斷向量 :中斷服務(wù)程序的入口地址。
中斷向量表是存儲中斷向量的存儲區(qū),中斷向量與中斷號對應(yīng),中斷向量在中斷向量表中按照中斷號順序存儲。 中斷向量表是所有中斷處理程序的入口,如下圖所示中斷處理過程:把一個函數(shù)(用戶中斷服務(wù)程序)同一個虛擬中斷向量表中的中斷向量聯(lián)系在一起。當(dāng)中斷向量對應(yīng)中斷發(fā)生的時候,被掛接的用戶中斷服務(wù)程序就會被調(diào)用執(zhí)行。
所有中斷都采用中斷向量表的方式進行處理,即當(dāng)一個中斷觸發(fā)時,處理器將直接判定是哪個中斷源,然后直接跳轉(zhuǎn)到相應(yīng)的固定位置進行處理,每個中斷服務(wù)程序必須排列在一起放在統(tǒng)一的地址上。中斷向量表一般由一個數(shù)組定義或在起始代碼中給出.
皇上把折子一對一的仔細處理,找到給對應(yīng)折子辦事的人.
用戶中斷服務(wù)程序(ISR)
在用戶中斷服務(wù)程序(ISR)中,分為兩種情況:
第一種情況是不進行線程切換,這種情況下會進行任務(wù)中斷上下文TaskIrqContext切換,用戶中斷服務(wù)程序和中斷后續(xù)程序運行完畢后退出中斷模式,返回被中斷的線程。
另一種情況是,在中斷處理過程中需要進行線程切換,這種切換還會進行任務(wù)上下文TaskContext的切換.
具體下面辦事的人把事辦完.
中斷嵌套
在允許中斷嵌套的情況下,在執(zhí)行中斷服務(wù)程序的過程中,如果出現(xiàn)高優(yōu)先級的中斷,當(dāng)前中斷服務(wù)程序的執(zhí)行將被打斷,以執(zhí)行高優(yōu)先級中斷的中斷服務(wù)程序,當(dāng)高優(yōu)先級中斷的處理完成后,被打斷的中斷服務(wù)程序才又得到繼續(xù)執(zhí)行,如果需要進行線程調(diào)度,線程的上下文切換將在所有中斷處理程序都運行結(jié)束時才發(fā)生,如下圖所示。
先把西施娘娘的事停了,現(xiàn)如花娘娘殺到,優(yōu)先級高,老奴安排皇上先辦如花娘娘,再接著辦西施娘娘.奴才擔(dān)心皇上這身子骨吃不吃得消.?
中斷共享
當(dāng)外設(shè)較少時,可以實現(xiàn)一個外設(shè)對應(yīng)一個中斷號,但為了支持更多的硬件設(shè)備,可以讓多個設(shè)備共享一個中斷號,共享同一個中斷號的中斷處理程序形成一個鏈表。當(dāng)外部設(shè)備產(chǎn)生中斷申請時,系統(tǒng)會遍歷執(zhí)行中斷號對應(yīng)的中斷處理程序鏈表直到找到對應(yīng)設(shè)備的中斷處理程序。在遍歷執(zhí)行過程中,各中斷處理程序可以通過檢測設(shè)備ID,判斷是否是這個中斷處理程序?qū)?yīng)的設(shè)備產(chǎn)生的中斷。
簡單一句話就是:共用一個折子,分別辦多件事.
核間中斷
屬于SGI中斷類型,對于多核系統(tǒng),中斷控制器允許一個CPU的硬件線程去中斷其他CPU的硬件線程,這種方式被稱為核間中斷。核間中斷的實現(xiàn)基礎(chǔ)是多CPU內(nèi)存共享,采用核間中斷可以減少某個CPU負(fù)荷過大,有效提升系統(tǒng)效率。
typedef enum {//鴻蒙核間中斷 LOS_MP_IPI_WAKEUP, //喚醒CPU LOS_MP_IPI_SCHEDULE,//調(diào)度CPU LOS_MP_IPI_HALT, //停止CPU } MP_IPI_TYPE;
可以看出CPU之間可以相互喚醒,調(diào)度,停止.
核間中斷有點特殊,出現(xiàn)于多個皇上(CPU)的情況. 皇上之間可以相互使喚,停止工作.比如:A皇上通過海公公讓B皇上休息.
功能API
功能分類 | 接口名 | 描述 |
---|---|---|
創(chuàng)建和刪除中斷 | LOS_HwiCreate | 中斷創(chuàng)建,注冊中斷號、中斷觸發(fā)模式、中斷優(yōu)先級、中斷處理程序。中斷被觸發(fā)時,handleIrq會調(diào)用該中斷處理程序 |
LOS_HwiDelete | 刪除中斷 | |
打開和關(guān)閉所有中斷 | LOS_IntUnLock | 打開當(dāng)前處理器所有中斷響應(yīng) |
LOS_IntLock | 關(guān)閉當(dāng)前處理器所有中斷響應(yīng) | |
LOS_IntRestore | 恢復(fù)到使用LOS_IntLock關(guān)閉所有中斷之前的狀態(tài) | |
使能和屏蔽指定中斷 | LOS_HwiDisable | 中斷屏蔽(通過設(shè)置寄存器,禁止CPU響應(yīng)該中斷) |
LOS_HwiEnable | 中斷使能(通過設(shè)置寄存器,允許CPU響應(yīng)該中斷) | |
設(shè)置中斷優(yōu)先級 | LOS_HwiSetPriority | 設(shè)置中斷優(yōu)先級 |
觸發(fā)中斷 | LOS_HwiTrigger | 觸發(fā)中斷(通過寫中斷控制器的相關(guān)寄存器模擬外部中斷) |
清除中斷寄存器狀態(tài) | LOS_HwiClear | 清除中斷號對應(yīng)的中斷寄存器的狀態(tài)位,此接口依賴中斷控制器版本,非必需 |
核間中斷 | LOS_HwiSendIpi | 向指定核發(fā)送核間中斷,此接口依賴中斷控制器版本和cpu架構(gòu),該函數(shù)僅在SMP模式下支持 |
設(shè)置中斷親和性 | LOS_HwiSetAffinity | 設(shè)置中斷的親和性,即設(shè)置中斷在固定核響應(yīng)(該函數(shù)僅在SMP模式下支持) |
編輯:hfy
-
處理器
+關(guān)注
關(guān)注
68文章
19293瀏覽量
229968 -
cpu
+關(guān)注
關(guān)注
68文章
10870瀏覽量
211901
發(fā)布評論請先 登錄
相關(guān)推薦
評論