liteos 中斷機制(四)

来源:https://www.cnblogs.com/linhaostudy/archive/2019/05/23/10901887.html
-Advertisement-
Play Games

1. 概述 中斷是指出現需要時, CPU暫停執行當前程式,轉而執行新程式的過程。即在程式運行過程中,系統出現了一個必須由CPU立即處理的事務,此時, CPU暫時中止當前程式的執行轉而處理這個事務,這個過程就叫做中斷。 眾多周知, CPU的處理速度比外設的運行速度快很多,外設可以在沒有CPU介入的情況 ...


1. 概述

中斷是指出現需要時, CPU暫停執行當前程式,轉而執行新程式的過程。即在程式運行過程中,系統出現了一個必須由CPU立即處理的事務,此時, CPU暫時中止當前程式的執行轉而處理這個事務,這個過程就叫做中斷。

眾多周知, CPU的處理速度比外設的運行速度快很多,外設可以在沒有CPU介入的情況下完成一定的工作,但某些情況下需要CPU為其做一定的工作。

通過中斷機制,在外設不需要CPU介入時, CPU可以執行其它任務,而當外設需要CPU時通過產生中斷信號使CPU立即中斷當前任務來響應中斷請求。這樣可以使CPU避免把大量時間耗費在等待,查詢外設狀態的操作上,因此將大大提高系統實時性以及執行效率。

Huawei LiteOS的中斷支持:

  • 中斷初始化。
  • 中斷創建。
  • 開/關中斷。
  • 恢復中斷。
  • 中斷使能。
  • 中斷屏蔽。

Huawei LiteOS的中斷機制支持中斷共用。

1.1 中斷的介紹

與中斷相關的硬體可以劃分為三類:設備、中斷控制器、 CPU本身。
設備:發起中斷的源,當設備需要請求CPU時,產生一個中斷信號,該信號連接至中斷控制器。

中斷控制器:中斷控制器是CPU眾多外設中的一個,它一方面接收其它外設中斷引腳的輸入,另一方面,它會發出中斷信號給CPU。可以通過對中斷控制器編程實現對中斷源的優先順序、觸發方式、打開和關閉源等設置操作。常用的中斷控制器有VIC(Vector Interrupt Controller)和GIC(General Interrupt Controller),在ARM Cortex-A7中使用的中斷控制器是GIC。

CPU: CPU會響應中斷源的請求,中斷當前正在執行的任務,轉而執行中斷處理程式。

1.2 和中斷相關的名詞解釋

中斷號:每個中斷請求信號都會有特定的標誌,使得電腦能夠判斷是哪個設備提出的中斷請求,這個標誌就是中斷號。

中斷請求:“緊急事件”需向CPU提出申請(發一個電脈衝信號),要求中斷,及要求CPU暫停當前執行的任務,轉而處理該“緊急事件”,這一申請過程稱為中斷申
請。

中斷優先順序:為使系統能夠及時響應並處理所有中斷,系統根據中斷時間的重要性和緊迫程度,將中斷源分為若幹個級別,稱作中斷優先順序。 Huawei LiteOS中所有的中斷源優先順序相同,不支持中斷嵌套或搶占。

中斷處理程式:當外設產生中斷請求後, CPU暫停當前的任務,轉而響應中斷申請,即執行中斷處理程式。

中斷觸發:中斷源發出並送給CPU控制信號,將介面卡上的中斷觸發器置“1”,表明該中斷源產生了中斷,要求CPU去響應該中斷,CPU暫停當前任務,執行相應的中斷處理程式。

中斷觸發類型:外部中斷申請通過一個物理信號發送到GIC,可以是電平觸發或邊沿觸發。

中斷向量:中斷服務程式的入口地址。

中斷向量表:存儲中斷向量的存儲區,中斷向量與中斷號對應,中斷向量在中斷向量表中按照中斷號順序存儲。

