首页 > 其他分享 >[CP_AUTOSAR]_通信服务_CanTp模块(二)

[CP_AUTOSAR]_通信服务_CanTp模块(二)

时间:2024-07-20 14:59:26浏览次数:12  
标签:AUTOSAR 接收 函数 PduR 模块 CanTp SWS CP

目录


  在前面 《[CP_AUTOSAR]_通信服务_CanTp模块(一)》 一文中介绍了CanTp 模块的主要功能,以及与其它模块的交互关系。本文再接着介绍下CanTp 模块的功能方面的规范。

3、功能规范

  该章节描述CAN Transport Layer的功能,解释了CanTp 模块可以给上下层提供的服务,以及内部的行为操作。CanTp模块提供了消息流拆分、重组以及流控制的服务,以实现对超出一帧CAN报文的消息的发送和接收。如果规范中没有明确排除《ISO 15765 - 2网络层服务》作出的推荐内容,那么CanTp 模块就应该遵守ISO中的推荐。

3.1、提供给上层的服务

  CanTp的服务接口可以被拆分成如下两个部分:
  1、Initialization and shutdown
  2、Communication services
  下面的每一个段落描述了每个服务部分的功能。

3.1.1、Initialization and shutdown

  下面表格描述了CanTp模块在初始化和关闭过程中一些重要的功能需求。

需求描述
[SWS_CanTp_00027]CanTp模块有两个内部状态:CANTP_OFF 和 CANTP_ON;
[SWS_CanTp_00168]CanTp模块在上电之后应该是 CANTP_OFF 状态;
[SWS_CanTp_00170]当CanTp模块使用API CanTp_Init() 成功完成状态初始化时,应该改变内部状态为 CANTP_ON;
[SWS_CanTp_00238]只有在CanTp模块内部状态处于 CANTP_ON时,才允许执行拆分、重组消息的任务;
[SWS_CanTp_00030]CanTp_Init 函数可以初始化该模块的全局变量、并设置所有的传输层连接状态为 CANTP_ON,此过程中分段消息的接收和发送都没有进行;
[SWS_CanTp_00031]CanTp模块如果检测到错误,需要汇报出这个错误CanTp.CANTP_E_UNINIT,比如PDU Router 和 CAN Interface模块在CanTp模块完成初始化之前,去调用了任何的函数,但 CanTp_GetVersion-Info 函数除外;
[SWS_CanTp_00010]函数CanTp_Shutdown应该能够停止CanTp模块;

  下图对以上需求进行了总结

在这里插入图片描述

3.1.2、Transmit request

  上层发送数据的操作是通过函数 CanTp_Transmit() 来实现。
  下面表格描述了CanTp模块在数据发送过程中一些重要的功能需求。

需求描述
[SWS_CanTp_00176]CanTp_Transmit()函数是异步的(异步通信允许发送方在发送请求后,立即继续执行其他任务,无需等待接收方的响应。响应会在将来某个时刻通过回调函数、事件或消息队列等方式通知发送方。);
[SWS_CanTp_00177]在发送请求被接收之后,如果N - PDU传输完成或者失败了,CanTp模块应该去通知上层软件模块;

3.1.3、Transmit cancellation

  上层软件可以取消正在发送中的消息,比如上层接收了一个更高优先级的诊断请求,需要取消当前传输中的报文。
  下面表格描述了CanTp模块在数据发送过程中关于取消发送的功能需求。

需求描述
[SWS_CanTp_00242]静态配置中通过参数 CanTpTc 可以来激活该功能;
[SWS_CanTp_00274]通过调用函数 CanTp_CancelTransmit() 可以触发Transmit Cancellation;
[SWS_CanTp_00243]在调用函数 CanTp_CancelTransmit() 之后,数据传输即停止;

  在调用函数 CanTp_CancelTransmit() 之后,应该调用PduR_CanTpTxConfirmation() 接口函数,并且返回值应设置为 E_NOT_OK。

