当前位置: 首页 > news >正文

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

一、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,先发出来吧,换取一点点鼓励......

相关文章:

  • 百度搜索全面接入DeepSeek-R1满血版:AI与搜索的全新融合
  • 深入解析 Flutter Widget 树与布局:从电商首页到性能优化
  • 23种设计模式 - 建造者模式
  • Pytorch实现之SCGAN实现人脸修复
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter16-DOM2 和 DOM3
  • 数据在内存中的存储
  • 2025年02月17日Github流行趋势
  • JavaScript数组-创建数组
  • 投资组合风险管理
  • JDK 24:Java 24 中的新功能
  • 使用Java爬虫获取1688自定义API操作接口
  • Flutter 网络请求与数据处理:从基础到单例封装
  • 【吾爱出品】[Windows] 透明浏览器V1
  • 【Elasticsearch】监控与管理:集群安全管理
  • Rabbitmq的三个端口区分
  • 如何利用国内镜像从huggingface上下载项目
  • 实现可拖拽的 Ant Design Modal 并保持下层 HTML 可操作性
  • 人工智能(AI)的定义与硬件需求
  • 物理层芯片的Auto-negotiation(自动协商)的详细解释
  • 解决 matplotlib 不支持中文字符
  • 日本航空自卫队一架练习机在爱知县坠毁
  • 将人工智能送上太空,我国太空计算卫星星座成功发射
  • 横跨万里穿越百年,《受到召唤·敦煌》中张艺兴一人分饰两角
  • 美凯龙:董事兼总经理车建兴被立案调查并留置
  • 第四届长三角国际应急博览会开幕,超3000件前沿装备技术亮相
  • 扶桑谈|从石破茂“越菲行”看日本周边外交布局战略新动向