【小猫爪】AUTOSAR学习笔记05-Communication Stack之CanSM模块
创始人
2025-05-31 02:52:12

【小猫爪】AUTOSAR学习笔记05-Communication Stack之CanSM模块

  • 前言
  • 1 CanSM简介
  • 2 CanSM功能介绍
    • 2.1 模式切换
    • 2.2 Busoff 恢复机制
    • 2.3 切换波特率
    • 2.4 唤醒确认功能
  • END

前言

  因为一个偶然的机会让我接触到了AUTOSAR,所以就花一点小小的时间来记录一下学习它的坎坷大道。这其中复制粘贴了很多,也包括了我的一些个人的小小见解和废话连篇,不爱看忽略即可,这其中如果有什么错误,欢迎大家来指正哦,嘿嘿。AUTOSAR参考版本:4.3.1

  这一章来看看Communication Stack的CanSM模块(CAN State Management)。SM模块跟NM模块类似,每一种总线都有自己的SM模块。这里还是以CAN总线为例。

1 CanSM简介

  首先来看看CanSM模块在AUTOSAR架构中的位置:
在这里插入图片描述
  可以看到CanSM和上一章介绍的CanNm是两兄弟,都是基于interface层,对上则服务于ComM服务。只不过两兄弟所实现的功能不一样,在具体介绍CanSM模块之前,得先搞清楚状态管理是个什么玩意。首先这里管理的状态其实是对应其总线的通信状态,所以CanSM模块管理的就是CAN总线的通信状态,而这里的通信状态则包含能不能发送报文,能不能接收报文,总线上有没有错误等。

  CanSM模块针对CAN总线状态而言,由上而下,CanSM接收其他模块的总线状态切换请求并通知CanIf模块去执行,由下而上,CanSM接收CanIf模块的总线状态切换反馈并汇报给其他模块。

  下图显示了在AUTOSAR的BSW层中其他模块与CanSM的交互情况:
在这里插入图片描述
  ECuM模块会初始化CanSM模块,并与CanSM模块交互进行CAN总线唤醒的验证。ComM模块使用CanSM模块请求CAN网络的通信模式,CanSM模块会将其CAN网络的当前通信模式通知给ComM模块。CanSM模块使用Canlf模块来控制CAN控制器和CAN收发器工作模式,Canlf模块通知CanSM模块CAN总线相关事件。CanSM模块向Dem模块报告总线特定的故障信息。CanSM将总线特定的模式更新通知到BswM模块。CanSM模块将部分网络可用性通知给CanNm模块,并在部分联网的情况下处理已通知的CanNm超时异常。CanSM模块向Det模块报告开发和运行时错误。

2 CanSM功能介绍

  CanSM提供的主要功能主要有:
  1. 总线模式切换
  2. Busoff 恢复管理
  3. 切换波特率
  4. 唤醒确认管理

2.1 模式切换

  CanSM模块针对总线模式控制有一个内部状态机,它会接收其他模块的总线模式切换请求以及总线状态变化反馈才进行状态机切换,其内部状态机切换如下图所示:
在这里插入图片描述
*注:高清图请参考AUTOSAR官方文档:《AUTOSAR_SWS_CANStateManager.pdf》。

  NOT_INITIALIZED 状态下,只能调用 CanSM_Init。

  PRENOCOM/WUVALIDATION/PRE_FULLCOM/CHANGE_BAUDRATE/SILENTCOM_BOR 为中间状态,正常情况下,CanSM不会停留在这些状态中,在这些状态下,调用 CanSM_RequestComMode 会被拒绝。

  NOCOM\FULLCOM\SILENTCOM 为稳定状态,处于这些状态下,可接受新的CanSM_RequestComMode 请求。

  上面提到了CanSM有三种稳定状态,分别为NOCOM \FULLCOM \SILENTCOM,其中NOCOM的就是无通信,不能收发,FULLCOM为全通信,可收可发,从字面意思上就非常好理解,至于SILENTCOM则是只能收不能发,通常用在系统想要sleep的时候。

  关于CanSM的状态机切换非常复杂,上述提到了几种大状态下又会有自己的子状态机,但是不管它多复杂对我们使用它却并没有什么关系,这就是AUTOSAR的可怕之处,它会安排好一切,我们只需要按照需求调用接口和使用回调就行了。在这里,对状态机的详细切换机制我就不多作说明了,大家可以参考这两篇文章:《AUTOSAR通信之CAN状态管理:CanSM》,《CAN网络状态机》。

