q1、prepare bus-sleep mode进入network mode条件
a1:can网络管理中,prepare bus-sleep mode进入network mode可以通过三种方式,如下所示:
由cannm_rxindication()方式进入,即:在pbsm(prepare bus-sleep mode)下收到网络管理报文方式进入;
由cannm_passivestartup()方式进入。调用cannm_passivestartup()接口,表明网络需要被动唤醒,收到网络管理报文也属于被动接收,和cannm_rxindication()方式进入不一样吗?这里说一下个人理解:在pbsm模式下,ecu依然有接收报文的能力,如果接收到nm msg,可以通过cannm_rxindication()接收,唤醒网络;如果收到特定的应用报文(比如:包含kl15信号的应用报文)或者诊断报文,也想把网络唤醒,显然非网络管理报文不会通过cannm_rxindication()接口接收,如果想让非网络管理唤醒网络,此时就可以让上层主动调用cannm_passivestartup()接口,进而唤醒网络;
由cannm_networkrequest()方式进入,同cannm_passivestartup()方式,此方式也属于上层请求行为。不同于cannm_passivestartup()方式,此方式表明当前节点需要通信,需要主动唤醒网络。比如前面提到的一种情况:vfc置位时,即可主动调用cannm_networkrequest()接口进入rms状态。
q2:can dlc与实际发送数据长度关系
a2:dlc(data length code),一帧can报文中,发送数据的长度,用4个bit表示。
对于classical frame,dlc的长度有效范围为0~8,对应的发送数据长度为0~8 bytes,如果dlc长度≥8,则发送数据长度为8 byte。
对于fd frame,dlc不仅可以等于0~8,还可以等于9~f,对应的数据长度分为12、16、20、24、32、48、64。如下所示:
对于classical frame,如果设置dlc = 4,实际在总线上传输的数据长度是4 byte还是8 byte?答:4 byte。虽然可以这样设置,但是工程实际中,很少这样用,一帧报文只传输4个数据或者更少,会降低有效数据负载,效率低。
注意:假设传输一个classical frame,虽然总线只传输4 byte数据,但是can模块消耗的硬件资源(ram),实际是8 byte(eg:tc3xx)。
发送一帧can报文,对应一个tx buffer element,在tx buffer element中,根据发送can报文的类型决定消耗的db(data buffer)大小,如下所示:
一帧can报文消耗多大的db呢?db空间的消耗,由txesc.tbds决定,因此,db最小需要8 byte。如下所示:
什么意思呢?就是在硬件配置阶段,即使配置dlc = 4,但是一帧can报文也必须消耗8 byte的硬件ram资源。而数据发送到总线时,只发送4 byte的数据。
q3:$3e 80发送时机
a3:$3e 80的主要作用在于维持节点的会话状态,即:将节点维持在非默认会话。工程中,基于uds软件升级过程中,tester或者gateway节点会使用功能寻址周期性发送$3e 80。何时发送$3e 80更合适呢?
本文主要想讨论$36服务过程中,何时发送$3e 80更恰当。软件升级过程中,一个$36 block会发送大量数据,即:多帧传输,在多帧传输的过程中,发送一个$3e 80是否可行?答:可以,但是会带来风险。为什么这样说呢?多帧传输过程,一般使用物理寻址,针对特定节点升级,在多帧传输的过程中,发送一帧功能寻址的$3e 80,且中断接收,如果处理3e 80的中断例程耗时过多,导致连续帧会被延迟处理,连续帧被延时时间过长会导致接收丢帧的问题,即:下一个连续帧覆盖被延时处理的连续帧。以500kbps通信的经典can为例,如果允许上位机/gateway节点连续发送,1ms内可以发送三帧报文,也就是说:如果接收端没有在300us左右的时间内处理完连续帧,就可能会导致连续帧覆盖的问题,即:接收端接收丢帧。
如上,讨论一种工况:
t0时刻,接收端中断收到$2a xxxx...(接收完成),进入中断例程处理$2a xxxx...数据(主要是通知上层copy数据);
t1时刻,接收端中断收到$3e 80,进入中断例程处理3e 80数据;
t2时刻,接收端中断收到连续帧$2b xxxx...,由于同一中断(均是接收中断,优先级一样)正在执行,2b xx xx...数据暂时不能处理;
t3时刻,3e 80数据处理完成,同时收到连续帧$2c xx xx...,如果$2b xx xx...和$2c xx xx...使用同一个硬件缓存区,会导致连续帧$2c xx xx...覆盖连续帧$2b xxxx...的工况。所以,为避免接收丢帧,接收缓存区一般会配置多一些,一般工程中会将资源全部使用或者用fifo方式接收。
理想工况,这种连续帧插入3e 80的行为不会出现问题(中断例程不要处理大量逻辑),但在工程实际中,偶尔会遇到并行发送功能寻址$3e 80,导致连续帧发送问题的bug。
一般在处理多帧发送过程中,如果上位机或者gateway节点发送功能寻址的$3e 80,会选择在连续帧结束时(发送完最后一帧连续帧)发送。
注意:需求中,有时会约束$36服务的p4 server_max为5000ms,即:只允许接收节点(server)回复一个nrc0x78,为什么呢?如果s3超时时间设置为5000ms,且$3e 80放在连续帧的最后发送,当前block传输用时接近5000ms,如果再不发送一帧$3e 80,则其他节能可能会因s3超时回到默认会话。
从互联网巨头变阵看中台战略,中台战略对企业的影响
智能交通的实现有什么意义
Bridger开发气体测绘激光雷达改变石油和天然气行业管理方式
苹果将在iPhone手机中加入充当汽车启动钥匙的选项功能
华为开发者大会:软件开发小白的华为云云上初体验
CAN DLC与实际发送数据长度有何关系
美联全高清光纤矩阵先进的接口自定义技术
超甜!基于自主高端科学仪器,“量子侠侣”发布重要科研成果!
苹果公司透露2019年将推出最强Mac Pro
浅析如何利用CAN在汽车设计中降低功耗
如何打造爆款儿童智能机器人
深圳巴士集团通过人工智能图像分析技术实现精准OD客流统计等业务场景
发电机中性点接地电阻柜的结构特点说明
中国联通eSIM一号双终端业务将扩展至全国
iPhone必走成阅读器
传感器节点支持智能建筑和智能交通的物联网
不要问扫地机器人有没有必要买吗?看完你就懂了
如何对扬声器驱动电路进行测试
解析如何解决水表计量器不准的问题
电磁继电器的参数种类和选用方法