AUTOSAR实现应用报文延时发送,保证唤醒首帧是网络管理报文的配置方法

文章介绍了在汽车CAN网络中,由于硬件过滤唤醒机制,需要对唤醒时应用报文的发送进行延时配置以确保网络管理报文能正确发送。基于AUTOSAR协议栈,通过DaVinciDeveloper进行BSWM规则创建,详细阐述了从创建ModeDeclarationGroup到配置BSWManagement的步骤,以及SWC代码中的实现策略,包括Sys_StateChangeCallback和Sys_delayOpenCanCommMainFunction函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 背景

二. 配置方法

三. SWC代码实现参考


一. 背景

1. 汽车CAN网络中,由于部分的CAN可能是私CAN连接(即网络上只有两个节点),并且对端节点使用了支持硬件过滤唤醒的CAN收发器(如1145等),那么如果主动唤醒的ECU发送的首帧报文是应用报文,是无法唤醒对端ECU的,那么总线上体现为错误帧,如果ECU一直重发这一帧的话,那么就会导致总线上一直是该错误帧,继而无法发送出网络管理报文来唤醒对端ECU

2. 部分车厂会要求唤醒时,应用报文需要在网络管理发出至少xx毫秒才能发出,来保证对端ECU有足够的时间启动完毕并且接收每条应用报文的首帧。

因此,在项目开发的过程中,有必要对唤醒时应用报文的发送进行延时的配置,本文基于vector的AUTOSAR协议栈进行思路以及配置的分享。

实现思路主要是通过在BSWM创建规则,SWC根据当前网络管理的状态判断是否需要进行发送延时,进行报文的收发控制。

二. 配置方法

1. 打开对应工程的DaVinci Developer,单击Object Browser,在Mode Declaration Groups->New Mode Declaration Group…

 2. 按照如下配置TxDisable/TxEnable的值,并且将TxDisable设置成初始值

 3. 打开对应工程的DaVinci Developer,单击Object Browser,在Application Port Interfaces->Application Port Interfaces->New Mode Port Interfaces…

 4. 输入端口的名字(如果有多路CAN需要配置延时规则,那么命名最好带上对应CAN的名称作区分)

5. New创建,并且选择上面创建的Declaration Group,配置完成后点击确定即可。 

注意:如果有多路CAN需要配置应用报文延迟发送规则,那么需要配置多个Mode Port Interface

 6. 在网络管理控制相关的SWC上,右键->New Port Prototype…->New Mode R-Port Prototype

 7. 在对应的RunnableAccess Points中,加入对应的Send Mode SwitchesRead Sent Mode,至此, DaVinci Developer的配置完成,点击保存即可

8. 打开对应的DaVinciConfig的界面,在BSW Management中,在Mode Switch Ports右键,Add Mode Switch Port

9. 选择SWC中建立的对应的BSW模式控制的接口

 

 10. 点击Mode Notification Port右键,Create Mode Notification Port…

 11. 参考如下的配置,配置初始值为TxDisable

12. 在发送的规则中,点击第2点处对Rules进行修改 

 

13. 按住新增加的控制规则,拖拽至右侧

14. 设置为等于TxEnable模式,点击Finish即可。即可设置该路CAN的发送规则为,当CanTxControl SWC写成TxEnable之后,才会发送CAN报文

注意:如果重新自动生成BSWM Rules时,其会提示是否删除对应手动创建的Rules,我们不要勾选,否则就会把我们手动建立的Rule删除了。

 

15. 在最后一步需要将SWC的模式控制的接口和BSWM进行连接,选中需要连接的接口,右键Connect 

16. 选择对应的BswM端口进行连接即可

 17. 完成以上配置之后,即可进行BSWSWC的代码生成

三. SWC代码实现参考

#define DELAY_OPEN_CAN_COMM_TIME           (200/10)   //延时时间按照此进行调整
boolean g_isCanCommOpen = FALSE;
boolean g_isNeedDelayOpen = TRUE;

/**
 * @description: 
 * @param {NetworkHandleType} nmNetworkHandle
 * @param {Nm_StateType} nmPreviousState
 * @param {Nm_StateType} nmCurrentState
 * @return {*}
 */