3.2、提供给下层的服务

  根据AUTOSAR 通信栈的规范,CanTp层应该可以提供两种回调函数的接口给到 CanIf 软件模块:CanTp_TxConfirmation() 和 CanTp_RxIndication()。

3.2.1、Transmit confirmation

  CanTp 层要求一条CAN报文成功发送之后,CanIf 模块应该调用CanTp_TxConfirmation()函数去通知CanTp 层。
  下面表格描述了CanTp模块数据发送确认的功能需求。

需求描述
[SWS_CanTp_00075]在最大时间(等于N_As)transmit confirmation仍没被接收,CanTp 模块应该停止相应会话。N-PDU也不能被其它会话所访问,直到TxConfirmation被成功接收或者没有被接收到;
[SWS_CanTp_00076]CanTp 模块提供 CanTp_CancelTransmit() 函数;
[SWS_CanTp_00355]CanTp_CancelTransmit() 函数返回值结果为 E_NOT_OK时,CanTp 停止相应会话;

3.2.2、Reception indication

  在一条新的CAN N - PDU帧被接收完成时,CanIf 模块应该调用接收显示函数来通知CanTp 层。
  下面表格描述了CanTp模块数据接收显示的功能需求。

需求描述
[SWS_CanTp_00078]对于接收显示来说,CanTp 模块需要提供 CanTp_RxIndication() 函数;

3.3、内部行为

  CanTp层的内部行为,为传输单帧或者多帧消息提供了最基本的机制,这些行为由事件来触发,以保证CanTp 可以处理来自于PDU Router模块的 N-SDU 数据的传输。

3.3.1、N-SDU接收

  

