Autosar Os降低CPU负载的方案总结

2023-12-13 14:50:48

一、背景

在使用Autosar的项目中,经常会遇到CPU Load过高的情况。CPU Load过高往往会导致task调度不准,CAN/LIN报文周期抖动。于是如何降低CPU Load就成了一件迫在眉睫的事情。

那么我们究竟可以从那些方面来优化降低CPU 负载呢?

二、CPU 负载优化手段

1、ComStack优化

在Autosar项目中,如果我们的ECU作为网关,那么Com Stack会占用大量的CPU资源。因此对ComStack优化就非常有必要。实际项目中实测可以降低15%左右的CPU负载(可能每个项目实际情况不一样,仅供参考)。

1.1、ComMainFunctionTx拆分

在实际项目中,不同的报文发送周期可能不尽相同。如果所有的报文都在一个Com MainFunction中处理,那么不仅没有必要,还会增加该Com MainFunction所处的task的负载,其jiter过高时还会造成其他task无法及时被Os调度。因此建议将ComMainFuntionTx进行拆分,不同周期的报文放在对应的ComMainFunction中处理,如下如:

1.2、使用Rx/Tx Signal Group+ComXf序列化

我们知道CAN报文的接收都会由中断触发,如果大量的报文notification Com,那么会造成同一个PDU的所有信号的解析更新时间增加。因此我们将signal放到group中处理,这样可以减少中断的执行时间,减少中断对普通task的抢断。(注意:不过需要注意的是,单独使用signal Group并不能优化性能,还需要配合ComXf序列化一同使用,这样可以让Com层把报文视作一段连续内存数据进行处理。报文格式注意字节对齐。

1.3、根据实际需求打开Com优化选项

(1)如果CAN矩阵表中没有定义update信号位,该功能可以关闭,优化接收/发送执行时间。设置如下图所示:

(2)若没有信号的TransferProperty属性使用了该功能,可以关闭,如下图所示:

(3)SWC在RTE Write发送TxSignalGroup时,各个信号值更新时无需进行加锁(没有外界中断或其他SWC会干扰该信号的值更新),优化发送执行时间。

(4)打开 Signal中的ComNotification

当Rx信号接收到的时候,会触发中断并在中断中完成数据传递:Can -> CanIf -> PduR -> Com -> Com_CbkRxAck_Array() 数据拷贝到RTE 中间变量,Rte read时可以直接读取RTE 中间变量,而无需调用Com_ReceiveSignal。这样可以减少SWC RTE read执行耗时。

2、RTE优化

2.1、中断锁优化

BSW各个模块在进入和退出Exclusive areas时会执行开关中断,但All Interrupt Blocking执行流程比较长,会消耗大量的加锁,解锁处理时间,建议可以使用EB Fast Lock。

2.2、调整Rte中各个task的offset

让各task的调度分散开。(注意:同一个task内各个runnableoffset值应当一致,否则会出现周期混乱。

3、SRAM优化

3.1、打开DTCM

加快访问RAM的速度,减少task的执行时长,也能在一定程度降低CPU Load。

3.2、打开DCache和ICache

在部分项目中,优化这个效果明显(注意:Cache的变量不能跨核)。

4、DET优化

DET会有一定的资源占用,在正式发布的版本中,DET应当关闭。

5、中断优化

一些模块中如果有一些Debug功能产生中断,在正式发布的版本中应当关掉。因为不必要的中断会导致task调度,从而增加CPU开销。(注意:中断中不能有耗时操作,建议使用扩展任务解决,参考:Autosar CP 操作系统详解-CSDN博客 中的2.6章节)

三、总结

由于各个项目的实际场景不尽相同,可能需要有针对性的对症优化。如果你还有别的一些优化手段欢迎留言交流。

文章来源:https://blog.csdn.net/rwlsh/article/details/134969750
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。