void Sys_StateChangeCallback(const NetworkHandleType nmNetworkHandle, const Nm_StateType nmPreviousState, const Nm_StateType nmCurrentState )
{
    if((nmPreviousState == NM_STATE_PREPARE_BUS_SLEEP || nmPreviousState == NM_STATE_BUS_SLEEP) \
       && nmCurrentState == NM_STATE_REPEAT_MESSAGE)
    {
        g_isCanCommOpen = TRUE;
    }
    else if(nmCurrentState == NM_STATE_PREPARE_BUS_SLEEP || nmCurrentState == NM_STATE_BUS_SLEEP)
    {
        g_isCanCommOpen = FALSE;
        g_isNeedDelayOpen = TRUE;
        Rte_Switch_PiComTxCommControl_Mode(RTE_MODE_ComTxMode_TxDisable);
    }
    else
    {
        /*do nothing*/
    }
}

/**
 * @description: 
 * @return {*}
 */
void Sys_delayOpenCanCommMainFunction(void)
{
    static uint8 u8DelayCnt = 0U;

    if(g_isCanCommOpen == TRUE && g_isNeedDelayOpen == TRUE)
    {
        if(u8DelayCnt < DELAY_OPEN_CAN_COMM_TIME)
        {
            u8DelayCnt++;
        }
        else
        {
            u8DelayCnt = 0U;
            g_isNeedDelayOpen = FALSE;

            Rte_Switch_PiComTxCommControl_Mode(RTE_MODE_ComTxMode_TxEnable);
        }
    }
}

1.Sys_delayOpenCanCommMainFunction需要放在轮询的Runnable中调用(如10msRunnable中)

2. Sys_StateChangeCallback需要放在Nm的状态切换回调里面调用(不知道如何配置Nm状态切换的回调可以参考下图

附:

如果对应的CAN还存在时间同步报文Master的角色,那么还需要单独增加代码控制时间同步报文的发送,因为时间同步报文不属于应用报文,所以不受COM模块的控制,上述配置的BswM Rule无法对其发送起到控制作用。

控制方法:可以通过CanTSyn_SetTransmissionMode控制时间同步的开关(可放在上一步代码实现中对BswM进行开关的代码处)

注意:该API的第一个传参是CtrlIdx,指的是CanIf模块的CtrlId,并非CanTSyn的索引。

以上就是本文分享的全部内容。

### 在AUTOSAR架构下的上电初始化周期报文发送方案 为了满足在 AUTOSAR 架构下实现上电后一次性发送所有周期报文并确保总耗时不超过 5ms 的需求,可以采用以下设计思路: #### 设计核心概念 1. **NM管理机制** NM(Network Management)协议提供了快速传输状态的支持,在特定场景下允许短时间内以高频次发送多个来完成网络同步。此特性可以通过调整 NM Immediate Transmit State 来实现高频率的初始广播[^1]。 2. **Com模块动态调度支持** Com 模块具备灵活配置的能力,能够通过设置不同的发送延时时间来适应各种复杂的需求。这种能力可用于优化周期性消息的一次性触发行为[^2]。 3. **RTE接口调用与任务优先级提升** 利用 RTE 层提供的 API 接口直接控制各信号/报文发送时机,并结合 OS 中的任务优先级设定,保障这些操作能够在限定时间内完成。 #### 具体实施步骤描述 以下是基于以上理论的具体技术手段及其细节说明: - #### 配置短周期模式启动阶段 定义一个新的运行条件或者扩展现有逻辑路径使得系统刚加电瞬间进入一种特殊的短期工作方式——即所谓的“Fast Initialization Mode”。在此期间内按照最小可能间隔重复输出全部待激活PDU直到预设时限结束为止。 ```c void EnterFastInitMode(void){ uint8_t i; for(i=0;i<MAX_PDU_COUNT && GetTickCount()<=FAST_INIT_DURATION_MS;i++){ SendPeriodicMessage(i); // 调用函数逐一发出每一个需要处理的消息实例 } } ``` - #### 设置合理的超时保护策略 添加全局变量记录当前所处的状态以及剩余可用毫秒数以便及时退出循环防止过载风险发生。同时也要考虑到硬件资源占用情况合理分配CPU执行权给其他重要子程序共享使用。 - #### 细化每条链路参数调节选项 对于那些本身基础周期较长的数据流则单独设立例外规则减少其参与此次集中爆发过程的机会从而降低整体负载压力水平达到预期目标效果。例如原本规定每隔一百毫秒才需更新一次的位置传感器读数值现在只需简单保留原始默认值即可无需额外动作介入其中干扰正常流程运转节奏。 ```xml <PduTriggering> <SHORT-NAME>PduTrig_Example</SHORT-NAME> <START-VALUE>TRUE</START-VALUE> <TIMEOUT-ACTION>STOP_ON_TIMEOUT</TIMEOUT-ACTION> ... </PduTriggering> ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值