AUTOSAR LIN通信协议栈怎么保证NM报文先发送的?

前言
最近在研究autosar通信协议栈的时候产生了以下几个问题:
(1)lin数据由linif的调度表触发发送的话,com怎么控制lin类型的pdu停止和发送了?
(2)怎么保证nm报文先发送的?
本文先梳理一遍通信协议栈的一些关键概念及重要机制,然后回答这些问题。
正文
1.lin报文的发送机制
lin报文的发送机制在<>一文中已经详细讲解过,这里再简单回顾下。
lin报文的周期发送是通过调度表实现的,而lin调度表存在于linif模块,linif模块在周期调用调度表的时候通过callback的方式实现ipdu的trigger transmit,也就是向上获取到sdu数据,然后调用lin_sendframe发送报文。调度表中的报文都是需要周期发送处理的报文,对于偶发sporadic frame的发送,com --> pdur -->canif_transmit中设置发送flag,实现偶发帧发送。我们这里主要讨论lin周期报文的发送机制。
linif模块实现lin调度表中报文的周期发送,且所有报文都是通过调用pdur模块的pdur_triggertransmit的callback函数完成sdu数据的获取。
linif模块调用pdur_liniftriggertransmit函数来获取pdu数据,如果获取数据成功,则调用linif_sendframe往lindriver发送数据,如果获取数据失败则不会发送lin报文。
那也就是说,如果找到pdur_liniftriggertransmit返回失败的原因也就找到了linif停止发送报文的原因。
继续往下分析pdur_liniftriggertransmit函数,pdur_liniftriggertransmit --> com_triggertransmit
分析com_triggertransmit函数
com_triggertransmit函数会首先会检查pdu所在的pdugroup是否started了,如果没有started,则com_triggertransmit函数返回e_not_ok。、
也就是说如果pdu所在的pdugroup没有started则com_triggertransmit返回e_not_ok,pdur_liniftriggertransmit返回失败,则linif_manifunction_不会往lindriver发送数据。
2.nm报文和app报文的发送
如果我们使用can网络管理的话,那么can网络管理报文由cannm模块控制发送,而应用报文的发送是由com模块和comm模块协同管理发送的,那么问题就来了:
nm报文由cannm模块控制发送,app报文由com/comm模块控制发送,那么我们怎么保证每次上电/reset后nm报文首先发送到总线上去了?
autosar标准里面没有规定nm报文和app报文谁先发送出去的配置。但是nm模块提供了一个
std_returntype nm_getstate(
networkhandletype nmnetworkhandle,
nm_statetype* nmstateptr,
nm_modetype* nmmodeptr
)
接口可以获取当前nm模式和状态,如果我们在请求comm到fullcom前先确包nm模式进入到network状态的话,那么nm报文一定会在app报文之前发送出去。
example:
nm_statetype nmcurrentstate;nm_modetype nmcurrentmode; nm_getstate(commconf_commchannel_commchannel_can_network_0,&nmcurrentstate,&nmcurrentmode);if(( nm_mode_synchronize == nmcurrentmode )||( nm_mode_network == nmcurrentmode )){ comm_requestcommode(commconf_commuser_commuser_can_network_0,comm_full_communication); comm_requestcommode(commconf_commuser_commuser_can_network_1,comm_full_communication);}  
3.问题回答
问题1:lin数据由linif的调度表触发发送的话,com怎么控制所有lin报文所在的pdu的停止和发送了?
答:linif通过linif_mainfunction --> pdur_liniftriggertransmit --> com_triggertransmit获取lin报文的pdu数据,如果获取失败则不会调用linif_sendframe发送报文。而com_triggertransmit函数在获取pdu数据时首先会检查pdu所在的pdugroup是否started,如果没有started则com_triggertransmit返回e_not_ok,最终linif_mainfunction停止往驱动发送报文,也就停发lin报文。也就是说,我们通过bswm调用com模块提供的com_ipdugroupstart,com_ipdugroupstop同样能控制lin报文的停止和发送。
问题2:怎么保证nm报文先发送的?
答:需要手写代码或者通过bswm模式控制和仲裁实现。具体就是在请求app报文所在network进入到fullcom之前确保nm模式已经进入了network状态。


对抗三星OLED面板 JDI将推可挠式液晶面板
关于中国市场软件定义网络趋势的分析
小米6和vivoXplay6评测对比,谁更值得买?
西典新能登陆上交所
中兴通讯事件还在继续 美国政府又将对华为动手
AUTOSAR LIN通信协议栈怎么保证NM报文先发送的?
5G套餐大变样!价格崩盘跌至9元低门槛
CPLD和FPGA这两者到底有什么区别呢
基于3D打印技术的MEMS加速度计的设计
为何U盘经久不衰?看完进化版的USSD固态U盘,你就知道了
浅谈6项LED用稀土荧光粉国家标准项目
什么是PCSEL?如何兼顾边发射与面发射的优点
影响人工智能发展的是哪三个核心技术?
探讨物联网软件的未来展望
医疗无人机的使用,为药物、疫苗、器官等的紧急运输提供了更好的选择
吸收浪涌的电容和电阻选择
荣耀9上市最新消息:国产福利荣耀8降价,给即将到来的荣耀9让路嘛?
使用双极性结型晶体管(BJT)和NMOS晶体管的稳定电流源
网络安全密钥忘记了怎么办
视频监控哪一种模式比较受欢迎