我是AUTOSAR
com模块的新手。我想执行一些场景来检查CAN FD中的特定消息。在这里,我想阻止除一条消息(eg: ID: 0x22
)以外的在某些事件发生期间的所有eg: ID: 0x22
消息。
我的想法是循环所有CAN FD
PDU
ID并检查相应的消息ID(0x22
)。这里的问题是,我必须遍历所有CAN FD
PDU
ID。(如果FD是200
,则必须循环200
时间。)
我想知道,除了AUTOSAR环境中的一些消息之外,是否还有其他好的方法来阻止所有的CAN FD
消息?还有我要阻止这个PDU的地方?它是在COM
模块还是CANIf
模块?如果我的理解是错误的,请纠正我。
发布于 2022-09-07 00:00:23
您可以尝试在SystemDescription/厄瓜多尔EcuExtract中创建几个Tx ISignalIPduGroups。将每个ISignalIpdu分配给相应的ISignalIPduGroup。然后,您可以启用/禁用必要的ISignalIPduGroup。
例如:
IPduGroup_Tx_A - CommunicationDirection=OUT
ISignalIPdu_Tx1
ISignalIPdu_Tx2
IPduGroup_Tx_B - CommunicationDirection=OUT
ISignalIPdu_Tx3
ISignalIPdu_Tx4
IPduGroup_Rx_B - CommunicationDirection=IN
ISignalIPdu_Rx1
ISignalIPdu_Rx2
IPduGroup_Rx_B - CommunicationDirection=IN
ISignalIPdu_Rx3
ISignalIPdu_Rx4
您可以直接在Com上触发它。
void MyCdd_MainFunction(void)
{
if (cond_tx_a == TRUE) {
Com_IpduGroupStart(COM_IPDUGROUP_TX_A, TRUE);
} else {
Com_IpduGroupStop(COM_IPDUGROUP_TX_A);
}
if (cond_tx_b == TRUE) {
Com_IPduGroupStart(COM_IPDUGROUP_TX_B, TRUE);
} else {
Com_IpduGroupStop(COM_IPDUGROUP_TX_B);
}
if (cond_rx_a == TRUE) {
Com_IpduGroupStart(COM_IPDUGROUP_RX_A, TRUE);
} else {
Com_IpduGroupStop(COM_IPDUGROUP_RX_A);
}
if (cond_rx_b == TRUE) {
Com_IPduGroupStart(COM_IPDUGROUP_RX_B, TRUE);
} else {
Com_IpduGroupStop(COM_IPDUGROUP_RX_B);
}
}
因此,当cond_tx_a == TRUE
启动IPduGroup_TX_A
,因此,ISignalIPdu_Tx1
和ISignalIPdu_Tx2
现在将被传输,但是ISignalIPdu_Tx1
和ISignalIPdu_Tx2
不会被发送,除非cond_tx_b == TRUE
。同样的情况也发生在IPduGroup_RX_A
和IPduGroup_RX_B
及其映射的ISignalIPdus上,但对于Rx,您实际上禁用了接收,但实际上是Rx ISignalIPdus的最后期限监视。
您也可以在无需编写直接代码的情况下在IPduGroups中配置BswM (参见configuration BswMPduGroupSwitch
)中的此类切换。
我们有一些OEM,其中所有的消息有一个分配给一个PowerSource,如果传输或不。
IpduGroup_PowerSource_PlusB
IpduGroup_PowerSource_ACC
IPduGroup_PowerSource_IG1
IPduGroup_PowerSource_IG2
我们从NetworkDescription中生成了一些规则,如果这些规则被映射到组中,它们会根据不同的情况自动启动/停止Ipdus。PowerStatus是BswM的输入。BswM现在甚至有BswMTimer支持。因此,你可以制定规则,例如:
3000ms.
BswM的好处是,它大多是配置好的,实际上没有手动编写一行代码。您甚至可以在POSTBUILD配置的情况下更新此配置。
https://stackoverflow.com/questions/73572473
复制相似问题