【OS】AUTOSAR架構下的Interrupt詳解(上篇)

目錄

前言

正文

1.中斷概念分析

1.1?中斷處理API

1.2?中斷級別

1.3?中斷向量表

1.4?二類中斷的嵌套

1.4.1概述

1.4.2激活

1.5一類中斷

1.5.1一類中斷的實現

1.5.2一類中斷的嵌套

1.5.3在StartOS之前的1類ISR

1.5.4使用1類中斷時的注意事項

1.6中斷源的初始化

1.7未處理的中斷

1.8未處理的系統調用

1.9零類中斷

1.9.1一類中斷的實現

1.9.2一類中斷的嵌套

1.9.3在StartOS之前的0類ISR

1.9.4零類isr被鎖定的位置

1.9.5使用0類中斷時的注意事項

2.中斷配置


前言

通過《【TC3xx芯片】TC3xx中斷路由IR模塊詳解》一文我們學習了TC3xx芯片中斷的硬件實現,通過《【OS】AUTOSAR架構下的中斷和異常向量表》一文中我們知道中斷向量表的起始地址標識符在Os生成的鏈接文件中定義用戶需要在啟動代碼中初始化BIV寄存器,知道這兩點我們就能集成使用Os中斷功能,但是關于更多的Os中斷的細節知識還需要繼續學習,比如,你能回答以下的幾個問題嗎?

問題1:以下三組OS ISR相關的API有何區別,分別適合在什么場景下使用?

DisableAllInterrupts()

EnableAllInterrupts()

SuspendAllInterrupts()

ResumeAllInterrupts()

SuspendOSInterrupts()

ResumeOSInterrupts()

問題2:以下兩個OS ISR相關的API有何區別,分別適合在什么場景下使用?

Os_InitialEnableInterruptSources()

Os_EnableInterruptSource()

問題3:二類中斷完全由OS實現,那么該如何使用一類中斷了?

問題4:TC3xx芯片是如何處理中斷的?

問題5:詳細闡述一個中斷的配置及其處理過程,以CAN中斷為例。

問題6:OS是如何處理中斷優先級的?

縮略詞

簡寫

全稱

BTV

Base?Trap?Vector Table Pointer

BIV

Base?Interrupt?Vector Table Pointer

ISR

Interrupt?Service?Router

SRC

Service?Request?Control Register

IR

Interrupt?Router

ICU

Interrupt?Control?Unit

ICR

ICU?Interrupt Control

AUTOSAR?BSW Tool:Vector

AUTOSAR MCAL Tool:EB

Hardware Platform: Infineon Tricore?TC387

Build Tool:?Tasking

Debug Tool: UDE


注:本文章引用了一些第三方工具和文檔,若有侵權,請聯系作者刪除!

正文

1.中斷概念分析

1.1?中斷處理API

AUTOSAR標準指定了幾個以下API來禁用/啟用中斷。

DisableAllInterrupts()

EnableAllInterrupts()

該功能將禁用所有類別1和類別2的中斷。

SuspendAllInterrupts()

ResumeAllInterrupts()

SuspendOSInterrupts()

ResumeOSInterrupts()

該功能僅禁用類別2的中斷

1.2?中斷級別

l2類中斷的優先級必須低于1類中斷的優先級。

l1類中斷的優先級必須低于時間保護ISR(SC2 / SC4系統)。

l時間保護ISR的優先級必須低于0類ISR(第0類ISRs詳見第1.9小結)。

l用戶無法設置時間保護鎖(TP Lock)級別。每當OS內部在處理時間保護相關的任務時會使用到TP Lock,這個時候中斷時都是被禁用的(Disabled)。

l0類?ISRs在內部禁用很短的操作系統,例如在執行堆棧開關時(0類?ISRs被鎖定的位置在1.9小結中描述)。

1.3?中斷向量表

MICROSAR OS會根據用戶的配置、使用的MCU類型、使用的編譯器類型生成中斷向量表。

在一個多核系統中,可以生成多個向量表。

MICROSAR OS會為每一個可能的中斷源生成一個中斷向量。

