《模式和状态管理》知识总结

一、ECUM

1.1 缩略语

我在这里列出的一些名词的含义只是我在学习过程中自己并不知晓的名词,有其他不会的名词可以自行阅读文档。(会读文档真嘟很重要)

Callback:回调函数,由高级的模块提供,由低级的模块调用,来通知高级的模块某些事情的发生。

Callout:Autosar中的一种重要机制,允许开发者在标准框架中插入自定义代码,以满足特定的应用需求。

Integration Code:也是一部分代码,用于将不同的SWC和BSW集成到一起的代码,确保各个模块协同工作,例如Callback和Callout。

Mode:模式是指车辆中运行的各种状态机(不仅限于ECU管理器)的一组特定状态,这些状态与特定实体、应用程序或整个车辆相关。

Passive Wakeup:由连接的总线引发的唤醒,而不是由内部事件。

Phase:阶段是ECU管理器的操作和事件在逻辑或时间上的组合,例如STARTUP(启动)、UP(运行)、SHUTDOWN(关闭)、SLEEP(休眠)等。阶段可以由子阶段组成,这些子阶段通常被称为序列(Sequences),尤其是当它们主要用于将执行的操作序列分组为逻辑单元时。

Shutdown Target:在将ECU置于休眠状态、断电或复位之前,必须将其关闭。因此,SLEEP(休眠)、OFF(断电)和RESET(复位)是有效的关闭目标。通过选择一个关闭目标,应用程序可以向ECU管理器模块传达其对ECU在关闭后行为的期望。

State:状态是其各自的基础软件(BSW)组件内部的概念,因此对应用程序不可见。它们仅由基础软件的内部状态机使用。ECU管理器内部的状态构成了阶段(phases),从而处理模式(modes)。

Wakeup Event:一个触发唤醒的事件呗,比如开关信号、CAN信号啥啥的。 

Wakeup Reason:唤醒原因是指触发最后一次唤醒的实际唤醒事件。

Wakeup Source:产生唤醒事件的外设或ECU组件被称为唤醒源。

1.2 状态机

状态机其实英文真正的翻译是状态机制(state machine),之前不是很理解状态机,原来人家全名叫状态机制,这下一下就明白了。

EcuM最重要的就是状态机,状态机又分为两种,其中最fixed比不过flex好用,所以fixed以后就不用了,我们和其他人一样,之研究flex模式。

接下来我们按照文档,查看相应代码,走一遍。

1.2.1 STARTUP Phase

C Init Code (c初始化代码)设置完stack后,运行EcuM_Init(),之后便是StartPreOS,那么StartPreOs Sequence 大概率在EcuM Init(),这个函数中,拭目以待:

int main(void)
{unsigned int i,j;//BrsHwWatchdogInitPowerOn();Os_InitMemory();Os_Init();EcuM_Init(); /* never returns */return 0;
}

我们看看StartPreOS Sequence要执行的代码。

EcuM_AL_SetProgrammableInterrupts

空的,或许可以自己编写?

一一对应。

检查配置数据的一致性,也在这里面。

在我的这个运行的代码里边没看到倒数第二个序列,直接就是到了:

启动OS之后,会通过激活Task来运行StartupTwo:

/*****************************************************************************/
/*** @brief      InitTask to call EcuM_StartupTwo()* @pre        -* @param[in]  -* @param[out] -* @return     -* @context    The task is started once by the OS*/
/*****************************************************************************/
TASK(Default_Init_Task)
{
#if defined (BRSASR_ENABLE_OS_MULTICORESUPPORT)/* Workaround for RTE ESCAN00078832 *//* Use this code, if you get a Det Error at the end of Rte_Start() on MasterCore *//* Rte_Start() on the SlaveCores has to be called first, before Rte_Start() on MasterCore *//* SET THIS InitTask TO FULL PREEMPTIVE (OsTaskSchedule) within OsConfig! *//*while(Rte_InitState_1 != RTE_STATE_INIT){(void)Schedule();}*/
#endif /*BRSASR_ENABLE_OS_MULTICORESUPPORT*/EcuM_StartupTwo();#if 0{ISRType i;for (i = (ISRType)0; i < OS_ISRID_COUNT; i++){Os_EnableInterruptSource(i, TRUE);}}#endif{ISRType i;for (i = (ISRType)0; i < OS_ISRID_COUNT; i++){Os_EnableInterruptSource(i, TRUE);}}(void)TerminateTask();
}

在startuptwo里边,又会运行SchM_Init()、BswM_Init()并启动RTE。(startuptwo就是StartPostOs Sequence)。

1.2.2 SHUTDOWN Phase

SHUTDOWN阶段负责处理基础软件模块的受控关闭,并最终实现所选的关闭目标,即OFF或RESET。如果在SHUTDOWN阶段有一个wakeup event发生,那么ECUM模块应该完成SHUTDOWN过程并在此之后立即重新启动。

调用EcuM_Shutdown()进入OffPostOS Sequence:

