Autosar通信入门系列07-CanNM状态机切换详解

本文框架

  • 1. 概述
  • 2. NM状态机时间参数及常用接口介绍
    • 2.1 涉及时间参数说明
    • 2.2 状态机切换涉及接口介绍
  • 3 NM状态机及其切换介绍
    • 3.1 NM状态机概览
    • 3.2 NM状态机切换过程详解

1. 概述

本文为Autosar通信入门系列介绍,如您对AutosarMCAL配置,通信,诊断等实战有更高需求,可以参见AutoSar 实战进阶系列专栏,快速链接:AutoSar实战进阶系列导读

本篇我们一起看下基于CAN通信的网络管理状态机跳转过程,跳转期间会调用到的常用接口,全文大纲如下:
在这里插入图片描述

2. NM状态机时间参数及常用接口介绍

2.1 涉及时间参数说明

在状态机切换中有较多状态切换前需要等待的时间,即在该状态需要停留一段时间再切换到下一个状态,在这里,我们先把会用到的时间参数汇总说明如下。

时间参数描述对应配置项
T_ImmediateNmCycleTime快速报文NM PDU的循环周期CanNmImmediateNmCycleTime
N_ImmediateNm_Times快速报文NM PDU的次数CanNmImmediateNmTransmissions
T_NM_MessageCycleNM报文发送周期CanNmMsgCycleTime
T_MsgCycleOffset发送第一帧NM报文的延迟事件CanNmMsgCycleOffset
T_RepeatMessage重复消息状态的超时阈值CanNmRepeatMessageTime
T_NmTimeoutNM PDU的超时阈值CanNmTimeoutTime
T_WaitBusSleep总线静默阶段超时阈值CanNmWaitBusSleepTime

2.2 状态机切换涉及接口介绍

在这里我们对NM中常用及状态机切换会用到的接口进行汇总如下:

函数名描述
CanNM_Init()CAN网络管理模块的初始化函数
CanNM_PassiveStartUp()该节点收到总线其他节点NM报文被动唤醒时,可能调用该接口
CanNM_NetworkRequest()本节点主动请求网络通信,如本地唤醒事件产生后
CanNM_NetworkRelease()本节点释放网络,不再需要与其他节点进行通信
CanNM_RepeatMessageRequest()节点从常规运行状态或准备休眠状态,需要返回到重复发送报文状态时调用
CanNM_RxIndication()本节点收到其他节点的NM报文,调用此接口
CanNM_DisableCommunication()禁止NM报文发送,对于UDS 0x28服务会用到
CanNM_EnableCommunication()使能NM报文发送,对于UDS 0x28服务会用到

3 NM状态机及其切换介绍

3.1 NM状态机概览

CanNM网络管理核心是状态机,NM状态机分为三个模式:
Bus-Sleep Mode、Network Mode 及Prepare Bus-Sleep Mode,其中:
● Bus-Sleep Mode:总线睡眠模式,用于减少节点对蓄电池的电量消耗。
● Prepare Bus-Sleep Mode:准备总线睡眠模式,保证了节点在进入总线睡眠模式前,有足够的时间停止其网络活动,比如发送缓存中的报文。
● Network Mode:网络模式,其中Network Mode又分为3个子状态(State):
Repeat Message State:重复报文状态,该状态可以被用来检测在线节点。
Normal Operation State:常规运行状态,用于保证只要对网络通信有需求,任何一个网络节点都可以保持网络处于唤醒状态。
Ready Sleep State:准备睡眠状态,用于网络中仍有节点对通信有需求时,推迟向准备总线睡眠模式的转换。
对应的模式及状态切换示意图如下
在这里插入图片描述

3.2 NM状态机切换过程详解

模式切换整体示意图如下,后续将按照图片组标注的数字序号进行介绍。
在这里插入图片描述
1)PowerOn—>BusSleepMode
当KL30上电或当前节点处于休眠情况下被总线上其他节点唤醒时会执行初始化的操作,CanNM_Init()初始化完成后,CanNM状态机变为第一个模式BusSleepMode,即总线睡眠模式。

在BusSleep模式下会判断唤醒条件是否满足,如不满足则停留在睡眠模式下,直到满足休眠或被唤醒条件。

2)BusSleepMode—>RepeatMessage State
如唤醒条件满足,会根据当前是主动唤醒还是被动唤醒分别调用接口CanNM_NetworkRequest()或CanNM_PassiveStartUp(),将状态切换至RepeatMessage State,在这里需要注意,进入RepeatMessage State后会根据唤醒的原因是主动唤醒还是被动唤醒决定是否进入快发状态:

①主动唤醒情况:以T_ImmediateNmCycleTime的周期快速发送N_ImmediateNm_Times次NM,目的是快速唤醒总线上其他节点,CBV中的Active Wake up bit置为1;