1.4?二類中斷的嵌套

1.4.1概述

為了保持中斷延遲盡可能低,OS遵守以下中斷優先級規則:

l更高優先級的二類中斷可以中斷正在執行的低優先級的二類中斷。

l一類中斷的優先級始終高于二類中斷的優先級(一類中斷始終可以打斷二類中斷)。

1.4.2激活

設置“OsIsrEnableNesting”參數為TRUE后,2類ISR本身可以被更高優先級的ISR中斷。

1.5一類中斷

1.5.1一類中斷的實現

MICROSAR OS提供了一個宏,用于實現一類ISR。類似AUTOSAR標準定義的2類ISR的宏。MICROSAR OS抽象了所需的編譯器關鍵字。

Implement a category 1 ISROS_ISR1(<MyCategory1ISR>){}

1.5.2一類中斷的嵌套

由于1類ISR是直接從中斷向量表調用的,沒有任何操作系統的支持,因此不支持第1類ISR的自動嵌套。

忽略1類ISR的“OsIsrEnableNesting”配置屬性。

然而,可以在1類?ISR期間啟用中斷以允許中斷嵌套,但OS API函數不能用于此目的。應用程序必須使用編譯器固有函數或內聯匯編語句。

Example

OS_ISR1(<MyCategory1ISR>){    __asm(EI); /* enable nesting of this ISR */    __asm(DI); /* disable nesting before leaving the function */}

1.5.3在StartOS之前的1類ISR

在操作系統啟動之前,可能需要激活1類ISR。

以下動作序列需要被執行:

1.調用Os_InitMemory()

2.調用Call Os_Init(),?(在該函數中,基本的中斷控制器設置被初始化,例如中斷源的優先級))。

3.通過直接操作中斷控制器中的控制寄存器,來啟用1類ISR的中斷源。

4.通過直接操作全局中斷標志和/或當前中斷優先級來啟用中斷,以允許1類ISR.

1.5.4使用1類中斷時的注意事項

1.在不支持中斷請求時棧切換(中斷棧和用戶棧切換)的芯片平臺上,如果發生了1類中斷則不會發生棧切換。因此,1類中斷的堆棧消耗將應該被添加到所有可以被1類ISR消耗的堆棧中。

2.雖然中斷優先級是由MICROSAR OS初始化的,但是沒有API來啟用1類ISR,?必須直接訪問中斷控制寄存器來Enable 1類中斷。

3.AUTOSAR OS標準不允許在1類ISR中使用OS API(唯一的例外是中斷處理API)。如果在1類中斷處理函數中調用了不允許使用的OS API,MICROSAR OS就無法檢測到這一點,并且調用的API可能不能按預期工作。

4.一類中斷始終在Trusted權限或者Supervisor等級下被執行。

5.宏“OS_ISR1”抽象了用于實現中斷服務程序的適當編譯器關鍵字。因此,編譯器生成保護并恢復通用寄存器子集的代碼。在某些用例中,例如使用FPU或嵌套中斷,它可能需要應用程序保存和恢復更多的寄存器。

1.6中斷源的初始化

通過操作系統配置,MICROSAR操作系統知道中斷源的分配和ISR的優先級。在多核系統中,所有isr的核心分配也是已知的。基于這些配置信息,MICROSAR OS生成用于初始化中斷控制器的數據結構。它初始化中斷優先級及其核心分配。

使能中斷源:

操作系統只對操作系統生成的定時器ISR啟用中斷源。

只有當應用程序啟用了相應的中斷源時,才能為其他用戶ISR提供服務。

這應該通過使用中斷源API來完成(詳見Os_EnableInterruptSource()函數)。

1.7未處理的中斷

沒有分配給用戶定義ISR的中斷源被分配給一個默認的操作系統中斷處理程序,該處理程序收集這些中斷源。

因此,來自未分配中斷源的中斷請求由操作系統處理。在OS Hooks(例如ProtectionHook())中,應用程序可以通過OS API獲得未處理中斷請求的源編號。

