嵌入式學習的第四十八天-中斷+OCP原則

一、GIC通用中斷控制器

1.GIC通用中斷控制器

? ? ? ? GIC 是 ARM 公司給 Cortex-A/R 內核提供的一個中斷控制器,GIC接收眾多外部中斷,然后對其進行處理,最終通過VFIQ、VIRQ、FIQ 和 IRQ給內核;這四個 信號的含義如下: VFIQ:虛擬快速 FIQ。 VIRQ:虛擬 IRQ。 FIQ:快速中斷 IRQ。 IRQ:中斷 IRQ。

2.GIC中斷分類

SPI(Shared Peripheral Interrupt),共享中斷, (注意!不是 SPI 總線那個中斷),這類中斷泛指所有的 外設中斷;
PPI(Private Peripheral Interrupt),私有中斷,我們說了 GIC 是支持多核的,每個核肯定有自己獨有 的中斷。這些獨有的中斷肯定是要指定的核心處理,因此這些中斷就叫做私有中斷;
SGI(Software-generated Interrupt),軟件中斷,由軟件觸發引起的中斷,通過向寄存器GICD_SGIR 寫入數據來觸發,系統會使用 SGI 中斷來完成多核之間的通信。

?從圖中可以明顯看出,Distributor(分發器)可以分發所有共享中斷給8個內核,但是私有中斷和 軟件中斷只出現自己獨自的內核中。

中斷ID:中斷源有很多,為了區分這些不同的中斷源肯定要給他們分配一個唯一 ID,這些 ID 就 是中斷 ID。每一個 CPU 最多支持 1020 個中斷 ID,中斷 ID 號為 ID0~ID1019。

ID0~ID15:這 16 個 ID 分配給 SGI; ID16~ID31:這 16 個 ID 分配給 PPI;ID32~ID1019:
這 988 個 ID 分配給 SPI。

3.GIC的組成

? ?由分發器 (1個)、CPU接口(幾核就幾個)

(1)分發器

功能:

  • 全局中斷使能控制;
  • 控制每一個中斷的使能或者關閉;
  • 設置每個中斷的優先級;
  • 設置每個中斷的目標處理器列表;
  • 設置每個外部中斷的觸發模式:電平觸發或邊沿觸發;
  • 設置每個中 斷屬于組 0 還是組 1;
(2)CPU接口

功能:

  • 使能或者關閉發送到 CPU Core 的中斷請求信號;
  • 應答中斷;
  • 通知中斷處理完成;
  • 設置優先級掩碼,通過掩碼來設 置哪些中斷不需要上報給 CPU Core;
  • 定義搶占策略;
  • 當多個中斷到來的時候,選擇優先級最高的 中斷通知給 CPU Core;

4.協處理器

總共由16個,cp0~cp15;其中最常使用的cp15

(1)作用

  • 獲取GIC的基地址(CBAR)
  • MMU的配置(使能/禁用;SCTLR)
  • cache的配置
  • 監控系統性能
  • 配置中斷控制器(優先級、分組、使能/禁用,VBAR:設置中斷向量表基地址)
  • 訪問寄存器(mrc讀、mcr寫)
  • 獲取或結束中斷(IAR、EOIR)

(2)讀寫訪問指令

MRC: 將 CP15 協處理器中的寄存器 數據讀到 ARM 寄存器中;
MCR: 將 ARM 寄存器的數據寫入到 CP15 協處理器寄存器中。
以MRC指令
為例,從CP15的某個寄存器讀取數據到ARM寄存器的指令格式為:
MRC{cond} p15, <opc1>, <Rt>, <CRn>, <CRm>, <opc2>
cond:指令執行的條件碼,就是之前我們使用過的指令條件,eq,lt什么的。如果忽略的話就表示無條件執行;
p15:表示要讀取的是CP15當中的某個寄存器;
opc1:協處理器要執行的操作碼1,其實就是一個數,要做什么將來查表;
Rt:ARM 目標寄存器,讀出來的數據放到哪個ARM寄存器里。CP15
CRn:CP15 協處理器的目標寄存器,就是你要讀取CP15的哪個寄存器(C0~C15);
CRm:協處理器中附加的目標寄存器或者源操作數寄存器,如果不需要附加信息就將CRm 設置 為 C0,否則結果不可預測。
opc2:可選的協處理器特定操作碼2,使用時查表。
MCR與MRC類似的,只是Rt的作用變成了要寫入CP15某個寄存器的值。

