嵌入式、C语言、autosar、OS、BSW
项目 | Value |
---|---|
OS | autosar 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驱动程序中,中断处理程序函数位于软件驱动程序中
??中断向量表是根据芯片类型和编译器类型所生成的,指向每个可能产生中断的中断源。在多核系统中可以生成多个向量表。
Adc_IntISR_Fun
0类中断 | 只有vector才有此概念,不受OS管控 |
---|---|
1类中断 | 不受OS管控 |
2类中断 | 受OS管控 |
优先级如下:
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() | 仅能用于控制二类中断. |
??优先级低于1类中断高于task。
??以创建一个AD采集为例:
ISR(Adc_IrqUnit0)
{
Adc_IntISR_Fun(ADC_UNIT_0);
}
FUNC(void, ADC_CODE_FAST) Adc_IntISR_Fun(Adc_ChannelType AdcChannel)
{
uer_code;
读取AD寄存器之类的
}
??**作用:**尽可能的降低延迟
??一类中断优先级低于0类中断高于2类中断。
定义了一个宏来实现。
/***********************************************************************************************************************
* 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()
{
}
1.vector 规定了不同的stack类型,不同的用户只能在匹配的stack上压栈和出栈。如果在一个不能根据中断请求自动切换合适的栈的平台上配置一类中断,会导致该中断无法压栈导致OS错误。
2.autosar OS 标准不允许在一类中断中调用 OS API。
??0类中断是vector 工具链特有的。0类中断比1类中断具有更低的延迟。
和一类中断类似,由一个宏来实现。
/***********************************************************************************************************************
* 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)
1.和一类中断一样,如果在一个不能根据中断请求自动切换合适的栈的平台上配置0类中断,会导致该中断无法压栈导致OS错误。
2.0类中断会打断1类2类中断(即使为non nestable)和task,因此0类中断会占用上述三类的时间消耗。
3.如果在0类中断执行期间时间保护中断产生了,那么时间保护的后续操作(violation 或则hook)将会延迟到0类中断执行完成后才会调用。
4.在OS关闭或者进入panic hook,0类中断依旧可以被触发。
>>>>>回到总目录<<<<<<