如果一個未處理的中斷請求發生在操作系統代碼中,MICROSAR OS調用PanicHook(),因為一個不一致的內部狀態被識別出來,操作系統不知道如何正確地繼續執行。

如果一個未處理的中斷請求發生在關鍵用戶段,即StartupHook,?ErrorHook, PreTaskHook, PostTaskHook,?Alarm回調,IOC接收器回調,Timing Hooks,?ProtectionHook和ShutdownHook,?MICROSAR OS調用PanicHook(),因為一個不一致的內部狀態被識別,操作系統不知道如何正確地繼續執行。

在所有其他未處理中斷請求的情況下,MICROSAR OS調用帶有參數E_OS_SYS_PROTECTION_IRQ的ProtectionHook().

1.8未處理的系統調用

未分配給操作系統或用戶處理程序的系統調用源被分配給收集這些異常的默認操作系統系統調用處理程序。

因此,來自未分配的系統調用源的系統調用請求由操作系統處理。如果一個未處理的系統調用請求發生在操作系統代碼中,MICROSAR操作系統調用PanicHook(),因為一個不一致的內部狀態被識別,操作系統不知道如何正確地繼續執行。

如果一個未處理的系統調用請求發生在關鍵用戶部分,即StartupHook,?ErrorHook, PreTaskHook, PostTaskHook,?Alarm回調,IOC接收器回調,Timing Hooks,?ProtectionHook和ShutdownHook,?MICROSAR OS調用PanicHook(),因為一個不一致的內部狀態被識別,操作系統不知道如何正確地繼續執行。

在所有未處理的系統調用請求的其他情況下MICROSAR OS調用ProtectionHook()參數E_OS_SYS_PROTECTION_SYSCALL.

1.9零類中斷

MICROSAR OS實現了0類ISRs,以具有最小的中斷延遲時間,特別是在SC2或SC4系統中。這是對AUTOSAR操作系統標準的一個擴展。

1.9.1一類中斷的實現

MICROSAR OS提供了一個宏,用于實現一類ISR。類似AUTOSAR標準定義的2類ISR的宏。MICROSAR OS抽象了所需的編譯器關鍵字。

Implement a category?0?ISR

OS_ISR0(<MyCategory0ISR>){}

1.9.2一類中斷的嵌套

由于0類ISR是直接從中斷向量表調用的,沒有任何操作系統的支持,因此不支持第0類ISR的自動嵌套。

忽略0類ISR的“OsIsrEnableNesting”配置屬性。

然而,可以在0類?ISR期間啟用中斷以允許中斷嵌套,但OS API函數不能用于此目的。應用程序必須使用編譯器固有函數或內聯匯編語句。

Example

OS_ISR0(<MyCategory0ISR>){    __asm(EI); /* enable nesting of this ISR */    __asm(DI); /* disable nesting before leaving the function */}

1.9.3在StartOS之前的0類ISR

在操作系統啟動之前,可能需要激活0類ISR。

以下動作序列需要被執行:

1.調用Os_InitMemory()

2.調用Call Os_Init(),?(在該函數中,基本的中斷控制器設置被初始化,例如中斷源的優先級))。

3.通過直接操作中斷控制器中的控制寄存器,來啟用0類ISR的中斷源。

4.通過直接操作全局中斷標志和/或當前中斷優先級來啟用中斷,以允許0類ISR.

1.9.4零類isr被鎖定的位置

0類中斷只能在很短的時間內在操作系統內部禁用。

以下列表中的操作提到了這些鎖的位置(會禁用0類中斷):

l導致上下文切換的api內部,例如TerminateTask().

l由ProtectionHook處理的異常導致部分終止。

l中斷,異常和陷阱進入和返回。

lOs_Init()和StartOS()中的OS初始化。

1.9.5使用0類中斷時的注意事項

1.在不支持中斷請求時棧切換(中斷棧和用戶棧切換)的芯片平臺上,如果發生了0類中斷則不會發生棧切換。因此,0類中斷的堆棧消耗將應該被添加到所有可以被0類ISR消耗的堆棧中。