?mrc p15 0, r0, c0, c0, 0

?????????簡單總結一下,通過 MIDR 寄存器可以獲取到處理器內核信息;通過 SCTLR 寄存器可以使能或禁止 MMU、I/D Cache 等;通過 VBAR 寄存器可以設置中斷向量偏移;通過CBAR 寄存器可以獲取 GIC 基地址。

二、外部中斷

1.設置GIC

(1)讀取SCTLR,將V位置0(軟件可以通過 VBAR來重新映射這個基地址)I位置1(I cache使能)

(2)通過GIC查詢當前中斷ID;先獲取GIC基地址(CBAR);對其進行偏移(IAR),獲得中斷ID,然后進入中斷處理函數

2.中斷服務函數 ? ? ??

(1)中斷初始化;重新定位異常向量表的位置到0x87800000;并且調用GIC_Init函數

(2)對于GPIO1->ICR2(觸發方式)、GPIO1->IMR(該中斷使能)在中斷源初始化進行配置


(3)中斷服務函數
??
注意:先要在相對應的中斷源的初始化函數里面注冊在中斷向量數組中;

例子:注冊完中斷之后,中斷發生就會調用中斷服務函數

內斂函數:INLINE,定義被放在頭文件中

三、OCP原則(開閉原則)??

對代碼擴展是開放的,對代碼的修改是關閉的。

四、啟動代碼

.global _start
//異常向量表
//位于內存起始位置,當特定異常發生時,處理器會自動跳轉到對應的地址上
_start:ldr pc, = _reset_handlerldr pc, = _undefined_handlerldr pc, = _svc_handlerldr pc, = _prefetch_handlerldr pc, = _data_abort_handlerldr pc, = _not_user_handlerldr pc, = _irq_handlerldr pc, = _fiq_handler
//異常處理程序 大多是簡單的無限循環
_undefined_handler:ldr pc, = _undefined_handler
_svc_handler:ldr pc, = _svc_handler
_prefetch_handler:ldr pc, = _prefetch_handler
_data_abort_handler:ldr pc, = _data_abort_handler
_not_user_handler:ldr pc, = _not_user_handler
_fiq_handler:ldr pc, = _fiq_handler//IRQ中斷處理程序_irq_handler:subs lr,lr,#4           //調整返回地址stmfd sp!,{r0-r12,lr}   //保存寄存器//讀取中斷控制器狀態mrc p15,4,r1,c15,c0,0   //獲取外設基地址add r1,r1,#0x2000       //偏移到中斷控制器ldr r0,[r1,#0x0C]       //讀取中斷狀態stmfd sp!,{r0,r1}       //保存臨時寄存器//切換到系統模式處理中斷cps #0x1F               //切換到系統模式stmfd sp!,{lr}          //保存系統模式LRbl system_interrupt_handler //調用C中斷處理函數ldmfd sp!,{lr}          //恢復LR模式cps #0x12               //切換回IRQ模式//清除中斷ldmfd sp!,{r0,r1}       //恢復臨時寄存器str r0,[r1,#0x10]       //寫EQIR寄存器ldmfd sp!,{r0-r12,pc}^  //恢復寄存器并返回//啟動代碼執行程序
_reset_handler:cpsid i                 //禁用中斷//配置CP15系統控制寄存器mrc p15,0,r0,c1,c0,0    //讀取控制寄存器bic r0,r0,#(1<<13)      //清除V位(異常向量表位置)orr r0,r0,#(1<<12)      //設置I位(啟用指令緩存)mcr p15,0,r0,c1,c0,0    //寫回控制寄存器// 設置IRQ模式棧指針cps #0x12               // 切換到IRQ模式ldr sp, =0x82000000     // 設置IRQ棧cps #0x1F               // 切換到系統模式ldr sp, =0x84000000     // 設置系統棧cpsie i                 // 啟用中斷bl _init_bss            // 初始化BSS段b main                  // 跳轉到主程序b finished              // 永遠不會執行(冗余)
//初始化BSS段(清零)
_init_bss:ldr r0,= __bss_start    // BSS段起始地址ldr r1,= __bss_end      // BSS段結束地址
loop:mov r2,#0               // 清零值str r2,[r0]             // 存儲0到當前地址add r0,r0,#4            // 移動到下一個字cmp r0,r1               // 比較是否到達結束blt  loop               // 如果未結束則循環bx lrfinished:b finished    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95447.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95447.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95447.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一周學會Matplotlib3 Python 數據可視化-繪制條形圖(Bar)