需求描述
[SWS_CanTp_00079]当接收单帧或者首帧的 N - PDU 时,CanTp 模块需要使用 PduR_CanTpStartOfReception 函数来通知上层(PDU Router模块),以便于上层保留并锁住一个缓存空间来接收;
[SWS_CanTp_00329]在函数 PduR_CanTpStartOfReception() 中,CanTp 需要借助于参数 TpSduInfoPtr 将单帧或者首帧 N - PDU中的内容提供给 PduR 模块;
[SWS_CanTp_00350]接收到的数据链路层数据长度(RX_DL)应该来自于CAN frame/PDU(CAN_DL)中的第一接收载荷长度:
1、CAN_DL小于等于8个字节时,RX_DL 值应该为8;
2、CAN_DL超出8个字节时,RX_DL 值为 CAN_DL 的值;
[SWS_CanTp_00166]接收块中的首帧或者最后一个流控帧时,在调用 PduR_CanTpStartOfReception 或者 PduR_CanTpCopyRxData 函数时,CanTp 模块应该开始 N_Br 的超时计时;
[SWS_CanTp_00080]在调用 PduR_CanTpStartOfReception() 函数服务时,在返回参数中,应该汇报给 CanTp 模块一个可用的 Rx 缓存空间大小,其尺寸应该要比期望的 N-SDU 数据长度小;
注意:由于某种错误或者是资源受限,上层无法制造出这样的一块Rx 缓存空间,PduR_CanTpStartOfReception() 函数需要返回BUFREQ_E_NOT_OK 或者 BUFREQ_E_OVFL。
[SWS_CanTp_00081]在接收单帧或者首帧之后,如果函数 PduR_CanTpStartOfReception() 返回值为BUFREQ_E_NOT_OK,CanTp 模块应该停止接收该 N-SDU。无需发送流控帧,并且也无需回调 PduR_CanTpRxIndication() 函数。
[SWS_CanTp_00318]在接收单帧之后,如果函数 PduR_CanTpStartOfReception() 返回值为BUFREQ_E_OVFL,CanTp 模块应该发送流控帧 Flow Control N-PDU,其状态为 (FC(OVFLW) ,并停止接收该 N-SDU。
[SWS_CanTp_00339]在接收首帧之后,PduR_CanTpStartOfReception() 函数中得到Rx 缓存空间比实际已经接收到数据尺寸要小时,尽管返回值为 BUFREQ_OK,CanTp 模块应该停止接收该 N-SDU,并且 PduR_CanTpRxIndication() 函数的返回值为 E_NOT_OK 。
[SWS_CanTp_00082]在接收单帧之后,如果函数 PduR_CanTpStartOfReception() 返回值为 BUFREQ_OK,但 Rx 缓存空间比下一个Block需要的小,CanTp 模块应该开始 N_Br 的计时。
[SWS_CanTp_00222]当计时器 N_Br 开始计时,在 MainFunction 函数处理过程中,CanTp 模块应该调用 PduR_CanTpCopyRxData(),其数据长度为0,数据缓存的指针为空指针。
[SWS_CanTp_00341]如果计时器 N_Br 过期,并且已有的缓存空间仍然不足,CanTp 模块应该发送一个新的等待流控帧(FC(WAIT)),去暂停接收 N - SDU,并且重载N_Br 计时。
[SWS_CanTp_00311]如果 N_Ar 超时发生,CanTp 模块停止接收 N - SDU,并且调用 PduR_CanTpRxIndication() (其返回值为E_NOT_OK)去通知上层这个失效。
[SWS_CanTp_00224]当 Rx 缓存空间足够大时,CanTp 模块应该发送流控帧 Flow Control N-PDU (其状态为 ClearToSend,表示可以一直发送连续帧),然后可以正常接收连续帧 Consecutive Frame N-PDUs。
[SWS_CanTp_00269]接收每一个连续帧后,CanTp 模块应该调用 PduR_CanTpCopyRxData() 函数,函数内指针 PduInfo 包含了数据缓存空间和数据长度。
[SWS_CanTp_00312]在每个连续帧接收显示(除了block中的最后一个连续帧)、每个流控帧发送确认时CanTp 模块应该应该开始 N_Cr 的超时计时,该时间能够初始化发送方的流控帧(FS=CTS)。
[SWS_CanTp_00313]如果 N_Cr 超时发生,CanTp 模块停止接收,并且调用 PduR_CanTpRxIndication() (其返回值为E_NOT_OK)去通知上层这个失效。
[SWS_CanTp_00271]在接收 block 中的连续帧之后,如果 PduR_CanTpCopyRxData() 返回值为 BUFREQ_E_NOT_OK, CanTp 模块停止接收 N - SDU,并且调用 PduR_CanTpRxIndication() (其返回值为E_NOT_OK)去通知 PduR 模块。
[SWS_CanTp_00314]在接收连续帧过程中,CanTp 模块应该去检查每个接收帧的帧序号(SN)的正确性,如果帧序号错误,那么CanTp 模块应该停止接收并且去调用 PduR_CanTpRxIndication()(函数返回值为E_NOT_OK)去通知上层这个失效。
[SWS_CanTp_00277]关于 FF N-PDU 首帧的接收,流控帧(Flow Control N-PDU)的内容取决于服务函数 PduR_CanTpStartOfReception() 的结果。
[SWS_CanTp_00064]而且,当接收 FF N-PDU,在有了PduR_CanTpStartOfReception() 的结果之后,再去发送流控帧。
[SWS_CanTp_00278]每个 FC N-PDU 都应该跟在 block 之后。
[SWS_CanTp_00067]在分割消息接收过程中,CanTp 模块应该使用相同的BS 和 STmin参数。在接收不同的 N - PDUs 时,这些参数才能够不同。
[SWS_CanTp_00342]当函数 CanIf_Transmit() 接收连续帧,并且其返回值为 E_NOT_OK时, CanTp 模块应该终止当前的接收连接。

   更多内容可参考 CP_AUTOSAR_总目录,点击跳转

标签:AUTOSAR,接收,函数,PduR,模块,CanTp,SWS,CP
From: https://blog.csdn.net/weixin_43722921/article/details/140567575

相关文章

  • 【最强八股文 -- 计算机网络 】网络层协议简单图解:ARP、RARP、DHCP、NAT、ICMP、IGMP
    网络层协议图解ARP(AddressResolutionProtocol):将已知`IP`地址转换为`MAC`地址RARP(ReverseAddressResolutionProtocol):将已知`MAC`地址转换为`IP`地址DHCP(DynamicHostConfigurationProtocol):动态获取`IP`地址NAT(NetworkAddressTranslat......
  • STM32被拔网线 LWIP的TCP无法重连解决方案
    目录一、问题描述二、项目构成三、问题解决1.问题代码2.解决思路3.核心代码: 四、完整代码1.监测网口插入拔出任务2.TCP任务3.创建tcp任务4.删除tcp任务五、总结一、问题描述最近遇到一个问题,就是我的stm32设备作为tcp客户端和上位机交互,如果在连接过程中网线......
  • DHCP协议
    DHCP-动态主机配置协议作用:用来为终端分配IP地址,并且对IP地址进行集中化管理的协议。是RFC1541(已被RFC2131取代)定义的标准协议,该协议允许服务器向客户端动态分配IP地址和配置信息。动态主机配置协议是现代词,是一个专有名词,指的是为计算机指定Internet协议(IP)配置的标准协......
  • keepalived绑定单播地址、非抢占模式及LVS的TCP模式的高可用【转】
    背景:keepalived默认是组播地址进行播放,且默认地址是224.0.0.18,如果配置多个keepalived主机,会导致虚拟IP地址存在冲突问题,这种问题怎么解决呢?解决办法:就是将keepalived主机的多播地址修改为单播地址,绑定固定IP地址,避免在多播模式下,通过VRRP进行广播地址,造成IP地址地址冲突。vrrp_......
  • DHCP协议-------动态主机配置协议
    一、DHCP概述作用:用来为终端分配IP地址,并且对IP地址进行集中化管理的协议。应用层协议;传输层使用UDP协议进行数据封装,端口号67/68,其中68代表客户端;67代表服务端报文类型DHCPdiscover:发现报文,用来发现网络中的DHCP服务器,使用的是广播报文。DHCPoffe......
  • DHCP协议笔记
    DHCP----动态主机配置协议作用:用来为终端自动分配IP地址,并且对IP地址进行集中化管理的协议。应用层协议;传输层使用UDP协议进行数据封装,端口号67/68,其中68代表客户端;67代表服务端。DHCP主要使用一下这8种报文类型来实现其功能:1.DHCPDISCOVER---发现报文,用来寻找网络中的DHC......
  • 《RISC-V CPU 处理器设计(上)》第2章——RISC-V架构之魂
    2.1简单就是美——RISC-V架构的设计理念2.1.1无病一身轻——架构的篇幅    1.关于RISC-V架构的文档可以到此网址下载https://riscv.org/technical/specifications/。2.1.2能屈能伸——模块化的指令集     2.RISC-V架构相比其他成熟的商业架构,最大的不同......
  • socket 收发TCP/UDP
    一、c++个人测试记录,有问题还请指出,谢谢参考:C++开发基础之网络编程WinSock库使用详解TCP/UDPSocket开发_c++udp使用什么库-CSDN博客代码中Logger测试见文章: c++中spdlog的使用/python中logger的使用-CSDN博客1、main.cpp收发TCP信号:#include<iostream>#include<thr......
  • 3、CPU品牌分类介绍(Intel) - 计算机硬件品牌系列文章
    Intel处理器是英特尔公司开发的中央处理器,‌涵盖了移动、‌台式、‌服务器三个系列,‌是计算机中最核心的组件之一,‌相当于计算机的“大脑”。‌Intel处理器自1971年首次商用微处理器4004以来,‌经历了多次技术革新和产品迭代,‌从4位微处理器发展到64位微处理器,‌其技术和产品创......
  • 为什么StampedLock会导致CPU100%?
    StampedLock是Java8引入的一种高级的锁机制,它位于java.util.concurrent.locks包中。与传统的读写锁(ReentrantReadWriteLock)相比,StampedLock提供了更灵活和更高性能的锁解决方案,尤其适用于读操作远多于写操作的场景。1.特点展示相比于Java中的其他锁,StampedLock具有以......