2.零類ISR正在消耗中斷任務或2類ISR的時間保護預算(執行預算和鎖定時間)。

3.雖然中斷優先級是由MICROSAR OS初始化的,但是沒有API來啟用0類ISR,?必須直接訪問中斷控制寄存器來Enable 0類中斷。

4.如果發生時間保護中斷,執行(時間保護violation handling/protection hook)延遲到0類ISR運行期間,則其0類ISR已經完成。

5.AUTOSAR OS標準不允許在0類ISR中使用OS API(唯一的例外是中斷處理API)。如果在0類中斷處理函數中調用了不允許使用的OS API,MICROSAR OS就無法檢測到這一點,并且調用的API可能不能按預期工作。

6.一類中斷始終在Trusted權限或者Supervisor等級下被執行。

7.零類ISR可能永遠不會降低CPU或中斷的中斷優先級。

8.在操作系統關閉的情況下,甚至在操作系統進入Panic Hook的情況下,仍然可能發生0類isr。

9.請注意,0類ISR能中斷2類ISR,即使2類ISR被配置為不可嵌套的。

10.如果0類ISR的owner application因任何原因被終止,分配的0類ISR也不會被禁用。

11.宏“OS_ISR0”抽象了用于實現中斷服務程序的適當編譯器關鍵字。因此,編譯器生成保護并恢復通用寄存器子集的代碼。在某些用例中,例如使用FPU或嵌套中斷,它可能需要應用程序保存和恢復更多的寄存器。

2.中斷配置

Short Name?: ISR的名字,如果該ISR所屬的模塊是Vector SIP包中的模塊,則ISR的名字和類別是固定的(不可修改的,比如CanIsr_xxx)。

Isr Category?: ISR的類別(0,1,2三種類別的中斷),2類中斷由OS接管,用戶只需要調用OS接口Enable二類中斷。0類和1類中斷需要用戶實現中斷處理函數,且需要用戶在StartOS之前啟用中斷。0類中斷的時間延遲最小。

Isr Enable Nesting:?中斷是否可以被嵌套,僅適用于2類中斷。如果2類中斷配置為TRUE,則該2類中斷可以被更高優先級的中斷打斷。

Isr Initial Enable Interrupt Source?:?配置中斷是否會被Os_InitalEnableInterruptSources()函數Enable.

Isr Interrupt Mapping?:?如果相關模塊的數據搬運交給DMA處理,這需要配置這個參數。

Isr Interrupt Priority?:?配置中斷優先級,這個地方的中斷優先級是個相對值,OS在生成代碼的時候會根據這些相對值生成優先級絕對值排序。

Isr Interrupt Source:?配置中斷號(中斷地址)。

每一個中斷請求都和一個SRN一一對應,比如:

對于CAN00,也就是CAN0INT0,對應SRC為SRC_CAN0INT0,對應的SRC地址為:

0x5B0 +0*0x40 +?0*4 = 0x5B0 = 1456

Isr Interrupt Type?:?配置ISR是外部中斷(External)還是異常(Exception)。注意:中斷和異常(.e.g. NMI)其實是兩個概念,但是Exception的產生和處理過程和ISR基本一樣,所以Davnici中將Exception放在了ISR中配置。

Isr Memory Protection Identifier?:?配置ISR所屬的內存保護集(MPU Set),如果沒有配置,則該ISR和ISR所屬的Application的MPU Set配置一樣。至于什么是MPU Set清參考《【TC3xx芯片】TC3xx芯片MPU介紹》一文。

Isr Special Function Name?:?中斷處理函數的名字默認由Short Name參數生成,但是用戶也可以通過Isr Special Function Name特別指定。

Isr Stack Size?:?指定中斷棧大小。Microsar OS的Task和ISR都有獨立的棧,

Isr Stack Fpu?:?指定ISR是否使用FPU。

由于TriCore Aurix平臺沒有需要在上下文切換中保存的專用FPU寄存器,因此不需要由于使用浮點數而擴展上下文。

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

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

相關文章

一條sql 在MySQL中是如何執行的