②被动唤醒情况:说明总线上已经有其他节点醒来,不需要自己去唤醒总线上其他节点,只需要以T_NM_MessageCycle 周期发送NM报文即可。

在RepeatMessage State下停留的时间为T_RepeatMessage,超时后将切换到后续状态。

3)PrepareBusSleepMode—>RepeatMessage State
同样在当前节点处于PrepareBusSleepMode准备休眠模式时也会在该状态停留T_WaitBusSleep 时间,如在此期间检测到主动唤醒或被动唤醒需求同样会调用CanNM_NetworkRequest()或CanNM_PassiveStartUp(),将状态切换至RepeatMessage State,后续在RepeatMessage状态中执行的操作与"2)BusSleepMode—>RepeatMessage State"中一致,在此不再赘述。

4)RepeatMessage State—>NormalOperation State
当状态机在RepeatMessage State停留时间达到 T_RepeatMessage后,如ECU需要保持唤醒状态,会调用接口CanNM_NetworkRequest()进入NormalOperation State即常规运行状态。

5)NormalOperation State—>RepeatMessage State
在NormalOperation State状态下有两种情况会切换回RepeatMessage State:
①如ECU收到其他节点NM报文中的Repeat message bit位置1了;
②自身节点有Repeat Message需要,通过调用接口CanNM_RepeatMessageRequest() 来实现,在这种情况下,本节点发送的NM报文中Repeat message bit位也会置1。

6)NormalOperation State—>ReadySleep State
在常规运行状态下,如本节点没有与其他节点交互的需求,会通过接口CanNM_NetworkRelease()释放网络管理请求,将状态切换到ReadySleep State准备休眠状态。

7)ReadySleep State—>NormalOperation State
在准备休眠情况下,如存在本地唤醒源或与其他节点的通信需求,会调用接口CanNM_RepeatMessageRequest() 将状态重新切换回NormalOperation State。

8)RepeatMessage State—>ReadySleep State
在RepeatMessage State状态下,停留时间达到 T_RepeatMessage后,如ECU不需要保持唤醒状态,会调用接口CanNM_NetworkRelease()进入ReadySleepState即准备休眠状态。

9)ReadySleep State—>RepeatMessage State
与NormalOperation State状态切换回RepeatMessage State情况一致,同样有两种可能原因:
①如ECU收到其他节点NM报文中的Repeat message bit位置1了;
②自身节点有Repeat Message需要,通过调用接口CanNM_RepeatMessageRequest() 来实现,在这种情况下,本节点发送的NM报文中Repeat message bit位也会置1。

10)ReadySleep State—>PrepareBusSleepMode
在ReadySleep State下,如没有本地或网络唤醒请求,且T_NmTimeout 超时后,NM状态机会切换到PrepareBusSleepMode,同时启动T_WaitBusSleep 定时器。

11)PrepareBusSleepMode—>BusSleepMode
在T_WaitBusSleep定时器达到设定阈值前,如仍没有本地或网络请求,则进入总线休眠模式,如有本地或网络请求则通过CanNM_NetworkRequest()或CanNM_PassiveStartUp()切换回RMS状态。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

P13 Linux进程间通信——管道

前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《Linux C应用编程(概念类)_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🛸推荐专栏3: ​​​​​​《链表_C…

什么是双亲委派模型

一、定义 双亲委派模型是 Java 类加载器的一种工作模式,通过这种工作模式,Java 虚拟机将类文件加载到内存中,这样就保证了 Java 程序能够正常的运行起来。 二、类加载器 双亲委派模型针对的是 Java 虚拟机中三个类加载器的,这三…

NSSCTF-Crypto靶场练习--第11-20题wp

