30,657
社区成员
发帖
与我相关
我的任务
分享目录
当COM层接收到IPDU后,对上层RTE的通知通常有两种方式
--》**Update bit配置和检测,用于信号(信号组)级的通知和超时管理(无需配置)**
当发送端设置了Update bit,COM层会自动填充Update bit (UB)位一次(注意是一次,即每调用一次发送,总线上只会呈现一次带有Update bit位更新的IPDU!后续都是update位没更新的IPDU)接收端便会检测Update bit,若检测到则继续后续的信号处理(字节序转换、无效检查、过滤等)。
否则丢弃信号停止后续的信号处理。接收端应用按照需求设置信号(信号组)的超时。
--》**Notification的配置,用于IPDU级别的通知和超时管理(需要配置超时)**
若信号没有配置UB,则可以通过配置信号的notification,用于报文级别的超时通知;
**---》信号组**
为了支持复杂数据类型的AUTOSAR概念,AUTOSAR COM提供了信号组的解决方案。AUTOSAR COM模块一致地发送和接收信号组,为复杂数据类型提供必要的一致性。通俗的来讲,Signal Group就是一个IPDU里面的几个Signal的集合,这几个Signal的操作需要保持一致性;时分秒到来,需要组合到来同时更新才有意义,否则独立的数据获取将会失去意
**---》Shadow buffer**
AUTOSAR COM模块为每个Tx Signal和Rx Signal都设有一个Signal Buffer。为了实现信号组内容的一致性(统一获取),为每个Signal Group额外设置了一片Signal Group Buffer,即Shadow buffer。在发送Signal Group的时候(接收同理),将Signal Group拷贝到IPDU Buffer的时候是独立操作(不可隔离)(拷贝前关闭全局中断,拷贝后打开全局中断,保证拷贝过程不被中断干扰)。
Shadow buffer确保了Signal Group数据的一致性。
由下图可以看出,关于接收过程大致分为
Step A.Com_Rxindication接收到IPDU
Step B.对IPDU内每一个信号,信号组实施字节序转换、无效值处理等
Step C.最后一步实施信号(信号组)的通知,由COM层通知给RTE层。

协议栈实现框图如下:
Step 1: 收到Com_Rxindication
Step 2: 处理Signal A信号(UB、大小端转换、无效数据处理等)
Step 3: 处理Signal A信号 notification
Step 4: 按照Step 2\3 依次处理Signal B/Signal C 等PDU报文内的所有信号
和相关信号对应callback(通知RTE)
Step 5: 同理按照step2-4,依次PDU报文内的所有信号组及信号组对应callback(通知RTE)
步骤关键解析点:
---》收到IPDU后,协议栈是按照每个信号(信号组)去处理接收和进行callback的。
---》先处理IPDU所有的信号,再处理IPDU所有的信号组

根据 本文2.2章节中的协议栈步骤描述
在配置信号(信号组)notifacation(包括收到信号的通知、超时通知)的时候,若**配置不当**,容易导致在报文内信号(信号组)的并没有接收完整(前一部分信号收到,后一部分信号、信号组数据尚未收到),就认定报文已经收到,而**应用去读取时候,其实读取到的还是上次的数据。**
需遵循以下规范
---》若一个报文内只有信号,建议notification配置在最后一个信号内(按配置工程中的信号index大小,配置在index最大的信号);
---》若一个报文内既有信号,又有信号组,需要将notification配置在最后一个信号组(按配置工程中的信号组index大小,配置最后一个信号组,index最大);
