【Zeekr_Tech】汽车软件RTOS-之AUTOSAR OS多核控制简介
极氪软件及电子中心 jojo
实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。
与实时操作系统对应的就是非实时操作系统了,例如Linux(可以通过给内核打上RT补丁使其变为实时操作系统),windows。这类操作系统将系统处理机时间和内存空间按照一定的时间间隔,轮流地切换给各终端用户的程序使用,会给低优先级进程分一些运行时间,避免高优先级重负载任务把键盘鼠标控制台桌面之类堵死。
实时操作系统有很多如μCos、FreeRTOS、Vxworks、QNX、Osek os。AUTOSAR的core OS就是OSEK,他早已广泛应用于汽车工业。OSEK源于德语,是一种嵌入式操作系统,被设计用于提供整车的各种电子控制单元的软件系统。AUTOSAR OS 向后兼容OSEK OS,基于OSEK OS 扩展了一些特性和需求,比如内存保护(memory protection)和时间保护(time protection)等。
OS-Application是AUTOSAR OS 的重要的功能单元, 负责收集操作系统对象,如Tasks, ISRs, Alarms, Schedule tables, Counters等。
AUTOSAR_SWS_OS规范中7.6章节对AUTOSAR OS的框架定义。其中包含:
序号 |
操作系统对象 |
作用 |
1 |
APPLICATION |
OS-APP,负责收集操作系统对象 |
2 |
SCHEDULETABLE |
调度表 |
3 |
ALARM |
报警器,一般用于在操作系统运行过程中,可进行实时的报警周期设置,典型的用于功能安全相关的调度机制 |
4 |
COUNTER |
计数器 |
5 |
TASK |
周期任务 |
6 |
ISR |
中断任务,响应外部和内部事件触发的中断 |
7 |
ErrorHook |
当软件运行遇到Error,调用hook |
8 |
StartupHook |
当软件上电且需要从boot进入到操作系统之前,往往需要调用hook,完成启动操作。 |
9 |
ShutdownHook |
软件下电且需要退出操作系统,往往会调用hook,跳转到shutdown完成下电操作。 |
如果在系统中使用OS-Application,则所有的Task, ISR, Counter, Alarm, Schedule Table都必须属于某一个OS-Application 。
接下来我们来聊聊AUTOSAR操作系统中的多核处理。AUTOSAR中的多核操作系统并不是一个虚拟ECU概念,而是一个共享相同配置和大部分代码的操作系统,但是不同的核上进行不同的运算。操作系统的生成部分的相关信息来源于同一个配置。这意味着,ID(例如TASKID、RESOURCEID…)在核之间是唯一的。任务的优先级定义来源于调度表的配置。因此多个内核可以真正并行运行,可以同时执行多个任务。
- Startup阶段。初始化MCU,每个核完成EcuM_Init() (AUTOSAR定义功能),且每个核完成StartOS。
- 运行阶段。从启动模式切换到操作系统运行模式,完成OS:Startuphook,并开始操作系统的运行,e.g. 10ms, 100ms等周期性任务开始运行。
- Shutdown阶段。从OS运行模式切换到下电模式。下电关闭程序由BswM和EcuM协调。所有核上的EcuM都表明它们已经准备好了关闭,EcuM在主内核上调用shutdownallcore(),完成整个ECU的下电。
在AUTOSAR OS中具体的分配策略有如下几种:
1)ChainTask链任务机制
什么是ChainTask机制,AUTOSAR规范中又是如何定义的呢?一个链任务由几个任务组成,每个链任务OS-Mechanism相互激活。所以不同的任务可以按照定义的顺序在不同的核上执行。
例如下图所示。左边是单核芯片core X,右边是双核芯片core Y和core Z。
原来任务Task A是单独在单核芯片core X上运行, Task A => proc1(); proc2(); proc3(); proc4()。当把Task A拆分为两个任务Task A’和Task A’’ 并且分别在2个单独的核core Y和core Z上运行时,链任务ChainTask机制确保,流程顺序是与任务A一样,在不同的内核中运行。
跨核task又是如何开销ChainTask呢?例如下图所示。拿1ms任务举例,首先Core X触发OS_BswStart_1ms_Task任务,由于链任务的作用,直接跨核到Core Y执行OS_1ms_Task,执行完后又通过链任务跨核回到Core X执行OS_BswEnd_1ms_Task。这种任务链的缺点会开销runtime,比如1ms的任务,2次的来回的Chaintask,大约会开销2x30us的负荷,约占6% runtime。
2)分布式运行机制
分布式运行机制,AUTOSAR规范中解释为”task clusters are freely distributable”。该分布式运行机制是当前AUTOSAR多核分配方式的主流,task在一个核上运行,不存在跨核之间的链任务,耦合性不高。缺点是容易造成不同核之间的负荷不均。如下图所示,某一个双核的控制器Core X运行所有CAT1 的中断,Core Y运行所有的周期性任务,不存在跨核间的调度,所有的任务都在自己的核上单独运行。
操作系统的运行时间可以通过优化减少数据的访问时间来实现。如下图举例。某个3核的MCU,Core0为Peripheral Core,Core 1为Locked Core,Core 2为Performance Core。每个core都有单独的RAM分别为RAM0,1,2,同时通过总线外部挂有system Ram。通过下图可以发现当core1访问自己的RAM1只需要1个tick的时间,而core1访问core2的RAM需要9个tick的时间。同时访问外挂system ram需要9个tick的时间。
由此可见,当代码运行在特定的内核上,尽量把该段功能所属的变量定义在相同的RAM上,以便优化核减少运行时间。我们在做功能开发的时候特别需要关注变量的分配和任务的分配,使其尽量保持一致,以便减小MCU的开销。优秀的软件工程师通过优化内存,可以降低10%左右的负荷。
AUTOSAR的软件架构已经成为汽车电子控制领域不可逆转的趋势,当前国内不少车企,已经把非AUTOSAR软件架构的电子控制器供应商排除在供应商目录之列。同时随着汽车电子芯片的飞速发展,用于AUTOSAR Classic的MCU也发展迅猛。迅速从单核跨入到多核时代,主频和内存空间也有了大幅度的提升。很多车型已经集成了基于AUTOSAR的软件架构和多核芯片的控制单元,以满足日益复杂的电子电器架构。目前,极氪的软件及电子中心正在开发下一代行业顶尖的ZEEA3.0电气架构平台,其中的中央计算平台CSC(Core Super Computer)包含A核和M核,A核上运行由极氪自研的ZEEKR_OS ,M核上将运行Classic AUTOSAR OS来实现多核处理,因此本文介绍基于AUTOSAR OS和多核控制芯片的控制策略,帮助大家尽快理解基础软件的运行架构。