为什么要用确定性执行?主要是功能安全的需求:如高度自动驾驶的系统需要满足 ASIL-D。为了满足 ASIL-D 的要求,高度自动驾驶系统需要采取特定的措施,特别是软件锁步,因为目前是没有 ASIL-B 以上的硬件。还有就是 HPC 的瞬态硬件错误率非常高,所以系统需支持可预测性和可靠性。利用确定性执行可以保证软件行为的可预测性和可重现性。所以,在对功能安全有一定要求以及它使用这种 HPC 的时候,我们需要考虑使用确定性执行。
在 CP AUTOSAR 4.3 以及在 AP AUTOSAR 1810 之前,AUTOSAR 在概念设计和开发流程上是没有任何确定性相关的内容。为了实现安全上的一些要求,AUTOSAR标准在 CP 4.3 和 AP 1810 之后,加入了确定性相关的内容。
接下来我们对 AP AUTOSAR 中的确定性进行一个深入解析。
三、AP & 确定性执行
AP 中与确定性执行相关的模块只要是执行管理,下图为执行管理模块中的确定性执行交互概览图:上图中应用层中有用户进程,用户进程会调用确定性客户端的 API 实现确定性执行。确定性客户端 Class(在代码中是以 C++ Class 的形式存在) 是由执行管理来提供的。EM 中还有一些跟执行客户端相关的 Class,本文重点研究确定性客户端,执行客户端不做深入探讨。在 AP 中的实现确定执行主要也是通过确定性客户端这样的一个 Class 来实现。确定性客户端主要包括以下内容:1. 控制进程的内部周期2. 确定性的 Worker Pool(工作程序池)3. 提供激活时间戳以及随机数
Worker Pool 是一个锁定 API,它是在进程执行周期内使用的 ,它通过使用不同的线程,不同的工作池来加速软件的一个执行。
Worker Pool 是由进程的主线程调用 API
触发的
。
Worker Pool 调用完之后,它的一个呈现形式是进程池,进程池中有多个 Worker。它跟主线程之间是没有并行性。Worker Pool 的工作时会注册以下内容:1. Worke2. Worker Runnable Object3. 参数 Object 需要说明的是 Worker 会有多个,多个Worker组成了 Worker Pool,Worker Pool下面是 Worker Runnable Object,它只有一个。需要注意的是多个 Worker 之间是不允许进行一个数据交换的。
周期确定性执行:随机数
接下来分享一下确定性的随机数。这个随机数是根据确定性算法生成的,所以它生成的随机数是伪随机数。它有会提供一个 Get 随机数的函数,供用户调用。
这就是随机数主要的作用,一是算法中可能会用到
随机数粒子过滤器
。
另一个考虑确定性执行,我们需要将冗余进程以及用户进程之间的随机数种子进行同步。
有两个地方会提供 Get
Random
随机数 API,一个是确定性客户端 Class,一个是
Worker 线程 Class。当用户进程去调用 GetRandom 时,它使用的是确定性客户端提供的 API 。
Worker 调用的是
Worker 提供的
Get Random,当
Worker 调用完
Get Random 后,
它会使用 Container 迭代器,然后将随机数分配给特定的 Container 元素,Container 就是参数 Object,参数 Object 之间它会有迭代。
Worker 调用 Get Random 之后,它会将随机数分配给特定的某一个元素,来去保证确定性冗余执行。至于我们的用户进程也是一样的,用户进程中的非冗余进程中的 Worker 调用 Get Random 随机数,拿到那个随机数也是需要给到特定的 Container 迭代,然后去把它的参数进行使用等这些。
LET(逻辑执行时间) 如何在 CP 开发中使用,如下图所示:如上图所示,一开始的架构设计与 CP 传统流程一样,架构设计后就需要考虑使用 LET 模型进行一个计算,主要干的一件事情就是仿真 LET 的一个配置,这个跟 LET 相关的。接下来就是使用工具产生调度结果:包括实时内核配置等等,然后去对调度结果进行一个验证等等这些。添加微信”btighteast”加入微信交流群(仅限专业人士,添加备注单位+姓名)