前 言
搞SOA、搞 AP & CP AUTOSAR、搞异构SoC、搞车载以太网、搞车载OS等就找搞一下汽车电子。
视频
点击查看
CP AUTOSAR OS 简介
CP AUTOSAR OS是用于车载ECU的实时操作系统, 在协议栈中属于System Services 中的一个模块。
CP AUTOSAR OS是基于OSEK/VDX的Operating System, 其基础原理可以参考OSEK OS相关文档。
OSEK OS 是基于事件触发的操作系统,可以灵活的对任务进行调度。需要注意的是,CP AUTOSAR OS 不支持动态创建任务,所有OS行为需要在编译时进行定义。
CP AUTOSAR OS 支持多核。下图所示为,CP AUTOSAR 概览图。
CP AUTOSAR OS根据是否支持时间保护和内存保护分为四个Class
- SC1
- SC2
- SC3
- SC4
如下图所示:
MemoryProtection 是指用于防止不同的OS Application异常访问其他不允许的程序段或数据段。
Timing Protection 用于监控任务或者中断是否超时 (超过规定的时间deadline)
OS Application
OS Application简介
OS Application是程序应用的单元,每个OS Application 包含如下内容:
- TaskManagement (任务管理)
- ISRManagement (中断管理)
- Scheduler(调度表)
- ResourceManagement(资源管理)
- Countersand Alarms (时基和警报器)
- Events(事件)
- Hook Routines (Hook 程序)
OS Application 各项关系图
✦✦ OS Application 各项关系图如下图所示:
时基和报警器
✦✦ 时基和报警器简介
- Counters(时基)是OSEK OS中一个组件,在软件中可理解为Ticks。
- Alarm(警报器)是由Counter驱动的,多个Alarm可以连接到同一个Counter。
Counter每次累加都会触发相关联Alarm的检查,如果满足触发条件,Alarm会被触发。
Alarm 向上关联到1个任务,激活的Alarm可以触发一次任务执行(BCC task)或者触发一次事件(Set Event)
Alarm 主要包括以下类型:
- –Relative(相对时间Alarm):对比当前时基又过了Tick数量后触发。
- –Absolute(绝对时间Alarm):当Counter到达固定数值后触发,或者周期固定间隔触发。
✦✦ 时基和报警器示例
如下,是一个时基和报警器的示例:
上述代码启动了一个1秒的周期类型的RelativeAlarm
此Alarm与Core0_App_100msTask连接用于周期性的激活任务。
相关配置如下图所示:
上图中的设计原理如下:
- CounterType: 采用硬件时钟并关联到硬件Timer
- Counter Tick Per Base: 每100个硬件TimerCounter触发OS Counter 累加
- Seconds Per Tick: 1us, 为了增加OS调度速度,精度不宜过小
任务管理
✦✦ 基础任务
基础任务英文缩写为:BCCtask,主要包括以下特性:
每次启动都会从程序开始执行到程序结束
没有等待状态
可以被其他任务抢占,但不会自主进去等待状态
基础任务会在以下下情况下停止运行
- 任务结束
- 被高优先级任务抢占
- 被中断抢占(中断优先级高于任务)
✦✦ 基础任务示例
如下图所示为基础任务的配置示例:
上图中:
TaskActivation 是指同时只允许一次任务激活
Priority 指任务优先级, 高优先级任务可以抢占低优先级任务(如果低优先级任务配置成支持抢占类型)
Schedule 设置为不支持抢占
Stack Size 设置为1K (根据当前任务所需要Stack进行设置,如果Stack产生Overflow,OS会在任务切换时报错挂死)
Type 类型为 Basic Task(基础任务)
下图为配置的Task的代码示例:
✦✦ Event
Event 主要用于扩展类型任务的触发执行(从Waiting状态到Run状态)
- 每个扩展类型任务可以关联多个事件
- 任何任务或者中断程序都可以激活事件
- 只有关联事件的任务可以等待和清除相关联事件
状态切换关系如下图所示:
✦✦ 扩展任务
扩展任务经常是运行在while循环中的,一般不会结束,但视应用场景也可以结束。
扩展任务可以进入Waiting状态,待事件触发后,继续执行
可以被其他高优先级任务抢占,也可以自主挂起
扩展任务会在如下情况下停止运行
- 任务结束
- 被高优先级任务抢占
- 被中断抢占 (中断优先级高于任务)
- 自主挂起进入Waiting状态
✦✦ 扩展任务示例
下图所示为扩展任务的配置示例:
上图中
TaskActivation 指同时只允许一次任务激活
Priority 指任务优先级, 高优先级任务可以抢占低优先级任务(如果低优先级任务配置成支持抢占类型)
Schedule 抢占
Stack Size: 1K (根据当前任务所需要Stack进行设置,如果Stack产生Overflow,OS会再任务切换时报错挂死)
Type: Extended
扩展任务的代码示例如下:
任务调度
任务执行顺序由如下OS配置决定:
- 任务优先级
- 任务调度方式(FULL/NON抢占)
- 任务激活方式,同时激活的任务按优先级排队执行,扩展类型任务可以由软件控制执行
- - 任务切换时任务现场会保存再对应任务的TaskStack中,右侧下图TaskT2黄色部分为任务切换程序执行。抢占过多会造成任务切换过多导致CPURuntime的损失。
任务同步与资源管理
任务同步管理用于管理多个任务共享的资源(数据和外设等),防止task1再读取共享数据的时候被task2改写。
常规方法包含 (ExclusiveArea Handling):
- 开关中断
- Get/ReleaseResource
- Get/Release SpinLock
ISR Management (中断管理)
中断服务程序再OSEKOS中具有高于任务的优先级
OSEK OS有两类中断:
Category1, 不要OS接管,不受OS中断优先级等管理
Category2,中端触发后,OS接管,受OS控制
✦✦ 二类中断示例
如上述代码所示,中断向量表不直接指定中断服务程序,而是指向Os_Hal_IsrRun程序由OS接管中断服务程序。
下文图表描述了中断服务程序抢占任务的示例。
Hook 函数和错误处理
AUTOSAR 协议栈中OS的启动
AUTOSAR 协议栈中的OS启动如下图所示:
OS 启动与 ECUM/BSWM 交互
OS启动流程如下:
- 1、执行Os_InitMemory初始化OS参数(OS使用到的变量等)
- 2、执行 Call Os_Init() 初始化OS. (变量,OS中断控制器,MPU等)
- 3、执行EcuM_Init() 初始化部分硬件模块(Port,Dio,Adc…)
- 4、执行EcuM_StartOS() 启动OS
- 5、再OS开始执行后Task_Init会首先被调用. 执行EcuM_StartupTwo() ,此函数会调用BswM_Init()来初始化其他硬件模块(CAN/LIN/NVM…).
- 6、再BswM_Init函数最后执行Rte_Start() 用于启动所有任务.
AUTOSAR 协议栈中OS的停止
OS ShutDown流程如下:
- 1、停止CAN/LIN/ETH通信
- 2、保存NVM数据
- 3、EcuM执行休眠程序
- 4、EcuM执行OS停止程序
- 5、MCU进入休眠模式
AUTOSAR OS 多核与 IOC
多核配置流程:
- 1、使能两个核并关联到到不同的EcucParatition
- 2、建立两个OSApplication并分配到不同的EcucParatition
- 3、每个OSApplication可关联不同的task/ISR等,这样关联的任务就会在相应核执行
核间通信(已core0到 core1通信为例)流程:
- 1、core0发送方通过RTE将数据写入IOC 并触发core1任务
- 2、core1执行完任务将结果通过RTE反馈到IOC并触发core0任务
- 3、core0得到反馈数据结束处理
✦✦ IOC示例
下图为IOC(核间通信)的一个示例:
原文链接:https://mp.weixin.qq.com/s/38EAPlb1-YEQMbH_SHCDnw
推荐阅读