Amiya · 1月12日

CP AUTOSAR OS 工程实践

前  言

搞SOA、搞 AP & CP AUTOSAR、搞异构SoC、搞车载以太网、搞车载OS等就找搞一下汽车电子。

视频

点击查看

image.png

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 概览图。

91e36f7e3464ef88205ee8ab6991b33c.png

CP AUTOSAR OS根据是否支持时间保护和内存保护分为四个Class

  • SC1
  • SC2
  • SC3
  • SC4

如下图所示:

1fc85680b445f1f9a972f8f937265bc0.jpg

MemoryProtection 是指用于防止不同的OS Application异常访问其他不允许的程序段或数据段。

Timing Protection 用于监控任务或者中断是否超时 (超过规定的时间deadline)

OS Application

OS Application简介

OS Application是程序应用的单元,每个OS Application 包含如下内容:

  • TaskManagement (任务管理)
  • ISRManagement (中断管理)
  • Scheduler(调度表)
  • ResourceManagement(资源管理)
  • Countersand Alarms (时基和警报器)
  • Events(事件)
  • Hook Routines (Hook 程序)

ed55dc86fe26de59aa12908200d98b22.jpg

OS Application 各项关系图

✦✦ OS Application 各项关系图如下图所示:

2c45074452bb26c947127e93b7546a3d.jpg

时基和报警器

✦✦ 时基和报警器简介

  • 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到达固定数值后触发,或者周期固定间隔触发。

✦✦ 时基和报警器示例

如下,是一个时基和报警器的示例:

d0fe80f72c5787e78a681d0ca472ad8d.jpg

f9373230b8f76bfc7f3b5c8c7c5f9bf4.jpg

上述代码启动了一个1秒的周期类型的RelativeAlarm
此Alarm与Core0_App_100msTask连接用于周期性的激活任务。

相关配置如下图所示:

dbdb273cf30dc905cef80f378c20ae3f.jpg

7ee81585f567f9352d61546bec3be9e4.jpg

上图中的设计原理如下:

  • CounterType: 采用硬件时钟并关联到硬件Timer
  • Counter Tick Per Base: 每100个硬件TimerCounter触发OS Counter 累加
  • Seconds Per Tick: 1us, 为了增加OS调度速度,精度不宜过小

任务管理

✦✦ 基础任务

基础任务英文缩写为:BCCtask,主要包括以下特性:

每次启动都会从程序开始执行到程序结束

没有等待状态

可以被其他任务抢占,但不会自主进去等待状态

基础任务会在以下下情况下停止运行

  • 任务结束
  • 被高优先级任务抢占
  • 被中断抢占(中断优先级高于任务)

9e191126f535e6d4bfe2d2ad8ad2a84b.jpg

✦✦ 基础任务示例

如下图所示为基础任务的配置示例:

e133108f98bc32c11aa5c18d7f147d9d.jpg

上图中:

TaskActivation 是指同时只允许一次任务激活

Priority 指任务优先级, 高优先级任务可以抢占低优先级任务(如果低优先级任务配置成支持抢占类型)

Schedule 设置为不支持抢占

Stack Size 设置为1K (根据当前任务所需要Stack进行设置,如果Stack产生Overflow,OS会在任务切换时报错挂死)

Type 类型为 Basic Task(基础任务)

下图为配置的Task的代码示例:

8c9b63c60efbd497bdae21aef76efd89.jpg

✦✦ Event

Event 主要用于扩展类型任务的触发执行(从Waiting状态到Run状态)

  • 每个扩展类型任务可以关联多个事件
  • 任何任务或者中断程序都可以激活事件
  • 只有关联事件的任务可以等待和清除相关联事件

状态切换关系如下图所示:

3cc89fb7e0af95f6159d8f802f956b85.jpg

✦✦ 扩展任务

扩展任务经常是运行在while循环中的,一般不会结束,但视应用场景也可以结束。

扩展任务可以进入Waiting状态,待事件触发后,继续执行

可以被其他高优先级任务抢占,也可以自主挂起

扩展任务会在如下情况下停止运行

  • 任务结束
  • 被高优先级任务抢占
  • 被中断抢占 (中断优先级高于任务)
  • 自主挂起进入Waiting状态

e1ab631f8040dbfdc10af4ee3bc949b4.jpg

✦✦ 扩展任务示例

下图所示为扩展任务的配置示例:

58ff7f0a40fae76a9f6db8dc7245ee8a.jpg

上图中

TaskActivation 指同时只允许一次任务激活

Priority 指任务优先级, 高优先级任务可以抢占低优先级任务(如果低优先级任务配置成支持抢占类型)

Schedule 抢占

Stack Size: 1K (根据当前任务所需要Stack进行设置,如果Stack产生Overflow,OS会再任务切换时报错挂死)

Type: Extended

扩展任务的代码示例如下:

f8d8b4a54e23f2de7328ada203e0bd1a.jpg

任务调度

任务执行顺序由如下OS配置决定:

    • 任务优先级
    • 任务调度方式(FULL/NON抢占)
    • 任务激活方式,同时激活的任务按优先级排队执行,扩展类型任务可以由软件控制执行
  • - 任务切换时任务现场会保存再对应任务的TaskStack中,右侧下图TaskT2黄色部分为任务切换程序执行。抢占过多会造成任务切换过多导致CPURuntime的损失。

e4ce25609f955fba728544a6ed5ba839.jpg

任务同步与资源管理

任务同步管理用于管理多个任务共享的资源(数据和外设等),防止task1再读取共享数据的时候被task2改写。

常规方法包含 (ExclusiveArea Handling):

  • 开关中断 
  • Get/ReleaseResource
  • Get/Release SpinLock

ISR Management (中断管理)

中断服务程序再OSEKOS中具有高于任务的优先级

OSEK OS有两类中断:

Category1, 不要OS接管,不受OS中断优先级等管理
Category2,中端触发后,OS接管,受OS控制

54a9268c6677e29b65be4c60c10a7716.jpg

✦✦ 二类中断示例

aca33799e8e6cf0fca3c17426a2bffad.jpg

如上述代码所示,中断向量表不直接指定中断服务程序,而是指向Os_Hal_IsrRun程序由OS接管中断服务程序。

下文图表描述了中断服务程序抢占任务的示例。

fae3967ea4037633b7499211c202f4c8.jpg

Hook 函数和错误处理

414ce37629acc6d51bee04c860e42f7f.jpg

AUTOSAR 协议栈中OS的启动

AUTOSAR 协议栈中的OS启动如下图所示:

722d58f33d90db30306fc9ac7cacc5aa.jpg

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进入休眠模式

dc65a3fa7f3082ae0a2d5f402bbe2d87.jpg

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得到反馈数据结束处理

68516dfc2d748bad2b84cdd5e2cbc5ff.jpg

✦✦ IOC示例

下图为IOC(核间通信)的一个示例:

e3d5fe4320ab23a42970a2fb6b7152b4.jpg

原文链接:https://mp.weixin.qq.com/s/38EAPlb1-YEQMbH_SHCDnw

推荐阅读

1 阅读 694
推荐阅读
0 条评论
关注数
3796
内容数
89
本公众号是博主和汽车电子的行业的工程师们一起交流、探讨、思考的小结,以作为技术交流和沟通的桥梁
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息