AUTOSAR通信之CanIf模块简介2

发送请求服务canif的发送请求函数canif_transmit()是上层模块传输l-pdu的通用接口。上层通信层模块需要通过canif的服务启动传输,无法直接访问candrv。如果candrv能够将l-pdu数据写入can硬件传输对象中,则发起的传输请求成功完成。上层模块使用api服务canif_transmit ()来发起一个传输请求。
canif在调用服务canif_transmit()时对l-pdu传输执行以下操作:
检查,初始化canif的状态当使用多个candrv时,识别candrv确定访问can硬件传输对象的hth调用candrv的can_write()如果传输请求服务canif_transmit()返回e_ok,则传输成功完成。
如果一个l-pdu被请求通过一个pdu通道模式来传输,这个模式等于canif_offline,那么canif应该向det的det_reportruntimeerror()服务报告运行时的错误代码canif_e_stopped,而canif_transmit() 将返回e_not_ok。
发送数据流发送请求服务canif_transmit ()是基于l-pdu的。对l-sdu特定数据的访问按以下参数组织:
传输l-pdu =>l-sdu id引用包含l-sdu相关数据的数据结构:指向l-sdu的指针,指向元数据的指针和l-sdu长度。对l-sdu数据结构的引用被用作几个canif api服务中的一个参数,例如canif_transmit()或回调服务 ()。如果l-pdu配置为触发传输,则l-sdu指针为空指针。
图3 发送数据流canif会存储为传输而配置的硬件对象信息。函数canif_transmit()将cantxpduid映射到对应的hth,并调用函数can_write()。
如果总线镜像是全局启用的canifbusmirroringsupport(),并且通过调用can控制器的canif_enablebusmirroring()来激活,那么canif通过can_write()在控制器上传输每帧内容之前将其存储。只有在实际发送时,才提供总线镜像模块。因此,为了能够从canif_txconfirmation()将其提供给总线镜像模块,必须考虑存储内容。
发送缓冲在canif的范围内,传输过程从调用canif_transmit()开始,到调用上层模块的回调服务()结束。在传输过程中,canif、candrv和can mailbox一起存储l-pdu,只在一个位置传输一次。根据传送方式的不同,分为:
can硬件传输对象如果发送缓冲使能,发送l-pdu缓冲区在canif内。对于触发传输,canif只需要存储给定l-pdu的传输请求,而不需要存储它的数据。当hth空闲时,通过触发器传递函数及时获取数据。一个单独的发送 l-pdu,请求传输,永远不会被存储两次。这种行为对应于can网络上常用的周期性通信方式。
如果canif在传输请求时被candrv拒绝,canif将启用传输缓冲,并将在传输l-pdu缓冲区(canifbuffercfg)中存储一个发送 l-pdu。
基本上,用于缓冲发送l-pdu的整个canif中的缓冲区包含一个或多个canifbuffercfg。而每个canifbuffercfg被分配给一个或多个专用的canifbufferhthref,可以配置为缓冲一个或多个发送i-pdu。但是,在canifbuffercfg的总体数量中,每个发送 l-pdu只能缓冲一个实例。
在相应的发送 l-pdu配置中是否启用传输缓冲,canif在l-pdu传输期间对应的行为是不同的。如果发送缓冲被禁用,并且发送到candrv的请求失败,那么l-pdu不会被复制到can控制器,canif_transmit()将返回值e_not_ok。如果启用了传输缓冲,并且发送到candrv的请求失败,根据caniftxbuffer配置,l-pdu可以存储在caniftxbuffer中。在这种情况下,尽管无法执行传输,api canif_transmit()返回e_ok值。在这种情况下,canif通过canif_txconfirmation()回调和处理l-pdu未完成的传输,而上层不必重试传输请求。
传输canif 发送l-pdu缓冲区的数量,可以独立于can网络描述文件中定义的传输l-pdu的数量来配置。
发送l-pdu通过canifbuffercfg配置容器引用hth,如果不需要传输缓冲,也是有效的。在这种情况下,必须将canifbuffercfg的缓冲区大小设置为0,然后canifbuffercfg配置容器仅用于引用一个hth。
发送确认服务如果前一个传输请求成功完成,candrv会通过调用canif_txconfirmation()将其通知给canif。
如果对于can控制器,启用了全局总线镜像canifbusmirroringsupport和激活调用canif_enablebusmirroring(), canif将会调用mirror_reportcanframe()对每一帧传输控制器确认canif_txconfirmation(),提供存储内容和实际的id。
调用回调函数canif_txconfirmation()时,canif标识与成功传输l-pdu相连的上层通信层,通过调用canif的传输确认服务(e_ok)来通知其传输执行情况。回调服务()是由通知的上层模块实现的。
可以配置上层通信层模块,通过对不同的i-pdu或i-pdu组使用单个或多个回调服务来处理发送确认。所有那些服务在发送确认l-pdu传输请求时,会被canif调用。传输l-pdu允许分派与目标上层模块关联的不同确认服务,该分配是在静态配置期间完成。
一个发送l-pdu只能分配给一个发送确认回调服务。
如果启用了canifpublictxconfirmpollingsupport,那么每个can控制器的模式处于can_cs_started状态,canif将缓冲接收到的txconfirmation的信息。
接收指示服务根据autosar bsw架构,接收到的数据将在上层通信模块,即autosar com、cannm、cantp和dcm中进行评估和处理。这意味着,上层模块既不能使用candrv的缓冲区,也不能访问canif的缓冲区。只有当canifpublicreadrxpdudataapi设置为true时,canif才会在接收路径中提供内部缓冲。解决了发送缓冲问题,并考虑动态i-pdu。
如果接收到candrv l-pdu,则调用canif的canif_rxindication ()。对l-pdu特定数据的访问由以下参数组织:
硬件接收句柄(hrh)接收can标识符(canid)接收数据长度参考已收到的l-pdu接收到的l-pdu依赖于硬件,并分配给通信系统的最低层candrv。hrh是candrv和使用l-pdu的上层模块之间的链接。hrh标识can硬件接收句柄,接收新的can l-pdu。
在candrv调用canif_rxindication(),指示接收到的l-pdu后,canif将按照接收指示进行处理。canif无法识别candrv是使用临时缓冲还是直接访问硬件。它期望在调用canif_rxindication()时得到标准化的l-pdu数据。
can硬件接收句柄被锁定,直到复制到临时或上层模块缓冲区的过程结束。硬件对象将在canif的canif_rxindication()返回后立即释放,以避免数据丢失。
candrv、canif和属于接收到l-pdu的上层模块访问相同的临时缓冲区,该临时缓冲区可以位于can控制器的硬件接收对象中,也可以位于candrv中的临时缓冲区中。
图4 接收的信号流调用canif_rxindication()引用新接收到的l-pdu的参数,如果调用了函数canif_rxindication(),canif将对can l-pdu进行评估接收,并准备l-sdu供上层通信层访问。canif使用()通知上层模块这个异步事件,如果配置成功,并且检测到l-pdu进行处理。
如果总线镜像是全局启用的,并且通过调用can控制器的canif_enablebusmirroring()激活,那么canif应该为该控制器上用canif_rxindication()来表示的每一帧接收调用mirror_reportcanframe()。
如果调用函数canif_rxindication(),canif会按照指定的方式处理接收到的l-pdu。如果软件过滤拒绝接收到的l-pdu,canif会结束对canif_rxindicator()调用的接收指示。
如果canif在软件过滤过程中接受通过canif_rxindication()接收到的l-pdu, canif随后会处理数据长度检查。如果canif在数据长度检查期间使用canif_rxindication()接收l-pdu, canif将根据配置的数据长度的字节数复制到静态接收缓冲区。
如果为接收的l-sdu配置了元数据,canif将pdu有效负载复制到静态接收缓冲区,并将canid复制到类型为can_id_32的metadataitem。
在数据长度检查期间,如果canif接受通过canif_rxindication()接收到的l-pdu,canif会识别是否配置了目标上层模块(canifrxpduuserrxindicationul,canifrxpduuserrxindicationname),并为接收到的l-sdu提供接收指示服务。
如果目标上层模块被配置为提供接收指示服务,canif称之为配置接收指示回调服务canifrxpduuserrxindicationname,提供所需的参数上层通知回调函数的参数canif_rxindication ()。
canif在调用canif_rxindication()时执行以下步骤:
软件过滤(只有basiccan)数据长度检查缓冲接收l-sdu调用上层接收指示回调服务读取接收到的数据apicanif_readrxpdudata()是上层模块读取canl-sdu最近从can网络接收到的公共接口。上层模块只通过canif服务发起接收请求,而不直接访问candrv。发起的接收请求成功完成,canif将接收到的l-sdu写入上层模块i-pdu缓冲区。
函数canif_readrxpdudata()使得在不依赖接收事件的情况下读取数据成为可能。在配置时启用它,不一定为相同l-sdu配置接收指示服务。如果需要,可以启用接收指示服务。
通过这种方式的类型机制获得l-sdu,可以选择由参数canifrxpduuserrxindicationul和canifrxpdureaddata,在配置时根据上层模块的需求,相应的接收l-sdu。
如果配置参数canifpublicreadrxpdudataapi设置为true,则canif将接收到的l-sdu(在此情况下canifrxpdureaddata是启用的)存储到接收到的l-sdu缓冲区。这意味着,如果配置参数canifrxpdureaddata设置为true,canif必须为这个接收l-sdu分配接收l-sdu缓冲区。
在调用canif_rxindication()并通过软件过滤和数据长度检查后,canif将接收到的l-sdu存储在这个接收到的l-sdu缓冲区中。在调用canif_readrxpdudata()指定的接收l-sdu缓冲区时,canif应避免抢占接收l-sdu缓冲区的访问事件。
控制器模式控制服务canif提供用于控制由candrv支持的can控制器通信模式的服务。这意味着所有can控制器都由相应的api服务来控制,以请求和读取当前控制器模式。
可以通过调用canif_setcontrollermode()服务,来根据上层的请求更改can控制器状态。请求通过canif经过candrv api传递到指定的can控制器。在can网络上对所有can控制器的一致性管理是cansm的任务。通过这种方式,cansm负责将can网络的所有can控制器按顺序设置为睡眠模式或唤醒。
canif通过调用函数canif_setcontrollermode()或canif_controllerbusoff()接受每个状态转换请求。canif不决定can控制器请求的模式转换是否有效。canif仅通过获取当前模式和执行请求的模式转换来与candrv交互。
该网络相关状态机在cansm中实现。canif只存储请求的模式并执行请求的转换。
为了避免频繁请求candrv,可以对每个控制器存储canif_controllermodeindication()和can_getcontrollermode()所指示的最后状态。需要注意的是,不仅cansm能够请求can控制器模式的改变。根据cansm请求的操作模式,canif转发请求candrvs。
如果controllerid引用的控制器模式处于can_cs_stopped状态,并且如果canif_transmit()调用中的pduidtype参数被分配给该can控制器,那么canif_transmit()调用不会导致can_write()调用,而是返回e_not_ok。如果controllerid引用的控制器模式进入can_cs_stopped状态,canif会清除分配给can控制器相应的canif传输缓冲区。
如果controllerid引用的控制器模式进入can_cs_stopped状态,那么canif通过调用(id, e_not_ok)为分配给can控制器的每个未完成的txconfirmation,通知相应的上层模块传输失败。如果启用了canifpublictxconfirmpollingsupport,那么canif还会清除关于txconfirmation的信息。
这确保了对于每个pdu,都会调用一个正的或负的()。当调用回调canif_controllerbusoff(controllerid)时,canif调用cansm或cdd的cansm_controllerbusoff(controllerid)。

马云:用AI机器智能来进行风控,这才是真正的互联网金融
一加7Pro欧洲售价疑似曝光 最低699欧元起
2Ghz主频双核 三星11.6寸平板真机曝光
Lyft自动驾驶数据集公开!60G数据开放下载
CNC系统的组成及特点
AUTOSAR通信之CanIf模块简介2
EoPDH ASIC芯片的特点优势及应用模式分析
华为态度积极:别问,绿屏就换!
lwip协议栈源码详解说明
中国空间站持续开展大规模空间科学实验
无人机市场情况怎样?还存在哪些亟待解决的问题?
浅谈逆变器并网/离网逆变器
老牌厂商新机上架预约,自称真香
嵌入式uClinux的内核结构和开发环境
什么是硅片工艺
敢于三星S8争锋?如今也就非一加5莫属了
AD9371和ADRV9009射频端口硬件设计指南
波峰焊接中焊锡条锡渣的产生原因有哪些?
功率放大器的主要技术指标有
智能感测离子风棒,托起中国“智”造新高度