在 MySQL 中&#xff0c;SQL 查詢的執行涉及多個內存區域和處理步驟&#xff0c;以確保查詢能夠高效地執行和返回結果。以下是 SQL 查詢在 MySQL 中執行時通常會經過的內存路徑&#xff1a; 1. 客戶端內存 - SQL 文本發送 &#xff1a;SQL 查詢首先從客戶端發送到 MySQL 服務…

llama.cpp GGUF 模型格式

llama.cpp GGUF 模型格式 1. Specification1.1. GGUF Naming Convention (命名規則)1.1.1. Validating Above Naming Convention 1.2. File Structure 2. Standardized key-value pairs2.1. General2.1.1. Required2.1.2. General metadata2.1.3. Source metadata 2.2. LLM2.2.…

Day30-【AI思考】-錯題分類進階體系——12維錯誤定位模型

文章目錄 錯題分類進階體系——12維錯誤定位模型**一、認知層錯誤&#xff08;根源性缺陷&#xff09;****二、操作層錯誤&#xff08;執行過程偏差&#xff09;****三、心理層錯誤&#xff08;元認知障礙&#xff09;****四、進階錯誤&#xff08;專業級陷阱&#xff09;** 錯…

Java/Kotlin雙語革命性ORM框架Jimmer(一)——介紹與簡單使用

概覽 Jimmer是一個Java/Kotlin雙語框架 包含一個革命性的ORM 以此ORM為基礎打造了一套綜合性方案解決方案&#xff0c;包括 DTO語言 更全面更強大的緩存機制&#xff0c;以及高度自動化的緩存一致性 更強大客戶端文檔和代碼生成能力&#xff0c;包括Jimmer獨創的遠程異常 …

openAI官方prompt技巧(一)

1. 使用最新的模型 2. 將指令放在提示詞的開頭&#xff0c;并使用 ### 或 """ 來分隔指令和上下文&#xff0c;例如 錯誤示范? 將下面的文本總結為一個要點列表&#xff0c;列出最重要的內容。 Summarize the text below as a bullet point list of the most…

通過制作docker鏡像的方式在阿里云部署前端后臺服務

前端Dockerfile文件的內容&#xff1a; FROM nginx:版本&#xff0c;如果不指定&#xff0c;默認是latest COPY dist/ /usr/share/nginx/html/dist COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 端口 前端sh腳本文件內容&#xff1a; appName項目名 tar -xvf dist.tar …

Github 2025-02-04 Python開源項目日報 Top10

根據Github Trendings的統計,今日(2025-02-04統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Python項目10TypeScript項目1Python中的算法實現集合 創建周期:2831 天開發語言:Python協議類型:MIT LicenseStar數量:178357 個Fork數量:…

yolov11模型在Android設備上運行【踩坑記錄】

0) 參考資料: https://github.com/Tencent/ncnn?tabreadme-ov-file https://github.com/pnnx/pnnx https://github.com/nihui/ncnn-android-yolov5 https://github.com/Tencent/ncnn?tabreadme-ov-file 1) &#xff1a;將xxx.pt模型轉化成 xxx.onnx ONNX&#xff08;Ope…

快速上手——.net封裝使用DeekSeek-V3 模型

??歡迎點贊 :?? 收藏 ?留言 ?? 如有錯誤敬請指正,賜人玫瑰,手留余香!??本文作者:由webmote 原創??作者格言:新的征程,用愛發電,去丈量人心,是否能達到人機合一?開工大吉 新的一年就這么水靈靈的開始了,在這里,祝各位讀者新春快樂,萬事如意! 新年伊…

2025藍橋杯JAVA編程題練習Day2

1.大衣構造字符串 問題描述 已知對于一個由小寫字母構成的字符串&#xff0c;每次操作可以選擇一個索引&#xff0c;將該索引處的字符用三個相同的字符副本替換。 現有一長度為 NN 的字符串 UU&#xff0c;請幫助大衣構造一個最小長度的字符串 SS&#xff0c;使得經過任意次…

