• 413查看
  • 0回复

[Autosar] 详解Autosar OS的中断管理和实现

[复制链接]


该用户从未签到

发表于 8-5-2024 19:49:54 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


中断介绍
中断一般是由硬件(如外设和外部输入引脚)产生的事件,它会引起程序流偏离正常的流程(如给外设提供服务)。当外设或者硬件需要处理的服务时,一般会出现下面的流程:1 外设确认到处理器的中断请求;2 处理器暂停当前执行的任务;3 处理器执行外设的中断服务程序(ISR),如有必要可以选择软件清除中断请求;4 处理器继续执行之前暂停的任务。
FreeRTOS中断管理
有过FreeRTOS使用经验的同学应该知道,在FreeRTOSConfig.h里配置configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY这个参数,此宏用来设置 FreeRTOS 系统可管理的最大优先级,假如设置为了 5,也就是高 于 5 的优先级不归 FreeRTOS 管理!
详解Autosar OS的中断管理和实现w1.jpg

Autosar OS中断管理
Autosar的中断管理有点类似于FreeRTOS。Autosar OS将中断分为两类:一类中断和二类中断。一类中断不受操作系统的管控(bypass),因此那些对实时性要求严格的任务就可以使用一类中断。因为OS的服务函数不能被一类中断使用,因而操作系统提供的保护功能(时间和内存保护)在一类中断服务函数运行期间是不起作用的。在Autosar OS的官方文档介绍了服务函数可以使用的地方,具体如下面所示。
详解Autosar OS的中断管理和实现w2.jpg

详解Autosar OS的中断管理和实现w3.jpg

一般单片机的处理器提供的中断控制器都是支持中断嵌套的,因此,一类中断配置的优先级必须高于二类中断。需要注意的是,对于多核处理器来说,每个核的中断优先级互不影响,即在不同核上可以存在相同优先级的中断,但任何一个一类中断的优先级必须大于所有核上的二类中断的最高优先级。
实现

跳转到ISR
在处理器接受异常请求后,处理器需要确定该异常处理(若为中断,则是ISR)的起始地址,该信息位于中断向量表中。因此对于二类中断来说,在中断向量表中设置同样的中断ISR(或者二类中断进入后立马调用二类中断统一的接口)地址,在统一的ISR中调用不同外设的中断处理函数。而一类中断直接将外设的中断处理函数的地址设置在中断向量表中。二类中断的伪代码实现为:
工具生成的中断向量表(多核单片机会单独生成多个中断向量表)为:

Typedef void (*os_vectorentry_func)(void);

os_vectorentry_func OsCfg_VectorTable[] = {

    DefaultInterruptHandler,

    DefaultInterruptHandler,

    Os_Isr_InterrutpN,

    DefaultInterruptHandler

};

在.asm中定义中断服务函数的实现

Os_CAT2_Interrutp_Entry MARCO IsrConfig

     /*一些寄存器的必要处理*/

     ldrr0= IsrConfig

    bl OsIsrRun ;二类中断通用处理的wrapper,C语言实现

    /*一些寄存器的必要处理*/

ENDM

Os_Isr_InterrutpN

     Os_CAT2_Interrutp_EntryOs_Cfg_ISr_LinIsr

ENDM

void Os_IsrRun(Os_IsrConfigType Isr)

{

     /*一些处理函数,如判断Core等*/

    Os_StartThread(Isr->Thread);/*调用外设中断处理函数*/

    /*一些处理函数*/

}

中断屏蔽
在《AUTOSAR OS之Resource和Spinlock》中介绍了Resource和Spinlock的实现原理,其实中断的分类也是基于同样寄存器实现的。Autosar的中断和任务优先级都是静态配置,不支持运行过程中创建任务等,这个和FreeRTOS不同,因此可以将配置的二类中断的最高优先级写入中断控制的相关寄存器(对于ARM M3/M4处理器来说就是BASEPRI),就可以实现屏蔽所有的二类中断。同理,我们可以将一类中断的最高优先级写入中断控制的相关寄存器(对于ARM M3/M4处理器来说就是BASEPRI),就可以实现屏蔽所有中断。一般而言,resource只会屏蔽二类中断,Spinlock则是可选,配置如下所示。
Spinlock的配置
Spinlock可以通过OsSpinlockLockMethod来决定获取锁后这个锁的模式。一般配置的选项为:
1 LOCK_ALL_INTERRUPTS:在获取锁后执行代码时,所有中断都被屏蔽;

2 LOCK_CAT2_INTERRUPTS:在获取锁后执行代码时,所有二类中断都被屏蔽;

3 LOCK_NOTHING:在获取锁后执行代码时,不锁任何东西.
在配置为LOCK_ALL_INTERRUPTS,假如代码执行时间过长,将会影响一类中断的实时性!
多核单片机中断分配
多核单片机一般对应多个OSApplication,在OsApplication下的OsAppIsrRef选项中选中在OSIsr配置的中断即可将该中断分配在这个OSApplication上。

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 27-12-2024 10:48 , Processed in 0.229216 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.