1.2.3 SLEEP Phase

Sleep Phase用来省电,在该Phase下,没有代码运行,但是ECU依然有电。

唤醒事件有预期和非预期两种,EcuM提供一种区分唤醒事件的协议。

写到这,我发现我的代码里面并没有Sleep Phase的相关代码,可能是我并没有设置MCU进入Sleep Phase 所以没有那部分代码,大家可以看灰老师的文章,等我把这玩意搞出来,再贴过来。

[AutoSar]状态管理(一)单核 ECUM_autosar schm-CSDN博客

1.2.4 UP Phase

在UP阶段,EcuM_MainFunction会被定期执行,它具有三大主要功能。

检查唤醒源是否已触发,并在必要时启动唤醒验证。

更新闹钟计时器。

对RUN和POST_RUN请求及释放进行仲裁。

害害,这几句话说得我,云里雾里的,等等我再研究研究......虽然这里是Up Phase,但是大部分篇幅都在讲Wakeup。

1.2.5 Wakeup

ECU的唤醒是一个非常重要的流程,涉及到多个模块的协同工作,大概流程是:

唤醒源检测->唤醒信号确认->电源恢复->硬件初始化->EcuM模块处理->BswM模块协调->应用层初始化->进入运行状态->错误处理。

1.2.5.1 唤醒源处理

什么是唤醒源?请看1.1。

唤醒源的处理不仅限于唤醒期间,而是持续进行,与所有其他EcuM活动并行。此功能在EcuM_MainFunction中运行,通过模式请求与ECU管理的其余部分完全解耦。

首先说一下唤醒源的状态。

然后是唤醒源的状态机制。

唤醒事件会触发Halt和Poll状态的结束。然后EcuM模块会自动执行WakeupRestartSequence然后返回到Up阶段。

1.2.5.2 唤醒源验证序列

这一部分太多了我r,先发出来吧,换取一点点鼓励......

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

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

相关文章

基于语音的阿尔茨海默病检测识别

摘要 阿尔茨海默病 &#xff08;AD&#xff09; 是一种进行性神经退行性疾病&#xff0c;会严重损害认知功能&#xff0c;导致记忆力减退和其他行为改变。它是全球第七大死因&#xff0c;有数百万人受到影响。早期准确检测 AD 对于改善患者预后和减缓疾病进展至关重要。机器学习…

Bom详解和Dom详解

Javascript的数据类型 1.BOM(浏览器对象模型)1.1window对象(1)全局作用域&#xff1a;(2)窗口属性&#xff1a;(3)弹窗和对话框&#xff1a;(4)定时器&#xff1a;(5)导航和历史&#xff1a;(6)打开和关闭窗口&#xff1a; 1.2navigator对象(1)浏览器信息属性&#xff1a;(2)浏…

openharmony中HDF驱动框架关键流程说明-观察者模式

在分析openharmony 5.0的HDF驱动框架时我们会发现用了很多面向对象的思想&#xff0c;例如类继承、接口、单例类等&#xff0c;本来应该是好事情&#xff0c;但使用时对象之间的关系交错复杂&#xff0c;不太符合linux内核分层分模块的思路&#xff0c;导致整体理解起来比较困难…

深度学习框架及其常用模型文件保存格式

在深度学习领域&#xff0c;不同的框架有各自常用的模型文件保存格式。了解这些格式对于模型的训练、保存、部署和分享都非常重要。下面将详细介绍几种常见深度学习框架及其对应的模型文件保存格式。 1. PyTorch 框架 1.1 文件格式 .pt .pth 1.2 说明 这两种文件格式本质上…

Java字符串到底能有多长

文章目录 编译期运行期实际开发建议总结编译期 在编写代码时,直接写在代码里的字符串(硬编码字符串)有一个长度限制。具体来说,字符串的最大长度不能超过65534个字符。如果超过这个限制,编译器会报错。 当你在代码里直接写字符串时: String text = "我是一个很长很…

blender骨骼分层问题:某一层的骨骼怎么移动到第一层

一、原生Blender骨骼分层操作方法 1. 进入姿态模式 按A选中骨骼 →按M →鼠标左键点击相应骨骼层 注意&#xff1a;Blender原生界面中&#xff0c;骨骼层是通过姿态模式下的快捷键M勾选框直接控制的&#xff0c;每个勾选框对应一个层&#xff08;共32层&#xff09;。移动骨…

一.AI大模型开发-初识机器学习

机器学习基本概念 前言 本文主要介绍了深度学习基础&#xff0c;包括机器学习、深度学习的概念&#xff0c;机器学习的两种典型任务分类任务和回归任务&#xff0c;机器学习中的基础名词解释以及模型训练的基本流程等。 一.认识机器学习 1.人工智能和机器学习 人工智能&am…

cornerstone3D学习笔记-MPR

