[AutoSar]BSW_OS 04 Autosar OS_ISR 中断

发布时间:2024年01月19日


??

关键词

嵌入式、C语言、autosar、OS、BSW

平台说明

项目Value
OSautosar OS
autosar厂商vector ,
芯片厂商TI 英飞凌
编程语言C,C++
编译器HighTec (GCC)

在这里插入图片描述
>>>>>回到总目录<<<<<<

一、中断简介

??在OS中ISR是不可缺少的一部分,它提供了软件和外界的事件的联系方式(如ADC,can通信)和软件内事件及时响应的可能(如DMA,TOM)。
下图以英飞凌TC 芯片为例 展示了中断 从硬件–>软件的 mapping
Service request control register(SRC)
??IRQ驱动程序访问中断控制器的寄存器。驱动程序初始化特定于外设的srn优先级。在接收到中断时,中断系统跳转到IRQ驱动程序中适当的中断处理程序帧,并调用相应的中断处理程序函数。在MCAL驱动程序中,中断处理程序函数位于软件驱动程序中
在这里插入图片描述

1.2 vector中断概述

在这里插入图片描述

二 、中断向量表

??中断向量表是根据芯片类型和编译器类型所生成的,指向每个可能产生中断的中断源。在多核系统中可以生成多个向量表。
在这里插入图片描述

Adc_IntISR_Fun

三 、中断分类

0类中断只有vector才有此概念,不受OS管控
1类中断不受OS管控
2类中断受OS管控

优先级如下:
在这里插入图片描述

3.1 开关中断控制

DisableAllInterrupts() EnableAllInterrupts()
The functions disable all category 1 and category 2 interrupts. SuspendAllInterrupts() ResumeAllInterrupts() SuspendOSInterrupts() ResumeOSInterrupts()
The functions disable category 2 interrupts only.

DisableAllInterrupts() EnableAllInterrupts() SuspendOSInterrupts() ResumeOSInterrupts()用于控制一类和二类中断
SuspendOSInterrupts() ResumeOSInterrupts()仅能用于控制二类中断.

3.2 二类中断

??优先级低于1类中断高于task。

3.2.1 配置

??以创建一个AD采集为例:
在这里插入图片描述

3.2.2 code

ISR(Adc_IrqUnit0)
{
    Adc_IntISR_Fun(ADC_UNIT_0);
}

FUNC(void, ADC_CODE_FAST) Adc_IntISR_Fun(Adc_ChannelType AdcChannel)

{
    uer_code;
    读取AD寄存器之类的
}

3.2.3 Nesting of Category 2 Interrupts

??**作用:**尽可能的降低延迟
在这里插入图片描述

3.3 一类中断

??一类中断优先级低于0类中断高于2类中断。

3.3.1 一类中断的实现

定义了一个宏来实现。

/***********************************************************************************************************************
 *  OS_ISR1()
 **********************************************************************************************************************/
/*! \def        OS_ISR1()
 *  \brief      Category 1 ISR function declaration macro.
 *  \details    This macro builds the category 1 ISR function declaration for a function name.
 *
 *  \param[in]  IsrName  The ISR name.
 **********************************************************************************************************************/
# define OS_ISR1(IsrName)       OS_HAL_ISR1_DEFINE(IsrName)

在这里插入图片描述

OS_ISSR1(OsIsr_funcction_name)

OsIsr_funcction_name()
{
}

3.3.2 注意事项

1.vector 规定了不同的stack类型,不同的用户只能在匹配的stack上压栈和出栈。如果在一个不能根据中断请求自动切换合适的栈的平台上配置一类中断,会导致该中断无法压栈导致OS错误。
在这里插入图片描述
在这里插入图片描述
2.autosar OS 标准不允许在一类中断中调用 OS API。

3.4 0类中断

??0类中断是vector 工具链特有的。0类中断比1类中断具有更低的延迟。

3.4.1 0类中断的实现

和一类中断类似,由一个宏来实现。

/***********************************************************************************************************************
 *  OS_ISR0()
 **********************************************************************************************************************/
/*! \def        OS_ISR0()
 *  \brief      Category 0 ISR function declaration macro.
 *  \details    This macro builds the category 0 ISR function declaration for a function name.
 *
 *  \param[in]  IsrName  The ISR name.
 **********************************************************************************************************************/
# define OS_ISR0(IsrName)       OS_HAL_ISR0_DEFINE(IsrName)

3.4.2 注意事项

1.和一类中断一样,如果在一个不能根据中断请求自动切换合适的栈的平台上配置0类中断,会导致该中断无法压栈导致OS错误。
2.0类中断会打断1类2类中断(即使为non nestable)和task,因此0类中断会占用上述三类的时间消耗。
3.如果在0类中断执行期间时间保护中断产生了,那么时间保护的后续操作(violation 或则hook)将会延迟到0类中断执行完成后才会调用。
4.在OS关闭或者进入panic hook,0类中断依旧可以被触发。
>>>>>回到总目录<<<<<<

文章来源:https://blog.csdn.net/weixin_42447823/article/details/135672529
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。