我们知道使用COM模块提供的统一API接口可以很简单的发送一个信号,那么你知道执行了发送信号后,是立即发送还是周期发送呢?
在进行COM模块配置时,涉及到signal和I-PDU的配置。每个signal有一个ComTransferProperty 属性,可以设置为如下值:
每个I-PDU有两个ComTxModeTrue和ComTxModeFalse可设置,其子项可以配置ComTxMode,如下:
先了解几个前提概念:
发送模式条件TMC: 他是信号的发送滤波机制,但是和接收不同,他不丢弃信号,只用于计算TMC的值,滤波机制可以配置为ALWAYS、NEVER、MASKED_NEW_EQUALS_X、MASKED_NEW_DIFFERS_MASKED_OLD、MASKED_NEW_DIFFERS_X、NEW_IS_WITHIN、NEW_IS_OUTSIDE、ONE_EVERY_N。
发送模式选择 TMS:是I-PDU下每个信号的TMC做或运算所得到的结果,是TRUE/FALSE;
COM模块接收到发送信号请求时,会将I-PDU的所有信号按照设置好的滤波计算每个信号的TMC,再讲所有TMC做或运算,得到TMS结果。这个TMS结果就会对应ComTxModeTrue还是ComTxModeFalse。
换句话说,底层发送肯定是PDU形式的,那么只要其中一个信号要发送,则一个PDU就要发送,所以TMC是或运算,而TMS提供了用户或运算后两种结果的执行动作而已。最后发送的模式逻辑关系是信号的TransferProperty和ComTxMode所配置的值来决定的。
在<AUTOSAR_SWS_COM.pdf>手册中,给我们介绍了几组示例,我们一起来看看:
![](https://i-blog.csdnimg.cn/blog_migrate/55ae50c192b9c0f23acb3413b980bc73.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fe60965b3129bc2f0728ce7ca064446b.png)
示例1:很简单,在周期模式下,无论信号配置为PENDING or TRIGGERED, 实际上信号都在周期点进行发送。这说明了I-PDU的ComTxMode优先级是更高的。
![](https://i-blog.csdnimg.cn/blog_migrate/2319a224519209199e84d8dc289b88b3.png)
示例2:引入了tr和dt参数,从图中可以看出分为3个部分对比演示:
1,DIRECT模式配合信号设置的触发属性,目的是触发到了直接发送,但是要注意tr时间,是要等待COM主函数周期的延迟,等待COM主函数调用时才会触发。这个并不难理解。注意下ComTxModeNumberOfRepetitions 设置的是2,实际发送个数是2+1;
2,如果此次触发是在上次触发的重复周期内,那么实际是等待tr后立即发送,并且上次还没有发完的信号不再继续了,依据当前的触发进行2次td周期的发送。注意第四个td的两侧都是绿色箭头。
3,信号的发送除了等待tr的时间也要等待dt最小发送延迟的时间。注意倒数第二个td的两侧是蓝色箭头起始和绿色箭头结束。
这个示例细节在于两个注意上,如果新的触发离前一个信号的时间是大于dt PDU最小发送时间,那么新的周期td计算是以绿色箭头也就是实际发送的时刻为开始计时的。如果是小于dt,则是以tr结束后为开始计时的。我分析和代码实现有关,此示例模式下,信号从COM请求能直接发送才是最理想的,但是有tr和dt的限制,为了靠近理想只能将dt给考虑进去,tr不行的,因为tr是COM主函数的周期延迟,只有主函数执行到了,才会去处理个更新整个COM下的逻辑状态,这个tr相当于是COM执行的最小单元不能在快了。
上面的分析在以下示例出现都是相同的分析,后面不再提了。
![](https://i-blog.csdnimg.cn/blog_migrate/65a1e075e6872b213d5a65cada721230.png)
示例3:对比示例1,可以看出来TMS的优先级是更高的,尽管都是周期的模式,TMS状态改变,信号是跟着改变的,并且会维持当前的状态。
![](https://i-blog.csdnimg.cn/blog_migrate/3a2efbf0de7a23e0f74705f2d5919411.png)
示例4:将DIRECT和PERIODIC模式进行交叉演示,其中如果当前TMS是TRUE,那么将保持周期模式,如果TMS是FALSE,将执行DIRECT模式。a情况最后触发的是FALSE,设置的是DIRECT,所以最后发完就不发了。b情况最后是周期模式的,所以会持续周期发,也就是说PDU的发送总是保持上一个发送逻辑的状态。
![](https://i-blog.csdnimg.cn/blog_migrate/6f4937cd87b6287fe9c5709fb7ddc8cc.png)
示例5: MIXED模式当然是结合了两种情况的特点,当周期发送过程中,如果有新的触发发送请求,则立即触发送,DIRECT模式发送结束后则持续周期发送,只不过注意,从DIRECT切换到周期的时候,周期发送的时间是参照本身周期模式的时间的,并不是在DIRECT结束后的时间点继续计算的。这里可以将MIXED理解为“叠加”状态。
![](https://i-blog.csdnimg.cn/blog_migrate/c19b910117abe6c2583b03b3aee831f8.png)
示例6:这个要告诉你的是当前的发送模式永远是保持当前TMS选择的状态,也就是TRUE还是FALSE; 同时对比示例2,在相同TMS选择状态下,tc的起始时间才有可能以tr时刻计时,如果发生了TMS切换,则以绿色箭头实际发送时刻为基准。
![](https://i-blog.csdnimg.cn/blog_migrate/99745f0f760e0c2db15553c4539c5e6f.png)
示例7:a\b\c的对比告诉我们,并不是tr和dt永远都是参照最新已发送的信号基准点的,混合发送模式下,从周期切换到DIRECT时,是不用等dt的,同时从DRIECT切换到周期模式时,也不用等dt的;但tr是永远都要等的,因为主函数的有效调用才是实际的执行嘛。