YAOTU INSIGHTS

[AutoSar]BSW_OS 04 Autosar OS_ISR 中断

[AutoSar]BSW_OS 04 Autosar OS_ISR 中断
目录关键词平台说明一、中断简介1.2 vector中断概述二 、中断向量表三 、中断分类3.1 开关中断控制3.2 二类中断3.2.1 配置3.2.2 code3.2.3 Nesting of Category 2 Interrupts3.3 一类中断3.3.1 一类中断的实现3.3.2 注意事项3.4 0类中断3.4.1 0类中断的实现3.4.2 注意事项关键词嵌入式、C语言、autosar、OS、BSW平台说明项目ValueOSautosar OSautosar厂商vector 芯片厂商TI 英飞凌编程语言CC编译器HighTec (GCC)回到总目录一、中断简介在OS中ISR是不可缺少的一部分它提供了软件和外界的事件的联系方式如ADCcan通信和软件内事件及时响应的可能如DMA,TOM。下图以英飞凌TC 芯片为例 展示了中断 从硬件–软件的 mappingService request control registerSRCIRQ驱动程序访问中断控制器的寄存器。驱动程序初始化特定于外设的srn优先级。在接收到中断时中断系统跳转到IRQ驱动程序中适当的中断处理程序帧并调用相应的中断处理程序函数。在MCAL驱动程序中中断处理程序函数位于软件驱动程序中1.2 vector中断概述二 、中断向量表中断向量表是根据芯片类型和编译器类型所生成的指向每个可能产生中断的中断源。在多核系统中可以生成多个向量表。Adc_IntISR_Fun三 、中断分类0类中断只有vector才有此概念不受OS管控1类中断不受OS管控 中断执行完毕后会回到产生中断的地方不会影响到任务的执行2类中断受OS管控可以调用部分OS服务例如在taskA中产生中断中断中激活优先级更高的taskBtaskB运行完后继续回到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 codeISR(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. **********************************************************************************************************************/#defineOS_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. **********************************************************************************************************************/#defineOS_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 hook0类中断依旧可以被触发。回到总目录