文章目录 [SWPUCTF 2021 新生赛]traditional[LitCTF 2023]梦想是红色的 (初级)[SWPUCTF 2021 新生赛]crypto2[羊城杯 2021]Bigrsa[LitCTF 2023]Hex?Hex!(初级)[SWPU 2020]happy[AFCTF 2018]BASE[安洵杯 2019]JustBase[鹤城杯 2021]Crazy_Rsa_Tech[SWPUCT…

安装 DevEco Studio 后不能用本地 Node.js 打开

安装 DevEco Studio 后第一次打开时,不能用本地 Node.js 打开 答:因为本地 Node.js 文件夹名字中有空格 Node.js路径只能包含字母、数字、“。”、“_”、“-”、“:”和“V” 解决方法: 1.修改文件夹名称 2.重新下载 注意:找一…

如何使用 Explain 分析 SQL 语句?

如何使用 Explain 分析 SQL 语句? MySQL中EXPLAIN命令是我们分析和优化SQL语句的利器。 如何使用EXPLAIN来分析SQL语句,接下来有15个例子,一起学习呗 1. EXPLAIN的基本使用 EXPLAIN可以用于分析MySQL如何执行一个SQL查询,包括如…

m6A RNA甲基化MeRIP-seq测序分析实验全流程解析

甲基化RNA免疫共沉淀(MeRIP-seq/m6A-seq)实验怎么做,从技术原理、建库测序流程、信息分析流程和研究套路等四方面详细介绍。 一、甲基化RNA免疫共沉淀(MeRIP-seq/m6A-seq)测序技术原理 表观转录组指RNA序列不发生改变的情况下,由RNA上的化学修饰调节基因…

股票放量成交后,大涨的概率有多少?

很多时候,经常有人会感觉,成交量突然放大5倍以上,后面的股价大概率会上涨,很多投顾班的老师也是给大家展示这样的感觉,那究竟有多大比例的上涨呢? 【文章仅是数据分析,不构成任何投资建议】 一…

如何主持一场知识竞赛抢答赛

知识竞赛主持说难不难,说简单也不简单,我就从易到难介绍一下。 入门级,题主不用练习太多其他花哨的技巧,只要注意一点,熟悉比赛流程。知识竞赛需要给所有选手一个公平流畅的答题环境,所以题主自身必须非常…

FreeRTOS的任务优先级、Tick以及状态讲解(尊敬的嵌入式工程师,不妨进来喝杯茶)

任务优先级和Tick 在FreeRTOS中,任务的优先级和Tick是两个关键的概念,它们直接影响任务的调度和执行。 任务优先级 每个任务都被分配一个优先级,用于决定任务在系统中的调度顺序。 优先级是一个无符号整数,通常从0开始&#xff0…

使用大语言模型生成自动驾驶指令代码可行吗?

大语言模型最近太火了,大家都在各个方向上应用它。自动驾驶也是当下一个热门领域,两个热门领域的结合自然非常令人期待。AIGCer在读了一些相关文献后,感觉在自动驾驶这个热点方向上应用大语言模型,也将是一个很有前途的方向。 这…

设计模式篇---享元模式

文章目录 概念结构实例总结 概念 享元模式:运用共享技术有效地支持大量细粒度对象的复用。 当系统中出现大量相同或者相似的对象时,可以考虑使用享元模式。享元模式中提供了一个享元池用于存储已经创建好的对象。享元对象能做到共享的关键是区分了内部状…

Diary22-全网最全的CSS3.0讲解

CSS学习 1.认识CSS 1.1什么是CSS CSS:Cascading Style Sheet——层叠级联样式表 CSS:表现(美化网页) 字体;颜色;边距;高度;宽度;背景图片;网页定位&…

Nginx按指定格式记录访问日志以及利用logrotate做日志轮转

今天突然想起来一个日志的一个东西,因为拉项目无意中看到了日志文件的一些东西,现在不经常做后端了,加上其他的一些原因吧.有时候有些问题也没想太多,马马虎虎就过了,后来想想还是要记录一下这方面的处理过程吧: 一般我们作为开发人员关注的日志只是在应用程序层面的,我们称它…

springboot095学生宿舍信息的系统

springboot095学生宿舍信息的系统 源码获取: https://docs.qq.com/doc/DUXdsVlhIdVlsemdX

使用MfgTool烧写工具烧写自制系统

一. 简介 本文我们就来学习,如何将我们编译的 uboot,zImage(内核镜像),xxx.dtb设备树文件,还有制作的根文件系统,这四个文件烧写到开发板中,最后 开发板能正常启动。 上一篇文章说…

Linux权限(用户角色+文件权限属性)

Linux权限 文章目录 Linux权限一.文件权限1.快速掌握修改权限的方法(修改文件权限属性)2.对比权限的有无,以及具体的体现3.修改权限的第二套方法(修改用户角色)4.文件类型(Linux下一切皆文件) 二…

六级高频词汇1

目录 高频词汇 参考连接 高频词汇 1. alter v. 改变,改动,变更 2. burst vi. n. 突然发生,爆裂 3. dispose vi. 除掉;处置;解决;处理(of) 4. blast n. 爆炸;气流 vi. 炸,炸掉 …

Python轴承故障诊断 (五)基于EMD-LSTM的故障分类

目录 前言 1 经验模态分解EMD的Python示例 2 轴承故障数据的预处理 2.1 导入数据 2.2 制作数据集和对应标签 2.3 故障数据的EMD分解可视化 2.4 故障数据的EMD分解预处理 3 基于EMD-LSTM的轴承故障诊断分类 3.1 训练数据、测试数据分组,数据分batch 3.2 定…

C++ 面向对象补充

目录 初始化列表 explicit关键字 单参数构造函数 多参数构造函数 static成员 友元 内部类(不常用) 匿名对象 初始化列表 以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟 一个放在括号中的初始值或表达式。 class Date…

头歌平台题目参考

任务描述 本关任务:获取从键盘输入3个数,要求按从大到小的顺序输出这3个数。 相关知识 程序并不会总是执行同样的处理。例如,按下某个键的时候执行 A 处理,按下其他键的时候执行 B 处理…… 像这样,程序通过条件判断…
最新文章