鋒哥原創的Matplotlib3 Python數據可視化視頻教程&#xff1a; 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib&#xff0c;學習Matplotlib圖形參數基本設置&…

阿里研發效能提升【60篇】

阿里研發效能提升【60篇】 1、建立研發效能提升的系統框架 01、《從DevOps到BizDevOps&#xff0c;研發效能提升的系統方法》 視頻版&#xff1a;2021云棲大會云效BizDevOps論壇 文字版&#xff1a;深度 | 從DevOps到BizDevOps, 研發效能提升的系統方法-阿里云開發者社區 …

面試實戰 問題二十六 JDK 1.8 核心新特性詳解

JDK 1.8 核心新特性詳解 1. Lambda表達式 最核心的特性&#xff0c;簡化函數式編程&#xff0c;語法&#xff1a;(參數) -> 表達式 // 傳統方式 Runnable r1 new Runnable() {Overridepublic void run() {System.out.println("傳統方式");} };// Lambda方式 Runn…

STM32H743開發周記問題匯總(串口通訊集中)

溢出錯誤出現的串口接收過程中&#xff0c;中斷接收在溢出后無法進入&#xff0c;需要重點考慮溢出問題&#xff0c;以下是溢出恢復代碼波特率115200 優先級0-1 高于定時器 初步診斷是數據流導致的接收溢出問題/*** brief 檢查并清除UART溢出錯誤&#xff08;帶狀態…

Linux中FTP配置與vsftpd服務部署指南

Linux中FTP配置與vsftpd服務部署指南 一、FTP 核心概念 1、基本定義 文件傳輸協議&#xff08;FTP&#xff09;&#xff0c;基于 C/S模式 工作。控制端口&#xff1a;21&#xff08;身份驗證與指令傳輸&#xff09; 數據端口&#xff1a;20&#xff08;主動模式數據傳輸&#x…

Web UI自動化測試的早期介入?

在傳統研發流程中&#xff0c;Web UI自動化測試常被視為“后期活動”——必須等待前端界面完全穩定才能啟動。這種滯后導致自動化測試難以覆蓋早期迭代&#xff0c;形成“開發等測試、測試等穩定”的惡性循環。本文將系統破解這一困局&#xff0c;提供一套從需求階段介入、持續…

基于學科競賽的高職計算機網絡教學解決方案

一、引言《關于深化產教融合的若干意見》明確提出 “推行面向企業真實生產環境的任務培養模式”&#xff0c;為我國職業教育發展指明了產教深度融合的方向。在數字經濟時代&#xff0c;計算機網絡技術正以前所未有的速度迭代更新&#xff0c;產業界對具備前沿技術應用能力和實踐…

猿大師中間件:Chrome網頁內嵌PhotoShop微信桌面應用程序

隨著桌面應用程序集成到網頁的需求不斷增長&#xff0c;尤其在Chrome瀏覽器缺乏原生調用EXE功能的情況下&#xff0c;傳統網頁內嵌解決方案面臨失效挑戰&#xff0c;猿大師中間件因此發展成為當前主流方案。 2025年猿大師發布了EXE、OCX、COM三個通用組件&#xff0c;自此猿大…

EF (Entity Framework) vs LINQ to SQL vs SqlSugar 全方位對比分析

文章目錄1. 概述與背景介紹1.1 Entity Framework (EF)1.2 LINQ to SQL1.3 SqlSugar2. 架構設計對比2.1 EF架構設計2.2 LINQ to SQL架構2.3 SqlSugar架構3. 性能對比3.1 基準測試數據3.2 性能分析3.3 內存使用4. 功能特性對比4.1 數據庫支持4.2 主要功能對比4.3 高級特性5. 開發…

MySQL 多表聯查與內外連接詳解

多表聯查是關系型數據庫的核心操作&#xff0c;用于從多個表中關聯數據。MySQL 支持多種連接方式&#xff0c;最常用的是內連接和外連接&#xff08;左/右/全外連接&#xff09;。一、多表聯查基礎語法 SELECT 列列表 FROM 表1 [連接類型] JOIN 表2 ON 連接條件 [連接類型] JOI…

