CanIf篇

今天完整的看了下Vector的CanIf标准文档,记录一下学习成果。

  1. CanIf有四种状态:CANIF_CS_UNINIT、CANIF_CS_STOPPED、CANIF_CS_STARTED、CANIF_CS_SLEEP,组成枚举量为CanIf_ControllerModeType。用这四种状态来做CanIf层的状态切换,同时在不同的状态之间切换是根据Up layer的请求来切换的;对于Under layer来说通过调用CanIF_SetControllerMode函数对Can driver设置状态,Can driver调用Can_SetControllerMode对Hardware切换到对应的状态;由于Can协议栈有完整的通知机制,Can_driver层会调用CanIf_ControllerModeIndication函数向CanIf发送当前的状态通知。
  2. CanIf层还需要设置Pdu的状态,Pdu有八种状态:CANIF_SET_OFFLINE、CANIF_SET_RX_OFFLINE、CANIF_SET_RX_ONLINE、CANIF_SET_TX_OFFLINE、CANIF_SET_TX_ONLINE、CANIF_SET_ONLINE、CANIF_SET_TX_OFFLINE_ACTIVE、CANIF_NO_MODE_PDU_SET_MODE_TYPE_END;想要完成从上到下(Can driver-Pdu的通信,还需要调用CanIF_SetPduMode函数来设置CANIF_SET_ONLINE,完成Rx到Tx的设置并实现功能;
  3. CanIf和Can的状态都是通过状态机来控制的,需要注意的是CanIf和硬件没有任何关系,;
  4. CanIf的状态切换:Ecu reset之后会进入CANIF_CS_UNINIT状态,然后执行完CanIf_Init之后会进入CANIF_CS_STOPPED状态;还需要注意的地方是CanIf状态只能从STOP-START或者STOP-SLEEP不能从START-SLEEP!
  5. 对于Can通信来说还有一个最重要的功能是Busoff。从Can-CanIf流程如下,Can Hardware检测到Busoff会调用CanIf_ControllerBusoff函数然后在该函数内调用CanIf_SetPduMode函数把总线设置为Offline模式,然后调用CanIf_SetControllerMode函数设置为CANIF_CS_STOPPED模式,间接对Can设置为CAN_CS_STOP状态,等待Busoff恢复之后会从新设置为START模式。
  6. 发送流程:在想要通过CanIf层发送CAN消息之前,需要吧CanIf、PDU和Can的状态分别置为CANIF_CS_START/CANIF_SET_ONLINE/CAN_CS_START。然后调用CanIf_Transmit函数从CanIf层发送消息,该函数会调用Can_Write然后在Can_Write中会向Hardware查找Free的MBs,当前有Free的MB会返回TRUE(如果没有找到Free的MB会返回CAN_BUSY),在此处有两种情况:Interrupts:硬件发出去之后会进入Can__ISR_Tx()在中断函数中会使用AUTOSAR的通知机制,即调用CanIf_TxIndication()函数通知CanIf层消息已被正确发出,然后CanIf会继续往上边通知,还没学到,以后补充/ TODO */,至此整个发送流程已完成;
  7. 接收流程:首先Can Hardware通过中断接收到一帧报文(如果使用了硬件滤波,该报文需要通过硬件滤波之后才会被处理,软件滤波实在CanIf层进行筛选)把该报文数据拷贝到专用的Buffer,会在Can_*_ISR_Rx()中调用CanIf_RxIndication()函数向CanIf层通知收到一帧新的消息,在CanIf层会做一些Check,比如CheckSum和DLC Check等,具体需要在Davinci Config中配置,Check完成之后会传到Pdu层,根据协议进行数据拆分,进而把数据给到Com层分配给RTE接口供SWC使用;
  8. 简单说一下在Davinci Config中的一些配置吧,例如刚才提到的CheckSum功能是需要手动使能的,DLC Check也需要手动使能的同时定义需要Check的DLC的长度(CAN MAX Lenth is 8,CANFD MAX Length is 64),CanIf软件滤波也需要手动使能,同时还需要选择查找的方法,目前Davinci提供了三个:Binary(介于Linear和Double Hash之间的ID数量),Linear(少量的ID),Double Hash(大量的ID);
  9. 超时机制:CAN协议栈有两种超时机制:Update Bit和Timeout,顾名思义,Update Bit就是使用一个指定的Bit位来表明该消息是否是最新的,这种办法需要通信双方定义好哪一个Bit然后才能正确通信;Timeout就是使用定时器来定时,从接收该帧消息开始Reset timer,同时开始计时,直到接收到下一个同类消息,如果Timeout则进入超时逻辑,在Davinci中可以选择是Replace或者是None,Replace就是使用初始值代替,None就是保持原值,具体看软件需求;
    以上,今天的学习心得。
  • 11
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
防抖和节流是前端中常用的优化性能的技术,可以有效地降低浏览器的负荷。这里将简单介绍防抖和节流的概念,并提供几个示例代码,以供参考。 一、防抖 防抖(debounce)是指在一定时间内,多次触发同一个事件,只执行最后一次,以达到限制函数执行频率的目的。也就是说,防抖能够限制函数的执行次数,可以避免在短时间内频繁触发同一个事件导致程序崩溃。 1.1 示例代码 // debounce函数实现 function debounce(func, wait) { let timeout; return function() { const context = this; const args = arguments; clearTimeout(timeout); timeout = setTimeout(function() { func.apply(context, args); }, wait); }; } // 防抖函数使用示例 function handle() { console.log("scroll"); } window.addEventListener("scroll", debounce(handle, 1000)); 1.2 解释 在上述代码中,我们定义了一个debounce函数,并传入两个参数:一个是要执行的函数func,另一个是需要限定的事件触发时间wait。在这里我们使用了setTimeout函数,它会在wait毫秒后执行我们的func函数,如果再次触发事件,我们会使用clearTimeout()方法清除上一次执行的定时器,从而达到限制函数执行的目的。 二、节流 节流(throttle)是指在一段时间内,多次触发同一个事件,只执行一次,以达到限制函数执行次数的目的。不同于防抖,它可以使得函数定期执行,而不是一直等待到事件停止触发再执行。 2.1 示例代码 // throttle函数实现 function throttle(func, wait) { let timeout; let canRun = true; return function() { if (canRun) { canRun = false; func.apply(this, arguments); timeout = setTimeout(() => { canRun = true; }, wait); } else { clearTimeout(timeout); timeout = setTimeout(() => { func.apply(this, arguments); canRun = true; }, wait); } }; } // 节流函数使用示例 function handle() { console.log("scroll"); } window.addEventListener("scroll", throttle(handle, 1000)); 2.2 解释 在上述代码中,我们定义了一个throttle函数,并传入了两个参数:一个是要执行的函数func,另一个是需要限定的事件触发时间wait。在这个函数中,我们使用了canRun变量来控制函数可以执行的时间,在一个wait时间内,该变量的值为false,表示函数正在执行中,不会执行第二次。当wait时间过去后,我们才会将canRun设为true,允许函数再次被触发。如果在wait时间内再次触发事件,则会重置定时器,并再次等待wait时间后执行函数。 综上所述,防抖和节流是前端中常用的技术,可以避免频繁触发同一个事件而导致程序崩溃,提高页面性能和用户体验。在实际开发中,我们需要根据具体情况选择合适的方法来进行优化,以达到最佳的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值