中斷共用:當外設較少時,可以實現一個外設對應一個中斷號,但為了支持更多的硬體設備,可以讓多個設備共用一個中斷號,共用同一個中斷的中斷處理程式形成一個鏈表,當外部設備產生中斷申請時,系統會遍歷中斷號對應的中斷處理程式鏈表。

中斷底半部:中斷處理程式耗時應儘可能短,以滿足中斷的快速響應,為了平衡中斷處理程式的性能與工作量,將中斷處理程式分解為兩部分:頂半部和底半部。

頂半部完成儘可能少的比較緊急的任務,它往往只是簡單地讀取寄存器中的中斷狀態並清除中斷標誌位即進行“登記工作”,將耗時的底半部處理程式掛到系統的底半部執行隊列中去。

1.3 運作機制

Huawei LiteOS的中斷機制支持中斷共用:

中斷共用的實現依賴於鏈表,對應每一個中斷號創建一個鏈表,鏈表節點中包含註冊的中斷處理函數和函數入參。當對同一中斷號多次創建中斷時,將中斷處理函數和函數入參添加到中斷號對應的鏈表中,因此當硬體產生中斷時,通過中斷號查找到其對應的結構體鏈表,遍歷執行鏈表中的中斷處理函數。

Huawei LiteOS的中斷機制支持中斷底半部:

中斷底半部的實現基於workqueue,在中斷處理程式中將工作分為頂半部和底半部,底半部處理程式與work關聯,並掛載到合法workqueue上。系統空閑時執行workqueue中的work上的底半部程式。

2. 開髮指導

2.1 使用場景

當有中斷請求產生時, CPU暫停當前的任務,轉而去響應外設請求。根據需要,用戶通過中斷申請,註冊中斷處理程式,可以指定CPU響應中斷請求時所執行的具體操作。

2.2 功能

Huawei LiteOS 系統中的中斷模塊為用戶提供下麵幾種功能。

介面名 描述
LOS_HwiCreate 硬中斷創建,註冊硬中斷處理程式
LOS_IntUnLock 開中斷
LOS_IntRestore 恢復到關中斷之前的狀態
LOS_IntLock 關中斷
hal_interrupt_mask 中斷屏蔽(通過設置寄存器,禁止CPU響應該中斷)
hal_interrupt_unmask 中斷使能(通過設置寄存器,允許CPU響應該中斷)

2.3 HWI錯誤碼

對創建中斷存在失敗可能性的操作返回對應的錯誤碼,以便快速定位錯誤原因。

序 號 定義 實際數值 描述 參考解決方案
1 OS_ERRNO_HWI_NUM_INVALID 0x02000900 無效中斷號 檢查中斷號,給定有效中斷號
2 OS_ERRNO_HWI_PROC_FUNC_NULL 0x02000901 中斷程式指針為空 傳入非空中斷處理程式指針
3 OS_ERRNO_HWI_CB_UNAVAILABLE 0x02000902 無可用中斷資源 通過配置,增大可用中斷最大數量
4 OS_ERRNO_HWI_NO_MEMORY 0x02000903 記憶體不足 增大記憶體空間
5 OS_ERRNO_HWI_ALREADY_CREATED 0x02000904 中斷處理程式已經創建 檢查傳入的中斷號對應的中斷處理程式是否已經被創建
6 OS_ERRNO_HWI_PRIO_INVALID 0x02000905 中斷優先順序無效 傳入有效中斷優先順序[0,31]
7 OS_ERRNO_HWI_MODE_INVALID 0x02000906 中斷模式無效 傳入有效中斷模式[0,1]
8 OS_ERRNO_HWI_FASTMODE_ALREADY_CREATED 0x02000907 快速模式中斷已經創建 檢查傳入的中斷號對應的中斷處理程式是否已經被創建
9 OS_ERRNO_HWI_INTERR 0x02000908 介面在中斷中調用 中斷中禁止調用該介面

