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

news2024/11/13 9:02:27

目录

  • 3、功能规范
    • 3.1、提供给上层的服务
      • 3.1.1、Initialization and shutdown
      • 3.1.2、Transmit request
      • 3.1.3、Transmit cancellation
    • 3.2、提供给下层的服务
      • 3.2.1、Transmit confirmation
      • 3.2.2、Reception indication
    • 3.3、内部行为
      • 3.3.1、N-SDU接收

  在前面 《[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_总目录,点击跳转

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一款异次元小清新风格的响应式wordpress个人博客主题

一款异次元小清新风格的响应式个人博客主题。这是一款专注于用户阅读体验的响应式 WordPress 主题,整体布局简洁大方,针对资源加载进行了优化。 Kratos主题基于Bootstrap和Font Awesome的WordPress一个干净,简单且响应迅速的博客主题&#x…

go-微服务的设计概括

一、微服务到底是什么? 初学者很容易把微服务和分布式混为一谈,但其实二者之间存在非常大的差异,我个人认为主要有以下几点: 分布式主要是一种技术手段,用来保证多个相同的进程能够共同工作而不出错。采用各种复杂的…

修复公路 (最小生成树)

//新生训练 Input 4 4 1 2 6 1 3 4 1 4 5 4 2 3 Output 5 #include <iostream> #include <algorithm> #include <bits/stdc.h> using namespace std; typedef long long ll;struct road {int u,v;ll w;bool operator<(const road a)const{return w<a.w…

每日练习*

目录 一、选择题二、知识点1.中间件特点的描述1.1中间件的定义和作用1.2中间件的主要特点1.3中间件的应用场景1.4中间件的发展趋势 二、重写与重载总结![](https://i-blog.csdnimg.cn/direct/aa4190dfbd0e463294e41059016b8895.png) 一、选择题 题目选自牛客网 1.执行下列代码…

自动化测试 - selenium 环境搭建

在进行自动化测试时&#xff0c;Selenium 是一个非常强大的工具&#xff0c;在使用前需要做一些环境准备。 1. 配置 Chromedriver 访问 Chrome 浏览器的官方网站&#xff08;https://www.google.cn/chrome/&#xff09;&#xff0c;下载并安装 Chrome 浏览器。 接下来&#x…

Postman 集合变量的实用指南

在运用 Postman 进行 API 测试时&#xff0c;变量扮演着动态数据存储器的角色。它们作为键值对存在&#xff0c;其中“键”是变量的标识&#xff0c;而“值”则是存储在变量中的数据。这种机制不仅可以在多个 API 调用中重用数据&#xff0c;还有助于降低数据冗余&#xff0c;优…

【已解决】Linux(Centos7)中yum过程域名无法解析问题

问题原因 Linux中yum过程域名无法解析问题&#xff0c;但是ping 域名时联通的&#xff08;即DNS没问题&#xff09;&#xff0c;所以初步判断是镜像源的问题。 解决方法&#xff08;Centos7&#xff09; 1、备份/etc/yum.repos.d/CentOS-Base.repo 2、下载CentOS-Base.repo…

WebGL-编译报错,如何定位sendfile报错位置

1&#xff09;WebGL-编译报错&#xff0c;如何定位sendfile报错位置 2&#xff09;设置DepthBufferBits和设置DepthStencilFormat的区别 3&#xff09;Unity打包exe后&#xff0c;游戏内拉不起Steam的内购 4&#xff09;使用了Play Asset Delivery提交版本被Google报错 这是第3…

Nginx的HA高可用的搭建

1. 什么是高可用 高可用&#xff08;High Availability, HA&#xff09;是一种系统设计策略&#xff0c;旨在确保服务或应用在面对硬件故障、软件缺陷或任何其他异常情况时&#xff0c;仍能持续稳定地运行。它通过实现冗余性、故障转移、负载均衡、数据一致性、监控自动化、预防…

MySQL下载安装(保姆式教程)以及解决一些可能的问题

目录 MySQL的下载和安装 显示路径已经存在问题解决 注意&#xff1a; 端口被占用问题解决 注意&#xff1a; 服务名占用问题解决 注意&#xff1a; 应用配置问题解决 注意&#xff1a; MySQL环境配置 检查MySQL是否成功安装 如何将MySQL文件删除干净 MySQL的下载和安装 首先直接…

Python(字符串)

方法名描述说明 str.lower() 将str字符串全部转化为小写字母&#xff0c;结果为一个新的字符串str.upper()将str字符串全部转化为大写字母&#xff0c;结果为一个新的字符串str.split(sepNone)将str按照指定的分隔符sep分隔&#xff0c;结果为列表类型str.count(sub)结果为…

Golang | Leetcode Golang题解之第239题滑动窗口最大值

题目&#xff1a; 题解&#xff1a; func maxSlidingWindow(nums []int, k int) []int {n : len(nums)prefixMax : make([]int, n)suffixMax : make([]int, n)for i, v : range nums {if i%k 0 {prefixMax[i] v} else {prefixMax[i] max(prefixMax[i-1], v)}}for i : n - 1…

使用C#实现无人超市管理系统——数据结构课设(代码+PPT+说明书)

说明&#xff1a;这是自己做的课程设计作业&#xff0c;得分情况98/100 如果想要获取私信我 本项目采用线性表中的链表来进行本次系统程序的设计。链表分为两条线&#xff0c;分别是存储用户信息和商品信息&#xff0c;并且都设为公共属性&#xff0c;方便对用户信息和商品信息…

QT5:多窗口跳转

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助 目录 前言 一、环境 二、步骤 三、代码实现 四、效果图 前言 学习使用qt5完成多窗口&#xff08;界面&#xff09;跳转&#xff1a;从主界面可分别跳转至界面一和界面二&#xf…

echarts实现3d柱状效果

代码如下&#xff0c;单个的调第一个方法&#xff0c;多个柱状的调第二个方法&#xff0c;具体情况修改参数或者二次开发即可 //3d柱状图 export function getEcharts3DBar (xAxisData:string[][name1,name2,name3], data:number[][1,2,3], colorObj:IBaseObject{topStartColo…

【中项】系统集成项目管理工程师-第2章 信息技术发展-2.1信息技术及其发展-2.1.4信息安全与2.1.5信息技术的发展

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

css前端面试题

1.什么是css盒子模型&#xff1f; 盒子模型包含了元素内容&#xff08;content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;border&#xff09;、外边距&#xff08;margin&#xff09;几个要素。 标准盒子模型和IE盒子模型的区别在于其对元素的w…

QT调用VNC并放到一个窗口中

1.VNC资源下载 本例中的这个VNC可以从以下连接中下载&#xff0c;也可以从官网上下载&#xff0c;应该都是类似的。 https://download.csdn.net/download/xiaoding_ding/89549092 下载完成后放到项目的release文件夹中 2.程序中引用 2.1在主界面中放置一个按钮&#xff0c;…

NAS新品“翻车”后,绿联科技要上市了

在消费电子市场回暖的东风中&#xff0c;又一消费电子知名企业登陆A股。 近日&#xff0c;深圳市绿联科技股份有限公司&#xff08;下称“绿联科技”&#xff09;开启申购&#xff0c;将在创业板上市。本次上市&#xff0c;绿联科技的发行价为21.21元/股&#xff0c;发行数量为…

【自动驾驶汽车通讯协议】SPI通讯:深入理解与应用

文章目录 0. 前言1. 工作原理2. 模式与配置2.1 CPOL (Clock Polarity)2.2 CPHA (Clock Phase)2.3 组合模式 3. 特性与优势4. 在自动驾驶汽车中的应用5. 结论 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见…