最近在研究如何利用cornerstone3D (v1.70.13) 来实现MPR功能&#xff0c;找到它的一个demo -- volumeBasic, 运行效果如下图 看了下主程序的示例代码&#xff0c;非常简单&#xff0c;可以说corestone3D这个库把很多细节都封装起来了&#xff0c;使得调用者可以很简单的快速实…

使用 Go-DeepSeek 轻松调用 DeepSeek 模型:从在线 API 到本地部署

引言 DeepSeek 是一个强大的 AI 模型平台&#xff0c;支持多种自然语言处理任务&#xff0c;如对话生成、代码补全和函数调用。为了方便 Go 开发者快速集成 DeepSeek 的功能&#xff0c;我开发了一个非官方的 Go 客户端库&#xff1a;go-deepseek。本文将详细介绍如何使用该库…

VSCode 实用快捷键

前文 VSCode 作为文本编辑神器, 熟练使用其快捷键更是效率翻倍, 本文介绍 VSCode 常用的实用的快捷键 实用快捷键 涉及到文本操作, 搜索定位, 多光标, 面板打开等快捷键 功能快捷键复制光标当前行 (不需要鼠标选中) Ctrl C 剪切光标当前行 (不需要鼠标选中) Ctrl X 当前行下…

28、深度学习-自学之路-NLP自然语言处理-做一个完形填空,让机器学习更多的内容程序展示

import sys,random,math from collections import Counter import numpy as npnp.random.seed(1) random.seed(1) f open(reviews.txt) raw_reviews f.readlines() f.close()tokens list(map(lambda x:(x.split(" ")),raw_reviews))#wordcnt Counter() 这行代码的…

用deepseek学大模型08-卷积神经网络(CNN)

yuanbao.tencent.com 从入门到精通卷积神经网络(CNN),着重介绍的目标函数&#xff0c;损失函数&#xff0c;梯度下降 标量和矩阵形式的数学推导&#xff0c;pytorch真实能跑的代码案例以及模型,数据&#xff0c;预测结果的可视化展示&#xff0c; 模型应用场景和优缺点&#xf…

【Rust中级教程】1.10. 引用及内部可变性(简单回顾):引用、内部可变性、`Cell`类型及相关操作

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 这篇文章只对所有权进行简单回顾&#xff0c;想要看完整的所有权系统阐述见【Rust自学】专栏…

2012年下半年软件设计师上午题知识点及其详细解释(附真题及答案解析)

以下是2012年下半年软件设计师上午题的所有题目&#xff08;从第1题到第75题&#xff09;的总结&#xff0c;按顺序列出每道题目的考察知识点及其详细解释&#xff0c;供考生背诵记忆&#xff1a; 1. 控制器 知识点&#xff1a;CPU的组成与功能解释&#xff1a;控制器负责指令…

openGauss 6.0.0 RC1数据库日常运维

引言 随着数字化时代的快速发展&#xff0c;数据库作为企业信息化的核心&#xff0c;其稳定性和性能对于企业至关重要。openGauss 6.0.0 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验&…

4090单卡挑战DeepSeek r1 671b:尝试量化后的心得的分享

引言&#xff1a; 最近&#xff0c;DeepSeek-R1在完全开源的背景下&#xff0c;与OpenAI的O1推理模型展开了激烈竞争&#xff0c;引发了广泛关注。为了让更多本地用户能够运行DeepSeek&#xff0c;我们成功将R1 671B参数模型从720GB压缩至131GB&#xff0c;减少了80%&#xff…

【Scrapy】Scrapy教程6——提取数据

前一小节我们拿到了页面的数据,那页面中那么多内容,我们想要其中的部分内容,该如何获取呢?这就需要对我们下载到的数据进行解析,提取出来想要的数据,这节就讲讲如何提取数据。 引入 我们编辑保存下来的shouye.html文件看下,发现这是什么鬼,全是如下图的代码。 没错…

Python 的 with 语句可以用来管理资源的自动清理,并替代 try...finally 语句,使代码更简洁易读

Python 的 with 语句可以用来管理资源的自动清理&#xff0c;并替代 try...finally 语句&#xff0c;使代码更简洁易读。 1. with 语句的作用 在 Python 里&#xff0c;with 语句通常用于管理资源&#xff0c;比如文件、数据库连接、网络请求等。 它可以保证无论代码是否执行…

栈回溯基础

指令集区分 thumb指令集 长度&#xff1a;thumb指令通常是 16 位。特点&#xff1a;thumb 指令集是为了压缩指令集长度减少程序占用空间。对齐方式&#xff1a;2字节对齐&#xff0c;存放 thumb 指令的地址一般会被1&#xff0c;设置为奇数&#xff0c;用于表示地址上存放的是…

Pytorch论文实现之GAN-C约束鉴别器训练自己的数据集

简介 简介:这次介绍复现的论文主要是约束判别器的函数空间,作者认为原来的损失函数在优化判别器关于真样本和假样本的相对输出缺乏显式约束,因为在实践中,在优化生成器时,鉴别器对生成样本的输出会增加,但对真实数据保持不变,而优化鉴别器会导致其对真实数据的输出增加…