0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙內(nèi)核源碼分析:引起中斷的事件或原因

鴻蒙系統(tǒng)HarmonyOS ? 來源:my.oschina ? 作者:鴻蒙內(nèi)核源碼分析 ? 2021-04-25 09:25 ? 次閱讀

關(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ù),這個過程就叫做中斷。如圖:

o4YBAGCFGziAbkzcAACKLV_DXPw505.png

外設(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ò)等;

實時時鐘,如定時器定時已到,發(fā)中斷申請;

故障源,如電源掉電、外設(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í)行。

o4YBAGCFG5WAQ2_VAAEdtMQ431Y200.png

所有中斷都采用中斷向量表的方式進行處理,即當(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ā)生,如下圖所示。

pIYBAGCFG6KAFt89AAAqgr0UPUo242.png

先把西施娘娘的事停了,現(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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19293

    瀏覽量

    229968
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10870

    瀏覽量

    211901
收藏 人收藏

    評論

    相關(guān)推薦

    鴻蒙內(nèi)核源碼Task/線程技術(shù)分析

    前言 在鴻蒙內(nèi)核中,廣義上可理解為一個Task就是一個線程 一、怎么理解Task 1. 官方文檔是怎么描述線程 基本概念 從系統(tǒng)的角度看,線程是競爭系統(tǒng)資源的最小運行單元。線程可以使用等待CPU
    的頭像 發(fā)表于 10-18 10:42 ?2226次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>源碼</b>Task/線程技術(shù)<b class='flag-5'>分析</b>

    【HarmonyOS】鴻蒙內(nèi)核源碼分析(調(diào)度機制篇)

    意義上所理解的線程呢。狹義上的后續(xù)有 鴻蒙內(nèi)核源碼分析(啟動過程篇) 來說明。不知道大家有沒有這種體會,學(xué)一個東西的過程中要接觸很多新概念,尤其像 Java/android 的生態(tài),概
    發(fā)表于 10-14 14:00

    鴻蒙內(nèi)核源碼分析:用通俗易懂的語言告訴你鴻蒙內(nèi)核發(fā)生了什么?

    查看。內(nèi)存在內(nèi)核的比重極大內(nèi)存模塊占了鴻蒙內(nèi)核約15%代碼量, 近50個文件,非常復(fù)雜。鴻蒙源碼分析
    發(fā)表于 11-19 10:14

    鴻蒙內(nèi)核源碼分析源碼注釋篇):給HarmonyOS源碼逐行加上中文注釋

    都懂的概念去詮釋或者映射一個他們從沒聽過的概念.說別人能聽得懂的話這很重要!!! 一個沒學(xué)過計算機知識的賣菜大媽就不可能知道內(nèi)核的基本運作了嗎? NO!,筆者在系列篇中試圖用 鴻蒙源碼分析
    發(fā)表于 11-19 10:32

    鴻蒙內(nèi)核源碼分析:給HarmonyOS源碼逐行加上中文注釋

    過計算機知識的賣菜大媽就不可能知道內(nèi)核的基本運作了嗎? NO!,筆者在系列篇中試圖用 鴻蒙源碼分析系列篇|張大爺系列故事【 CSDN | OSCHINA】 去構(gòu)建這一層級的認(rèn)知,希望能
    發(fā)表于 11-19 15:06

    鴻蒙源碼分析系列(總目錄) | 給HarmonyOS源碼逐行加上中文注釋

    篇)---- 正在更新中...|-鴻蒙內(nèi)核源碼分析(main篇) ---- 正在更新中...|-鴻蒙內(nèi)核
    發(fā)表于 11-20 11:24

    鴻蒙內(nèi)核源碼分析(必讀篇):用故事說內(nèi)核

    本文基于開源鴻蒙內(nèi)核分析,官方源碼【kernel_liteos_a】官方文檔【docs】參考文檔【Huawei LiteOS】本文作者:鴻蒙
    發(fā)表于 11-23 10:15

    鴻蒙內(nèi)核源碼分析(調(diào)度機制篇):Task是如何被調(diào)度執(zhí)行的

    本文分析任務(wù)調(diào)度機制源碼 詳見:代碼庫建議先閱讀閱讀之前建議先讀本系列其他文章,進入鴻蒙系統(tǒng)源碼分析(總目錄),以便對本文任務(wù)調(diào)度機制的理解
    發(fā)表于 11-23 10:53

    鴻蒙內(nèi)核源碼分析(必讀篇)

    本文基于開源鴻蒙內(nèi)核分析,官方源碼【kernel_liteos_a】官方文檔【docs】參考文檔【Huawei LiteOS】本文作者:鴻蒙
    發(fā)表于 11-25 09:28

    HarmonyOS內(nèi)核源碼分析(上)電子書-上線了

    `為方便大家開發(fā)鴻蒙系統(tǒng),小編為大家編輯整理了一本HarmonyOS內(nèi)核源碼分析系列電子書,需要參考學(xué)習(xí)的朋友快來下吧!本電子書主要介紹如何給鴻蒙
    發(fā)表于 11-25 17:13

    鴻蒙內(nèi)核源碼分析(百篇博客分析.挖透鴻蒙內(nèi)核)

    致敬內(nèi)核開發(fā)者感謝開放原子開源基金會,致敬鴻蒙內(nèi)核開發(fā)者。可以毫不夸張的說鴻蒙內(nèi)核源碼可作為大學(xué)
    發(fā)表于 07-04 17:16

    鴻蒙內(nèi)核源碼分析鴻蒙內(nèi)核的每段匯編代碼解析

    本篇說清楚CPU的工作模式 讀本篇之前建議先讀鴻蒙內(nèi)核源碼分析(總目錄)其他篇. 正如一個互聯(lián)網(wǎng)項目的后臺管理系統(tǒng)有權(quán)限管理一樣,CPU工作是否也有權(quán)限(模式)? 一個成熟的軟硬件架構(gòu)
    的頭像 發(fā)表于 03-02 09:56 ?4364次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>源碼</b><b class='flag-5'>分析</b>:<b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b>的每段匯編代碼解析

    鴻蒙內(nèi)核源碼分析: 虛擬內(nèi)存和物理內(nèi)存是怎么管理的

    有了上篇鴻蒙內(nèi)核源碼分析(內(nèi)存概念篇)的基礎(chǔ),本篇講內(nèi)存管理部分,本章源碼超級多,很燒腦,但筆者關(guān)鍵處都加了注釋。廢話不多說,開始吧。內(nèi)存一
    發(fā)表于 11-23 11:45 ?19次下載
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>源碼</b><b class='flag-5'>分析</b>: 虛擬內(nèi)存和物理內(nèi)存是怎么管理的

    鴻蒙內(nèi)核源碼分析內(nèi)核最重要結(jié)構(gòu)體

    為何鴻蒙內(nèi)核源碼分析系列開篇就說 LOS_DL_LIST ? 因為它在鴻蒙 LOS 內(nèi)核中無處
    發(fā)表于 11-24 17:54 ?35次下載
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>源碼</b><b class='flag-5'>分析</b> :<b class='flag-5'>內(nèi)核</b>最重要結(jié)構(gòu)體

    華為鴻蒙系統(tǒng)內(nèi)核源碼分析上冊

    鴻蒙內(nèi)核源碼注釋中文版【 Gitee倉】給 Harmoηy○S源碼逐行加上中文注解,詳細闡述設(shè)計細節(jié),助你快速精讀 Harmonyos內(nèi)核源碼
    發(fā)表于 04-09 14:40 ?17次下載