AUTOSAR全系列200讲(二)-AUTOSAR 架构 Runtime 分析以及优化_优先级

一直以来想写一篇关于基于AUTOSAR 架构 Runtime 分析以及优化的文章,但是感觉方法很多可是又过于具体和依赖实际软件架构,所以很难抽离出一套万能的方案

但是,很多内容是可以复用的,鉴于此,本文只介绍Runtime优化的思路,并不会列举出具体的方案,


再写本文时,本想画几张图,避免过于理论,但是实在是太难用图形合理表达所有的内容,所以只能全部是文字了


Runtime 分析指标

平均负载

在任意时间段内,CPU Load 最好低于90%,意味着CPU需要有10%的空闲时间

单点负载

是否每个Cyclically Task 都能按照预定义的周期执行,不会出现执行延迟,执行丢失的情况。最好的情况是无论任何情况,都不会有Task/Event 的延迟,丢失。如果在某些特别的情况下存在Task/Event 的延迟,丢失,则需要评估丢失次数,延迟的时间是否是在可接受的范围内


平均负载用来评估是否所有的功能都有机会被执行到,但是不能保证所有功能都能按照既定周期执行,因此还需要引入针对单点负载的评估。

假设有个功能执行时间过长(同步执行5ms才可以完成),就会导致在这段期间(5ms)内其他OS TASK 因无法获取时间片而无法得到执行。比如CAN Message 发送周期紊乱


Runtime测试方法

平均负载

可以定义一个优先级最低且可以被抢占的TASK, 目的是当系统出现空闲时可以执行这个TASK,通过使用Runtime分析工具监控这个TASK在一段时间内执行的时间占总体的百分比就可以得到平均负载


IDLE_TASK

{undefined

   While(True){}

   TerminateTask()

}

单点负载

针对单点负载测试就比较麻烦了, 需要逐步缩小排除范围,一般分为如下几步

1.使用Runtime 分析工具监控每个Task/ISR 每1ms 所占用的时间以及所占整体比例,建议监控10~100 次的时间消耗

TASK & ISR

执行时间

比例

100us

10%

300us

30%

500us

50%

IDLE TASK

100us

10%


当有了分析结果之后,我们针对执行时间占比大的Task 需要更深入的分析,分析到每个FUNCTION的执行时间,如下,假设有Task A 中4个function需要执行,我们需要分析每个Function执行时间的合理性,是否有优化点

TASK A

{undefined

FUNCTION1 ()

FUNCTION2 ()

FUNCTION3 ()

FUNCTION4 ()

}


2.基于5ms/10ms/20ms/50ms/100ms 这些关键的周期时间点进行runtime 测试,因为很多AUTOSAR MainFunction 都是按照5ms 的整数倍周期进行调度的,通过此种方式查看是否存在某个时间点执行过多功能的可能性


Runtime 解决办法

一直以来Runtime问题都是个棘手的问题,难分析,难定位,难解决,在加上每个ECU 都有独特的需求和处理方式,因此很难形成一套固定的解决方式, 本文只是提出一些解决问题思路,具体还要结合项目的实际情况

1.在满足需求的情况下增加调度周期,比如从5ms~10ms, 此种方式属于通过精度换性能

2.分析调度周期的合理性,比如报文的周期最短是10ms, 那么就没有必要1ms去查看一次是否收到了。总之,用最合理的时间去完成功能


3.将一些可以被延迟的功能放在低优先级甚至可以被抢占的TASK 中运行,比如NVM 读写操作 / DCM 诊断功能 ,但是在OS 设计时需要充分考虑如果抢占发生,是否存在数据冲突的风险,


4.某些同步功能是否可以用异步方式解决,将一个大块的执行时间分拆成多个小部分执行,同时将这些小部分分散到多个ms time Slot执行, 比如数据加密功能


5.可以将基于同一时间基数调度的函数增加不同的offset, 防止在同一点爆发,比如COM_MainFunctionTx / COM_MainFunctionRx 虽然都是10ms 调度, 那么可以增加初始的offset 可以保证他们不再同一ms内被调度,通过这种方式可以尽可能的平均每1ms 所执行的时间


6.多使用Basic Task, 少使用Extended Task


7.多使用Polling 方式,少使用OS Activate/ OS SetEvent


8.尽量减少Com_SendSignal/Com_ReceiveSignal 的调度次数


9。增加Tx message Offset 使得TX报文 不再同一time slot中被发出


10.当RAM 足够时,可以考虑用RAM 消耗 换取Runtime 消耗 (用空间换时间)


总之,Runtime 的 优化是一个系统的工程,对于OS 设计需要非常考究,既要保证Runtime优化的同时,又要保证Task 调度,抢占发生时仍能保证功能的一致性和数据的一致性。