[AutoSar]BSW_OS 04 Autosar OS_ISR 中断


  

关键词

嵌入式、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管控,可以调用部分OS服务,例如在taskA中产生中断,中断中激活优先级更高的taskB,taskB运行完后继续回到taskA产生中断的地方执行

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

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类中断依旧可以被触发。
>>>>>回到总目录<<<<<<

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老灰╮(╯-╰)╭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值