【OS】AUTOSAR架构下的Interrupt详解(上篇)

news2025/2/5 14:25:39

目录

前言

正文

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.coloradmin.cn/o/2292348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE编辑器工具

如何自己制作UE小工具提高工作效率 在虚幻编辑器用户界面中&#xff0c;可以使用各种各样的可视化工具来设置项目&#xff0c;设计和构建关卡&#xff0c;创建游戏性交互等等。但有些时候&#xff0c;当你确定了需要编辑器执行的操作后&#xff0c;可能想要通过编程方式调用它…

【Linux】25.进程信号(2)

文章目录 4.捕捉信号4.1 重谈地址空间4.2 内核如何实现信号的捕捉4.3 sigaction4.4 可重入函数4.5 volatile4.6 SIGCHLD信号&#xff08;了解&#xff09; 4.捕捉信号 4.1 重谈地址空间 用户页表有几份&#xff1f; 有几个进程&#xff0c;就有几份用户级页表–进程具有独立性…

洛谷 P1387 最大正方形 C语言

题目描述 在一个 n m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形&#xff0c;输出边长。 输入格式 输入文件第一行为两个整数 n, m (1 ≤ n, m ≤ 100)&#xff0c;接下来 n 行&#xff0c;每行 m 个数字&#xff0c;用空格隔开&#xff0c;0 或 1。 输出格式 …

ChatGPT提问技巧:行业热门应用提示词案例--咨询法律知识

ChatGPT除了可以协助办公&#xff0c;写作文案和生成短视频脚本外&#xff0c;和还可以做为一个法律工具&#xff0c;当用户面临一些法律知识盲点时&#xff0c;可以向ChatGPT咨询获得解答。赋予ChatGPT专家的身份&#xff0c;用户能够得到较为满意的解答。 1.咨询法律知识 举…

[吾爱出品]CursorWorkshop V6.33 专业鼠标光标制作工具-简体中文汉化绿色版

CursorWorkshop V6.33 专业鼠标光标制作工具 链接&#xff1a;https://pan.xunlei.com/s/VOIFeq5DFB9FS56Al_mT2EfdA1?pwd7ij4# 产品概述 Axialis CursorWorkshop 是一个专业光标创作工具它在 Windows 下运行&#xff0c;让您轻松创建高质量的静态和动态光标适用于 Windows …

【C语言】自定义类型讲解

文章目录 一、前言二、结构体2.1 概念2.2 定义2.2.1 通常情况下的定义2.2.2 匿名结构体 2.3 结构体的自引用和嵌套2.4 结构体变量的定义与初始化2.5 结构体的内存对齐2.6 结构体传参2.7 结构体实现位段 三、枚举3.1 概念3.2 定义3.3 枚举的优点3.3.1 提高代码的可读性3.3.2 防止…

LabVIEW涡轮诊断系统

一、项目背景与行业痛点 涡轮机械是发电厂、航空发动机、石油化工等领域的核心动力设备&#xff0c;其运行状态直接关系到生产安全与经济效益。据统计&#xff0c;涡轮故障导致的非计划停机可造成每小时数十万元的经济损失&#xff0c;且突发故障可能引发严重安全事故。传统人…

Kubernetes 中 BGP 与二层网络的较量:究竟孰轻孰重?

如果你曾搭建过Kubernetes集群&#xff0c;就会知道网络配置是一个很容易让人深陷其中的领域。在负载均衡器、服务通告和IP管理之间&#xff0c;你要同时应对许多变动的因素。对于许多配置而言&#xff0c;使用二层&#xff08;L2&#xff09;网络就完全能满足需求。但边界网关…

大模型综述一镜到底(全文八万字) ——《Large Language Models: A Survey》

论文链接&#xff1a;https://arxiv.org/abs/2402.06196 摘要&#xff1a;自2022年11月ChatGPT发布以来&#xff0c;大语言模型&#xff08;LLMs&#xff09;因其在广泛的自然语言任务上的强大性能而备受关注。正如缩放定律所预测的那样&#xff0c;大语言模型通过在大量文本数…

物理群晖SA6400核显直通win10虚拟机(VMM)