2.4 開發流程

  1. 修改配置項
    • 打開硬中斷裁剪開關: OS_INCLUDE_HWI定義為YES.
    • 配置硬中斷使用最大數: OS_HWI_MAX_USED_NUM.
  2. 調用中斷初始化Los_HwiInit介面。
  3. 調用中斷創建介面LOS_HwiCreate創建中斷
  4. 調用hal_interrupt_unmask介面使能指定中斷。
  5. 調用hal_interrupt_mask介面屏蔽指定中斷。

3. 編程實例

3.1 實例描述

本實例實現如下功能。

  1. 關中斷
  2. 中斷創建
  3. 中斷使能
  4. 中斷恢復
  5. 中斷屏蔽

3.2 編程示例

前提條件:

  • 在los_config.h中,將OS_INCLUDE_HWI定義為YES。
  • 在los_config.h中,設置最大硬中斷個數OS_HWI_MAX_USED_NUM。

代碼實現如下:

#include "los_hwi.h"
#include "los_typedef.h"
#define HWI_NUM_INT50 50
void uart_irqhandle(int irq,void *dev)
{
printf("\n int the func uart_irqhandle \n");
}
void hwi_test()
{
    int a = 1;
    UINTPTR uvIntSave;
    uvIntSave = LOS_IntLock();
    LOS_HwiCreate(HWI_NUM_INT50,         0,0,uart_irqhandle,NULL);//創建中斷
    hal_interrupt_unmask(HWI_NUM_INT50);
    LOS_IntRestore(uvIntSave);
    hal_interrupt_mask(HWI_NUM_INT50);
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 實現DynamicProxy前,先介紹幾個必要的輔助類: 一、切麵上下文類AspectContext 該類是作為切麵特性類的OnEntry和OnEixt方法的參數用的,該類包含了被代理對象Sender、當前切入的方法名稱(Name)、調用方法的參數列表(Args)以及返回值(Result) 二、切麵 ...
  • 最近需要有一個完全自主的基於C#語言的Aop框架,查了一下資料實現方式主要分為:靜態織入和動態代理,靜態織入以Postshop為代表,而動態代理又分為: 1、普通反射 2、Emit反射 3、微軟提供的.Net Remoting和RealProxy (微軟官方例子https://msdn.micros ...
  • ​一、前言 從進行到軟體開發這個行業現在已經有幾年了,在整理出這個套開發框架之前自己做了不少重覆造輪子的事。每次有新的項目總是要耗費不少時間在UI、許可權和系統通用模塊上面,自己累得要死,老闆還罵沒效率。為了能提高開發效率,同時也多拿拿獎金、多存點私房錢,我就著手做了一套以許可權管理為主的快速開發框架。 ...
  • C# -- LinkedList的使用 class Person { public Person() { } public Person(string name, int age, string sex) { this.Name = name; this.Age = age; this.Sex = ...
  • string.Format("{0:t}", DateTime.Parse("2019-1-1 08:30:00")); 轉換為 8:30 這種格式 string.Format("{0:hh:mm}", DateTime.Parse("2019-1-1 08:30:00")); 可以轉換為 08:3 ...
  • 在SQL語句查詢過程中,Sqlserver支持使用LEFT()、RIGHT()、SUBSTRING()等幾個函數對字元串進行截取操作,SubString函數相對於其他兩個函數來說更靈活,使用場景更多,可以指定截取開始的位置以及截取的長度,SubString函數的格式為SubString(expres ...
  • 500.30 ANCM In-Process Handler Load Failure ...
  • 一、協議的定義 要對某種協議進行編解碼操作,就必須知道協議的基本定義,首先我們來看一下 CJ/T188 的數據幀定義(協議定義),瞭解請求數據與響應數據的基本結構。 1.1 CJ/T188 水錶通訊協議 請求幀: | 位元組 | 值 | 描述 | | | | | | 0 | 0x68 | 數據幀開始標 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...