AUTOSAR基础篇之OS(下)

浏览:2382
作者 | 奋斗的农民工
来源 | ADAS与ECU之吾见
首先,请问大家几个小小的问题,你清楚:
-
你知道多核OS在什么场景下使用吗? -
多核系统OS又是如何协同启动或者关闭的呢? -
AUTOSAR OS存在哪些功能安全等方面的要求呢? -
多核OS之间的启动关闭与单核相比又存在哪些异同呢? -
。。。。。。
-
SC1: OSEK OS + Schedule Table; -
SC2: OSEK OS + Schedule Table + Timing Protection; -
SC3: OSEK OS + Schedule Table + Memory Protection; -
SC4: OSEK OS + Schedule Table + Timing Protection + Memory Protection;
-
现象: 任务1的运行时间超过其截止时间时,任务A本身可能并没有出错; -
过程: 在执行任务1之前的任务2频繁的抢占或者过长的阻塞资源的访问; -
原因: 正由于任务2的上述行为,进而导致任务1执行超时,从而直观的认为任务1发生错误便停止任务1,反而让真正的罪魁祸首任务2继续逍遥法外,这就不合情理,也起不到对OS中各任务的时间保护。
-
由于任务A优先级最高,因此任务A先执行; -
1个Tick之后任务B开始执行,3个Tick之后任务C执行; -
当任务C执行1个Tick后被任务A打断,任务A执行完毕后,任务C继续运行; -
到第10个Tick任务C执行完毕,周而复始,整个过程并未出现超时现象,并且仍有一个Tick的空闲状态;
-
任务A的第二个周期与任务B的第一个周期都出现运行时间过长的现象,但并没有超过其截止时间。 -
任务B在第二个周期提前进入运行状态,但也未超过其截止时间; -
任务C按照正确的方式运行,但由于任务A与任务B的出错导致任务C运行超时,则发生超时错误;
-
静态任务或者中断的执行时间上限; -
被低优先级任务锁住共享资源或屏蔽中断所引起的阻塞时间; -
任务或者中断之间的间隔执行时间;
-
时间保护仅仅用于任务或者二类中断,对于一类中断不起作用; -
在OS未开启之前,时间保护将不起作用; -
对于Trusted OS Application, OS应当有能力提供一种基于任务或者二类中断的时间保护,而对于Non-Trusted OS Application,OS必须提供为这个非信任的OS Application中的每一个任务或者二类中断提供时间保护;
-
即每一个OS Application和其中的OS Object都有各自的私有栈,不同的OS Object无需存在共享栈。栈保护能够更为快速的检测出栈溢出,同时栈保护也是划分OS Application的一种方式和依据。
-
每一个OS Application和其中的Objects都具备各自私有数据,同时OS Application的私有数据区就是从属于该OS Application的Objects的共享数据区;
-
代码区既可以被私有,也可以被共享,在没有代码保护的前提下,错误代码的执行会导致内存,时间和服务上的出错。
AUTOSAR多核OS启动与关闭
-
主核Core 0完成前期的硬件初始化之后启动从核Core 1 并随后调用Start OS函数来启动OS,OS完成初始化之后在第一个同步点等待所有从核完成OS的启动。 -
从核Core 1被主核启动之后,首先完成硬件相关的初始化,然后激活从核Core2,Core3,并在第一个同步点等待其余从完成OS的启动; -
从核Core2,Core3被Core 1激活之后,首先完成各自的硬件相关初始化,然后调用StartOS完成OS的初始化并在第一个同步点进行同步; -
在完成第一个同步点之后,主从核便分别执行Startup Hook函数之后在第二个同步点进行同步,然后所有核的Kernel将一起运行,只有这样才能够更好的保证整个系统的稳定性与鲁棒性。
-
反初始化BswM以及BSW调度器; -
检查是否存在唤醒事件发生; -
选择ShutDown Target; -
关闭OS;
-
AUTOSAR4.x不支持仅仅关闭单个核,即若发送关闭指令或者致命错误时所有核必须全部关闭,具体的关闭过程如上图所示; -
若某一任务拥有调用ShutDown All Cores的权限时,关闭信号将会同步发送至所有核; -
当关闭过程启动后,所有的中断服务和任务都不能被激活,关闭前必须完成的程序由EcuM保证完成; -
关闭完成前,各自的OS Application调用各自的Shutdown Hooks函数完成对应的回调程序,然后等待到同步点所有核执行关闭回调函数。
AUTOSAR多核OS调度
AUTOSAR多核OS通信(IOC)
-
接收端实体被周期性调用通过Rte_Receive从RTE接收来自Core0的数据; -
发送端调用函数Rte_Send函数发送数据,进而调用Ioc_Send函数写入数据到Buffer中; -
接收端便会通过Ioc_Read函数读取共享内存中的Buffer数据,并传递给到Rte_Read函数中供Core1中的SW-C使用。
-
Send/Receiver通信; -
队列或非队列通信; -
1:1通信;
-
发送端调用函数Rte_Call函数进而调用函数IocSend函数,将数据写入IOC内部队列缓存中; -
Rte_Call函数使用OS调用激活接受从核的服务任务来通知接收端; -
接收端被激活的该任务将负责调用IocReceive函数从IOC共享内存Buffer中读取数据并将数据传输至服务端的运行实体中; -
Core1中服务函数的结果会被反向传输至Core0的客户端中。
-
带通知的Send-Receiver通信; -
Client-Server通信,在此类情况下,RTE需要将服务转换为1:1的Send-Receiver模型通信,同时将服务结果反向传输到客户端的过程转换为另外一组Send-Receiver通信; -
队列或者非队列通信; -
1:1通信,如果接受端没有被周期性的调用; -
N:1通信;
-
报警器可以激活基本任务A或者设置某事件1; -
扩展任务B等待事件1那边可以激活基本任务C; -
基本任务C可以设置某事件2,中断可以设置某事件3; -
扩展任务D等待事件2和事件3之后便可以开启执行; -
基本任务E可以通过IOC机制实现与基本任务A之间的数据交互;

技术邻APP
工程师必备
工程师必备
- 项目客服
- 培训客服
- 平台客服
TOP