2.2 Busoff 恢复机制

  除了上面所说的总线状态机,CanSM模块还有另外一个小型状态机,那就是用来实现的Busoff 恢复机制。

  当CanSM模块从CanIf模块收到 Busoff 通知时,将会进入 Busoff 恢复的状态,恢复机制如下:

  1. 快恢复,产生 Busoff 后,延时 CanSMBorTimeL1 时间尝试恢复;
  2. 快恢复次数达到 CanSMBorCounterL1ToL2 后,进行慢恢复;
  3. 慢恢复,产生 Busoff 后,延时 CanSMBorTimeL2 时间尝试恢复;
  4. 慢恢复次数为无限次。

  尝试恢复指的是,重新打开Can的发送能力,并从Busoff Recovery状态切换至CHECK_BUS_OFF状态。在首次进行快恢复和慢恢复时,CanSM模块会分别给出回调函数通知用户。

  当 CanSM 尝试恢复 Busoff 后,有两种方法对总线是否恢复进行确认。

  1. 若 CanSMBorTxConfirmationPolling 为 false,停留在BUS_OFF_CHECK状态没有超过时间参数CanSMBorTimeTxEnsured,在此时间段内,没有新的 Busoff 事件产生,则认为 Busoff恢复成功。
  2. 若 CanSMBorTxConfirmationPolling 为 true,停留在 BUS_OFF_CHECK状态,直到检测到确实有一帧 Can 报文发送成功并给出了发送确认则认为 Busoff 恢复成功。这种情况下,需要调用 CanIf 的CanIf_GetTxConfirmationState 接口。

  Busoff 恢复成功后,BUS_OFF_CHECK状态将切换为 NO_BUS_OFF状态,总线通信恢复正常(:BUS_OFF_CHECK和NO_BUS_OFF是FULLCOM状态中的两个小状态)。

  如果Busoff 恢复不成功,节点一直在慢恢复期,意味着该节点不会外报文(应用报文和网络管理报文均不会外发),其他节点会上报对应的节点丢失故障。

  关于BusOff恢复机制的详细过程,我这里也不多说了,感兴趣的朋友可以参考文章:《CanSM模块如何处理Busoff等问题呢》。

2.3 切换波特率

   CanSM模块提供接口CanSM_ChangeBaudrate可以切换CAN总线通信波特率,但是只有在FULLCOM状态且没有Busoff 时才能调用CanSM_ChangeBaudrate,其他状态调用 CanSM_ChangeBaudrate 会被拒绝。

2.4 唤醒确认功能

   当系统进入休眠后,CAN 控制器也进入休眠状态。当发生 CAN 通道唤醒事件时,EcuM 会 调 用 CanSM模块的CanSM_StartWakeupSource() 函 数 ,CanSM状态机会由NOCOM状态进入CANSM_BSM_WUVALIDATION状态,将硬件状态设置为正常工作态。此时硬件可以接收到网络上的报文,CanIf 模块会判断该唤醒帧是否合法。若判断结果为合法, ComM 会 调 用 CanSM 模 块 的CanSM_RequestComMode()接口请求 CanSM 进入 FULLCOM 模式, 若结果为非法,则 EcuM 会调用 CanSM 模块的CanSM_StopWakeupSource()函数,由CanSM将硬件重新设置为休眠状态。

END

  补充:除了以上简单介绍的几大点,CanNm模块还有一大堆的细节,大家如果想更深入了解CanNm模块,请参考AUTOSAR官方文档《AUTOSAR_SWS_CANStateManager.pdf》。

相关内容

热门资讯

