如何实现不同任务周期AUTOSAR RTE读写值的同步?
AUTOSAR不同周期SWC通过Sender Receiver Interface同步解决方案
方案1:使用触发式Sender Receiver Interface
- 核心逻辑:让Receiver端的Runnable不再按固定15ms周期执行,而是在Sender端完成数据写入后被触发执行,确保读取动作紧跟写入动作,直接拿到最新值。
- 配置要点:
- 在ARXML中将Sender Receiver Interface的类型设置为
Triggered; - 给Sender端的Runnable绑定
DataSendPoint,触发数据发送事件; - 给Receiver端的Runnable绑定
DataReceivePoint,并关联上述触发事件; - 确保Receiver任务的优先级足够高,能及时响应触发,避免被低优先级任务阻塞。
- 在ARXML中将Sender Receiver Interface的类型设置为
方案2:版本戳+缓冲校验机制
- 核心逻辑:通过给数据附加递增版本号,让Receiver端能精准识别是否有新数据写入,避免读取旧值。
- 具体实现:
- 在SR接口中新增一个用于存储版本号的Data Element(比如
DataVersion,类型为uint32_t); - Sender端每次写入业务数据时,同步递增版本号并写入:
void Runnable_SWC1_10ms(void) { static uint32_t data_version = 0; MyDataType tx_data = generate_target_value(); // 生成待发送的特定值 Rte_Write_MyData(tx_data); Rte_Write_DataVersion(++data_version); } - Receiver端读取时先校验版本号,仅当版本号更新时才读取并处理业务数据:
void Runnable_SWC2_15ms(void) { static uint32_t last_read_version = 0; uint32_t current_version = Rte_Read_DataVersion(); if (current_version > last_read_version) { MyDataType rx_data = Rte_Read_MyData(); process_received_data(rx_data); // 处理新数据 last_read_version = current_version; } }
- 在SR接口中新增一个用于存储版本号的Data Element(比如
方案3:配置Data Element的On Change更新模式
- 核心逻辑:利用AUTOSAR RTE内置的数据更新检测机制,让Receiver仅在数据实际变化时才执行读取操作。
- 配置与实现:
- 在ARXML中设置目标Data Element的
Update Mode为On Change; - Receiver端的Runnable中,先通过
Rte_IsUpdated_MyData()检查是否有新数据,再执行读取:void Runnable_SWC2_15ms(void) { if (Rte_IsUpdated_MyData() == TRUE) { MyDataType rx_data = Rte_Read_MyData(); handle_new_data(rx_data); } } - 注意:该特性依赖AUTOSAR工具链的支持,需确认你的开发环境是否兼容。
- 在ARXML中设置目标Data Element的
方案4:周期对齐(业务允许时)
- 核心逻辑:如果业务逻辑允许,将两个Runnable的周期调整为最小公倍数的公约数(比如统一为15ms或30ms),从根源上避免周期不匹配导致的同步问题。
- 适用场景:SWC1的10ms周期并非硬性要求,或者SWC2的15ms周期可以调整。
内容的提问来源于stack exchange,提问作者user2986042
相关产品推荐
相关产品推荐