《網絡爬蟲》

網絡爬蟲&#xff0c;是一種自動化程序&#xff0c;用于抓取互聯網上的數據。它們通過模擬瀏覽器行為&#xff0c;抓取網頁內容并提取有用信息。爬蟲廣泛應用于數據采集、搜索引擎索引、競爭對手分析等領域。爬蟲的工作流程&#xff1a;請求目標網頁&#xff1a;爬蟲首先發送 H…

openpnp - 頂部相機環形燈光DIY

文章目錄openpnp - 頂部相機環形燈光DIY概述筆記ENDopenpnp - 頂部相機環形燈光DIY 概述 底部相機燈光用環形燈(用鈑金折彎成一個10mm高的矩形盒子)是可以的。因為吸嘴落到Z方向和PCB平齊時&#xff0c;用COB燈帶裝在一個矩形盒子中正好能照射到吸嘴尖端高度附近。 頂部相機…

[AI React Web] E2B沙箱 | WebGPU | 組件樹 | 智能重構 | 架構異味檢測

第三章&#xff1a;E2B沙箱交互 在前兩章中&#xff0c;我們掌握了對話狀態管理和AI代碼生成管道的運作原理。 但生成代碼如何真正運行&#xff1f;這正是E2B沙箱交互的核心價值。 架構定位 E2B沙箱是專為open-lovable打造的虛擬計算環境&#xff0c;具備以下核心能力&…

Redis寶典

Redis是什么 Redis是開源的&#xff0c;使用C語言編寫的&#xff0c;支持網絡交互&#xff0c;可基于內存也可持久化到本地磁盤的Key-Value數據庫。 優點&#xff1a; 因為Redis是基于內存的&#xff0c;所以數據的讀取速度很快Redis支持多種數據結構&#xff0c;包括字符串Str…

MyBatis-Plus 分頁失效問題解析:@Param 注解的影響與解決方案

引言在 Spring Boot MyBatis-Plus 的開發中&#xff0c;分頁查詢是常見的需求。然而&#xff0c;有時我們會遇到分頁失效的問題&#xff0c;尤其是在方法參數上添加 Param 注解后。本文將通過一個實際案例&#xff0c;分析 Param 注解如何影響 MyBatis-Plus 的分頁機制&#x…

機器學習——模型的簡單優化

在訓練模型時我們可能會遇到模型不滿足于預期需要進行改善的環節&#xff0c;這些情況通常包括以下幾種常見問題和對應的解決方案&#xff1a;數據質量不足數據量過少&#xff1a;當訓練樣本不足時&#xff0c;模型難以學習到有效的特征表示。建議通過數據增強&#xff08;如圖…

17.MariaDB 數據庫管理

17.MariaDB 數據庫管理 數據庫介紹 數據庫&#xff08;Database&#xff09;簡單來說&#xff0c;就是按照一定規則存數據的 “倉庫”。它能高效存大量數據&#xff0c;還能方便地查、增、改、刪數據&#xff0c;是各種信息系統的核心。 核心特點: 結構化存儲&#xff1a;數…

AI搶飯碗,軟件測試該何去何從?

AI 浪潮下&#xff0c;軟件測試路在何方 當某大廠宣布 “AI 測試機器人上崗首日就覆蓋 80% 的功能測試” 時&#xff0c;測試圈炸開了鍋 —— 有人連夜更新簡歷&#xff0c;有人在技術論壇發問&#xff1a;“十年測試經驗&#xff0c;難道真的不如一行 AI 代碼&#xff1f;”AI…

09 ABP Framework 中的 MVC 和 Razor Pages

ABP Framework 中的 MVC 和 Razor Pages 該頁面詳細介紹了 ABP Framework 與 ASP.NET Core MVC 和 Razor Pages 的集成&#xff0c;涵蓋框架組件、項目模板、主題系統和模塊集成模式等內容&#xff0c;提供了 ABP 應用程序中傳統的服務器端 Web UI 選項。 框架集成組件 ABP 提供…

docker 容器內編譯onnxruntime

docker run -itd -p 49142:49142 --gpus "device0" --name cpp_env_20250812 --shm-size"5g" -v /本地路徑/onnxruntime:/onnxruntime nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04進入容器內安裝必要的依賴git clone --branch v1.13.1 --recursive https…