4.线性表的循环链表、双向链表... 数据结构很重要! 数据结构很重要!!! 数据...
Spark - 继承 File... 目录 一.引言 二.源码浅析 1.RDD.saveAsTextFile 2.TextOutputFo...
人工智能和网络安全,应该如何选... 随着数字时代的到来,网络安全和人工智能成了科技创新产业的重要组成部分。也逐渐成了大多数...
Java面试总结(九) redis的持久化方式 RDB、AOF、混合。 RDB 持久化 Redis 可以通过创建快照来获得存...
pytest学习和使用22-a... 22-allure特性 丨总览中的Environment和Categories设置1 Environ...
黄鹤使用说明书-主动给下级当好... 几年前《xx说明书》这类书籍大行其道的时候,就想过写一个自己的使用说明书,...
Ripser.py学习 (8)... 文章目录1 概述2 测试数据 1 概述 本节展示系数域如何影响H1H_1H1​同伦。这个例子...
【真八股 | 华为OD技术面试... 文章目录 华为 OD 面试流程1. Java 都有哪些锁2. 各种设计模式3. 如何打开一个文件并从...
day05_Java中的运算符 在Java中提供了丰富的运算符  其按照功能分:算术运算符、赋值运算符、比较运算符、逻...
为什么热咖啡保温几小时后的变化... 为什么热咖啡保温几小时后的变化比冰咖啡大?导读心理影响感官的作用咖啡的化学变化 导读 ...
总结796 早上: 7:10起床 7:35~8:00背单词(第一遍) ...
Pytorch深度学习常用预训... Resnet:model_urls = {‘resnet18’: ‘https://down...
Python之面相对象语法全解 1、类的定义和使用 - 类和对象都是对现实生活中的事物或程序中的内容的抽象 - 实际上所有的事物都由...
Maven高级——聚合、继承、... 一、分模块开发与设计直接引用前面写过的https://blog.csdn.net/weixin_51...
简单数据查询 一、实验目的       熟悉和掌握对数据表中数据的查询操作和SQL命令的使用,学会灵...
WuThreat身份安全云-T... 漏洞名称: Ubiquiti EdgeRouter 命令注入漏洞 漏洞级别:中危 漏洞编号:CVE-...
C++类和对象(上篇) 目录 1.类的定义 2.类的访问限定符及封装   2.1类的访问限定符   2.2封装 3.类的作用...
社区最早一批贡献者为什么还在坚... 点击蓝字 关注我们今天这位我们将要介绍的项目 PMC Member 是社区最早的一批贡献者之一&#x...
文心一言 vs GPT-4 —... 文心一言 vs GPT-4 —— 全面横向比较 3月15日凌晨,OpenAI发布“迄今...
element-ui表单先编辑... element-ui的表单resetFields()方法无法清空 需要注意几个问题: ...
Jemeter测试--安装与使... Jmeter简介 JMeter,一个100%的纯Java桌面应用...
OCR之论文笔记TrOCR 文章目录TrOCR: Transformer-based Optical Character Rec...
Mysql常用数据类型总结 整形 枚举类型ENUE整形       TINYINT,SMALLINT,MEDIUMINT,IN...
【flink sql】创建表 flink sql创建表语法 CREATE TABLE [IF NOT EXISTS] [catal...
python opencv 保... 👨‍💻个人简介: 深度学习图像领域工作者 dz...
Pytorch深度学习实战3-... 目录1 数据集Dataset2 数据加载DataLoader3 常用预处理方法4 模型处理5 实例&...
自定义类型的超详细讲解ᵎᵎ了解...   目录 1.结构体的声明 1.1基础知识 1.2结构体的声明 1.3结构体的特殊声明  1.4结构...
Docker等容器技术如何与移... 移动应用程序的开发面临着很多挑战,包括开发环境的设置、测试的困难、部署的复杂性等。由于...
【微服务】—— Nacos安装... 文章目录1. Windows安装1.1 下载安装包1.2 解压1.3 端口配置1.4 启动1.5 访...
【OpenGL】 为了理解这个函数我们需要先学习一些OpenGL的内容 OpenGL可视化 https://g...