
CP AUTOSAR OS 工程实践
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 Aplication 简介
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,主要包括以下特性:
每次启动都会从程序开始执行到程序结束
没有等待状态
可以被其他任务抢占,但不会自主进去等待状态
基础任务会在以下下情况下停止运行
- 任务结束
- 被高优先级任务抢占
- 被中断抢占(中断优先级高于任务)
基础任务示例
如下图所示为基础任务的配置示例:
上图中:
Task Activation 是指同时只允许一次任务激活
Priority 指任务优先级, 高优先级任务可以抢占低优先级任务(如果低优先级任务配置成支持抢占类型)
Schedule 设置为不支持抢占
Stack Size 设置为1K (根据当前任务所需要 Stack 进行设置,如果 Stack 产生Overflow,OS 会在任务切换时报错挂死)
Type 类型为 Basic Task(基础任务)
下图为配置的 Task 的代码示例:
Event
Event 主要用于扩展类型任务的触发执行(从Waiting状态到Run状态)
每个扩展类型任务可以关联多个事件
任何任务或者中断程序都可以激活事件
只有关联事件的任务可以等待和清除相关联事件
状态切换关系如下图所示:
扩展任务
扩展任务经常是运行在 while 循环中的,一般不会结束,但视应用场景也可以结束。
扩展任务可以进入 Waiting 状态,待事件触发后,继续执行
可以被其他高优先级任务抢占,也可以自主挂起
扩展任务会在如下情况下停止运行
- 任务结束
- 被高优先级任务抢占
- 被中断抢占 (中断优先级高于任务)
- 自主挂起进入 Waiting 状态
扩展任务示例
下图所示为扩展任务的配置示例:
上图中
Task Activation 指同时只允许一次任务激活
Priority 指任务优先级, 高优先级任务可以抢占低优先级任务(如果低优先级任务配置成支持抢占类型)
Schedule 抢占
Stack Size: 1K (根据当前任务所需要 Stack 进行设置,如果 Stack 产生Overflow,OS 会再任务切换时报错挂死)
Type: Extended
扩展任务的代码示例如下:
任务调度
任务执行顺序由如下 OS 配置决定:
- 任务优先级
- 任务调度方式(FULL/NON抢占)
- 任务激活方式,同时激活的任务按优先级排队执行,扩展类型任务可以由软件控制执行
- 任务切换时任务现场会保存再对应任务的 Task Stack 中,右侧下图 Task T2 黄色部分为任务切换程序执行。抢占过多会造成任务切换过多导致 CPURuntime 的损失。
任务同步与资源管理
任务同步管理用于管理多个任务共享的资源(数据和外设等),防止task1再读取共享数据的时候被 Task2 改写。
常规方法包含 (ExclusiveArea Handling):
- 开关中断
- Get/ReleaseResource
- Get/Release SpinLock
ISR Management(中断管理)
中断服务程序再 OSEK OS 中具有高于任务的优先级
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(核间通信)的一个示例:
文章转载自公众号:汽车电子与软件