写在前面&#xff1a;请先确保你的核显驱动支持开启SR-IOV 确保你的BIOS开启了以下选项&#xff1a; VT-D VMX IOMMU Above 4G ResizeBAR 自行通过以下命令确认支持情况&#xff1a; dmesg | grep -i iommudmesg | grep DMAR分配1个虚拟vGPU&#xff1a;echo 1 | sudo tee /sy…

【python】tkinter实现音乐播放器(源码+音频文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【python】tkinter实现音乐播放器&#xff08;源码…

MyBatis-Plus速成指南:常用注解

Table Name: 概述&#xff1a; MyBatis-Plus 在确定操作的表时&#xff0c;由 BaseMapper的泛型决定&#xff0c;即实体类决定&#xff0c;且默认操作的表名和实体类的类名一致 问题&#xff1a; 如果实体类类型的类名和要操作表的表名不一致会出现什么问题&#xff1f;(把 us…

Linux 压缩打包

Linux压缩打包 文章目录 Linux压缩打包压缩的意义和原理压缩的意义压缩的原理压缩与解压缩的好处 压缩打包命令.zipzip 命令用法unzip 的用法 .gzgzip 的用法gunzip 的用法 .bz2bzip2 的用法bunzip2 的用法 .xzxz 命令用法 tar 04-Linux压缩打包课后习题 压缩的意义和原理 压缩…

RabbitMQ深度探索:前置知识

消息中间件&#xff1a; 消息中间件基于队列模式实现异步 / 同步传输数据作用&#xff1a;可以实现支撑高并发、异步解耦、流量削峰、降低耦合 传统的 HTTP 请求存在的缺点&#xff1a; HTTP 请求基于响应的模型&#xff0c;在高并发的情况下&#xff0c;客户端发送大量的请求…

智慧校园平台:构建现代化教育体系的技术支撑

在当今信息技术飞速发展的时代&#xff0c;智慧校园平台成为了现代教育领域中的重要组成部分。智慧校园平台不仅能够提升学校的管理水平&#xff0c;还能提供更为个性化和高效的教学服务&#xff0c;从而促进学生的全面发展。 数据分析是智慧校园平台的重要组成部分。通过对学生…

20250204将Ubuntu22.04的默认Dash的shell脚本更换为bash

20250204将Ubuntu22.04的默认Dash的shell脚本更换为bash 2025/2/4 23:45 百度&#xff1a;dash bash https://blog.csdn.net/2201_75772333/article/details/136955776 【Linux基础】dash和bash简介 Dash&#xff08;Debian Almquist Shell&#xff09;和 Bash&#xff08;Bou…

Golang 并发机制-3:通道(channels)机制详解

并发编程是一种创建性能优化且响应迅速的软件的强大方法。Golang&#xff08;也称为 Go&#xff09;通过通道&#xff08;channels&#xff09;这一特性&#xff0c;能够可靠且优雅地实现并发通信。本文将揭示通道的概念&#xff0c;解释其在并发编程中的作用&#xff0c;并提供…

可视化大屏在石油方面的应用。

可视化大屏通过整合石油工业全链条数据&#xff0c;构建数字孪生驱动的运营监控体系&#xff0c;显著提升油气勘探、开采、储运及炼化的管理效能。其技术架构依托工业物联网&#xff08;IIoT&#xff09;实时采集钻井参数、管道压力、储罐液位等数据&#xff0c;通过OPC UA协议…

【学术投稿-2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)】从计算机基础到HTML开发:Web开发的第一步

会议官网&#xff1a;www.acvra.org 简介 2025年计算机视觉研究进展与应用&#xff08;ACVRA 2025&#xff09;将于2025年2月28-3月2日在中国广州召开&#xff0c;将汇聚世界各地的顶尖学者、研究人员和行业专家&#xff0c;聚焦计算机视觉领域的最新研究动态与应用成就。本次…

Axure PR 9 旋转效果 设计交互

大家好&#xff0c;我是大明同学。 这期内容&#xff0c;我们将学习Axure中的旋转效果设计与交互技巧。 旋转 创建旋转效果所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个按钮元件。 创建交互 创建按钮交互状态 1.选中按钮元件&#xf…