【WebLogic】Oracle發布WebLogic 14c最新版本-14.1.2.0

根據Oracle官方產品經理的博客&#xff0c;Oracle于2024年12月20日正式對外發布了WebLogic 14c的第二個正式版本&#xff0c;版本號為 14.1.2.0.0 &#xff0c;目前官方已開放客戶端下載。該版本除繼續支持 Jakarta EE 8 版本外&#xff0c;還增加了對 Java SE 17&#xff08;J…

Spider 數據集上實現nlp2sql訓練任務

NLP2SQL&#xff08;自然語言處理到 SQL 查詢的轉換&#xff09;是一個重要的自然語言處理&#xff08;NLP&#xff09;任務&#xff0c;其目標是將用戶的自然語言問題轉換為相應的 SQL 查詢。這一任務在許多場景下具有廣泛的應用&#xff0c;尤其是在與數據庫交互的場景中&…

IDEA+DeepSeek讓Java開發起飛

1.獲取DeepSeek秘鑰 登錄DeepSeek官網 : https://www.deepseek.com/ 進入API開放平臺&#xff0c;第一次需要注冊一個賬號 進去之后需要創建一個API KEY&#xff0c;然后把APIkey記錄保存下來 接著我們獲取DeepSeek的API對話接口地址&#xff0c;點擊左邊的&#xff1a;接口…

k8s常見面試題2

k8s常見面試題2 安全與權限RBAC配置如何保護 Kubernetes 集群的 API Server&#xff1f;如何管理集群中的敏感信息&#xff08;如密碼、密鑰&#xff09;&#xff1f;如何限制容器的權限&#xff08;如使用 SecurityContext&#xff09;&#xff1f;如何防止容器逃逸&#xff0…

flutter安卓打包簽名

flutter安卓打包簽名 1.創建簽名文件 keytool -genkeypair -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-aliaskeytool 是一個用于管理密鑰和證書的命令行工具&#xff0c;通常與 Java 開發工具包 (JDK) 一起使用。my-release-…

React - jsx 語法

在 React 中&#xff0c;JSX&#xff08;JavaScript XML&#xff09;是一種語法擴展&#xff0c;它允許開發者在 JavaScript 代碼中使用類似 HTML 的語法。JSX 提升了代碼的可讀性和可維護性&#xff0c;使得編寫和構建用戶界面更加直觀。它被廣泛應用于 React 組件的定義。 一…

intra-mart實現簡易登錄頁面筆記

一、前言 最近在學習intra-mart框架&#xff0c;在此總結下筆記。 intra-mart是一個前后端不分離的框架&#xff0c;開發時主要用的就是xml、html、js這幾個文件&#xff1b; xml文件當做配置文件&#xff0c;html當做前端頁面文件&#xff0c;js當做后端文件&#xff08;js里…

Linux+Docer 容器化部署之 Shell 語法入門篇 【Shell 替代】

&#x1f380;&#x1f380;Shell語法入門篇 系列篇 &#x1f380;&#x1f380; LinuxDocer 容器化部署之 Shell 語法入門篇 【準備階段】LinuxDocer 容器化部署之 Shell 語法入門篇 【Shell變量】LinuxDocer 容器化部署之 Shell 語法入門篇 【Shell數組與函數】LinuxDocer 容…

Intellij IDEA如何查看當前文件的類

快捷鍵&#xff1a;CtrlF12&#xff0c;我個人感覺記快捷鍵很麻煩&#xff0c;知道具體的位置更簡單&#xff0c;如果忘了快捷鍵&#xff08;KeyMap&#xff09;看一下就記起來了&#xff0c;不需要再Google or Baidu or GPT啥的&#xff0c;位置&#xff1a;Navigate > Fi…

C++----繼承

一、繼承的基本概念 本質&#xff1a;代碼復用類關系建模&#xff08;是多態的基礎&#xff09; class Person { /*...*/ }; class Student : public Person { /*...*/ }; // public繼承 派生類繼承基類成員&#xff08;數據方法&#xff09;&#xff0c;可以通過監視窗口檢…