Autosar Os降低CPU负载的方案总结
一、背景
在使用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内各个runnable的offset值应当一致,否则会出现周期混乱。)
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章节)
三、总结
由于各个项目的实际场景不尽相同,可能需要有针对性的对症优化。如果你还有别的一些优化手段欢迎留言交流。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!