• 175查看
  • 0回复

[底层软件] 再探Rte之Runnable间通信

[复制链接]


该用户从未签到

发表于 25-4-2024 19:46:58 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


之前我们在<<Rte中的接口类型介绍和使用>>一文中介绍了SWC之间的通信方式(如sender/receiver或者client/server等)。本文我们将研究单个SWC内部的runnable entity(运行实体)间的通信。在autosar中为了实现数据封装和隐藏,规定了runnable之间使用IRV(Inter Runnable Variables)的方式进行通信。RTE不支持SWC间使用IRV之间通信。与SWC间的sender/receiver接口类似,IRV也存在隐式(implicit)和显示(explicit)两种方式,隐式也是将数据先缓存在ram中,保证runnable执行过程数据的一致性。在配置IRV时需要配置其读写的runnable。这个时候我们还需要考虑我们的runnable可能运行在不同的task,那么如何保证多个runnable间的数据一致性或者可以调用同一个不可重入函数呢?autosar提出了Exclusive Area来解决这个问题。RTE通过ExclusiveArea来实现保护机制(加锁)。在auosar中有两种Exclusive Area:canEnterExclusiveArea和runsInsideExclusiveArea。前者负责对某个代码段加锁,后者将整个runnable进行加锁。锁的类型可以是关闭所有中断、关闭所有OS中断、resourece和spinlock等,如下图所示。
再探Rte之Runnable间通信w1.jpg

当锁的类型配置为关闭所有OS中断(OS_INTERRUPT_BLOCKING)时,生成的伪代码如下所示。/*canEnterExclusiveArea*/#define Rte_Enter_ExclusiveArea_1() (Rte_SuspendOSInterrupts() )#define Rte_Exit_ExclusiveArea_0() (Rte_ResumeOSInterrupts() )/*runsInsideExclusiveArea*/#include"Rte.h"TASK(TASK_COOP_10MS){  SuspendOSInterrupts();  Rte_Runnable_myComponent_EvMyRunnable10ms_Start();  myRunnable();  Rte_Runnable_myComponent_EvMyRunnable10ms_Return();  ResumeOSInterrupts();}

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 1-2-2025 07:48 , Processed in 0.244634 second(s), 32 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.