【ETAS CP AUTOSAR基础软件】EcuM模块详解

文章包含了AUTOSAR基础软件(BSW)中EcuM模块相关的内容详解。本文从AUTOSAR规范解析,ISOLAR-AB配置以及模块相关代码分析三个维度来帮读者清晰的认识和了解EcuM。文中涉及的SOLAR-AB配置以及模块相关代码都是依托于ETAS提供的工具链来配置与生成的,与AUTOSAR规范之间可能会有些许的出入,但总体的功能要点与处理流程都应该是一致的。

EcuM的规范中包含了休眠唤醒这部分功能,但是因为其实现与其他诸多模块耦合性较大,且唤醒源的选择与ECU的应用有很大的关系,大部分项目都选择了不在EcuM框架里实现这个功能,而是由应用层依托复杂驱动(电源管理芯片)或IoAbstraction来实现这部分功能。

目录

AUTOSAR规范解析

概述

启动阶段(STARTUP)

StartPreOS Sequence

StartPostOS Sequence 

参数一致性检查

运行阶段(UP Phase)

关闭阶段(SHUTDOWN Phase)

OffPreOS Sequence 

OffPostOS Sequence 

睡眠阶段(SLEEP Phase)

GoSleep Sequence

Halt Sequence 

Poll Sequence 

WakeupRestart Sequence

多核(MultiCore) 

ISOLAR-AB配置

EcuMGeneral 

EcuMCommonConfiguration

EcuMDefaultShutdownTarget 

EcuMDriverInitListOne

EcuMWakeupSource 

EcuMFlexConfiguration

代码解析

动态代码

集成代码

静态代码 


AUTOSAR规范解析

概述

ECU管理器模块(ECU Manager)是管理ECU状态的基础软件模块。具体来说,ECU管理器模块负责:

  • 初始化和去初始化OS、SchM和BswM以及一些基础软件驱动模块。
  • 将ECU配置为关机或者睡眠状态。
  • 管理ECU上的所有唤醒事件(wakeup events),并提供唤醒验证机制(Wakeup validation protocol),以区分真实(real)和不稳定(erratic)唤醒事件。

EcuM具有flex与fixed两种状态管理机制,fixed模式状态唯一,跳转目标状态也是固定的,而flex模式跳转状态不唯一,可自行设计。Fixed模式在4.4中被移除。下面只介绍flex模式。

灵活的EcuM(Flexible)本身不再具有自己的状态机,因为基础软件的调度管理模块已经整合进RTE模块,并提供了宽松的模式声明与不同模块间的模式切换映射,搭配上BswM提供的可配置的规则与对应的执行列表来评估并完成ECU模式切换等行为,所以大多数之前在Fixed模式下的ECU模式已经不在ECU管理器模块中实现。

通常EcuM模块接管控制早期STARTUP阶段和后期SHUTDOWN阶段以及调度被锁定的SLEEP阶段。 

EcuM在ECU启动后,经过Boot和启动代码后(非AUTOSAR标准),立刻获得核心控制权,在初始化SchM和BswM后将控制权委托给BSW模式管理器。在UP阶段ECU管理器模块会对来自SW-C的RUN和POST_RUN请求进行仲裁,并通知BswM有关的模式状态,并且会对唤醒源进行验证,并通知BswM验证结果,所有这些在UP阶段涉及的操作都是给BswM模式管理提供依据。最后在SHUTDOWN阶段,BswM在配置完ShutdownTarget后会将控制权交还给EcuM。

EcuM在SLEEP阶段配置MCU休眠状态(根据芯片支持情况,选择HALT或者POLL),并在唤醒之后与集成代码和驱动配合完成预设阶段工作之后,回到UP阶段。下图是所有阶段的示意图,注意图中的阶段只是表征当前EcuM所处阶段,并不是具体的模式,它包含一系列操作序列。


启动阶段(STARTUP)

上图显示了ECU启动阶段涉及的动态行为。在调用EcuM_Init之前,假定MCU最小系统的初始化过程已经完成(堆栈等已被设置,代码可以被正常运行)。当调用EcuM_Init时,EcuM将控制ECU启动过程。调用Startos后,ECU Manager模块将暂时放弃控制。要重新获得控制权,Integrator(集成商)可以在操作系统的StartupHook处,挂接EcuMStartupTwo作为其第一个操作,也可以起一个Task来做这件事情。

由上图可以看出,Startup阶段按照OS启动作为分水岭,可分为StartPreOS与StartPostOS两个子阶段。经历过Startup阶段之后,则会进入到UP阶段。STARTUP阶段的目的是将基础软件模块初始化到通用模式管理设施(Generic Mode Management facilities,包括BswM以及SchM等)可操作的点。


StartPreOS Sequence

下表按顺序描述了StartPreOS Sequence涉及的动作。

  1. 调用EcuM_AL_SetProgrammableInterrupts:EcuM_AL_SetProgrammableInterrupts函数由集成商实现在EcuM_Callout_Stubs.c模板文件(模板文件只有函数名定义,函数体为空)中,在具有可编程中断优先级的ECU上,启动OS之前完成这些优先级的设置。
  2. 调用EcuM_AL_DriverInitZero:根据集成商在ISOLAR中的配置,EcuM_AL_DriverInitZero函数生成在EcuM_Cfg_Startup.c文件中,此初始化列表应包含不使用post-build参数的低级BSW模块与MCAL驱动。
  3. 调用EcuM_DeterminePbConfiguration:EcuM_DeterminePbConfiguration集成商实现在EcuM_Callout_Stubs.c文件中,仅在使用了post-build参数可选特性被使用的时候,用户可在ISOLAR中配置根据对应Pin高低状态来选择,若没有则生成的EcuM_Callout_Stubs.c模板文件会默认返回EcuM_EcuMConfigurations_cpcast[0]。
  4. Check consistency of configuration data:检查pre-compile与link-time的参数与post-build参数之间的依赖性,保证ECU Code Image与ECU Post-Build Data Image之间的一致性。如果检验失败则EcuM_ErrorHook调用。
  5. EcuM_AL_DriverInitOne:包含了在启动OS之前必要的驱动初始化列表,集成商在ISOLAR中进行配置,代码生成在EcuM_Cfg_Startup.c文件中。
  6. Get reset reason:调用MCU驱动模块提供的Mcu_GetResetReason获取重启原因,并根据在ISOLAR中配置的ECU唤醒源与重启原因的对应关系,调用EcuM_SetWakeupEvent设置对应的唤醒事件。
  7. Select default shutdown target:根据ISOLAR中配置的EcuMDefaultState以及对应的reset或sleep mode来完成默认关闭阶段的配置(off则无mode)。
  8. EcuM_LoopDetection:如果循环检测使能,将会在每次启动阶段调用EcuM_LoopDetection,函数模板在EcuM_Callout_Stubs.c中,由集成商实现具体内容。
  9. Start OS:启动操作系统。


StartPostOS Sequence 

下表按顺序描述了StartPostOS Sequence涉及的动作。

  1. Start BSW Scheduler:启动基础软件调度模块,现在这个模块已经融入到RTE,不用再单独启动。
  2. Init BSW Mode Manager:初始化BswM模块。
  3. Init BSW Scheduler:调用SchM_Init()完成初始状态的配置通知。
  4. Start Scheduler Timing:因为基础软件调度模块已于RTE合并,此处不在单独启动。
  5. BswM_MainFunction:调度BswM的主处理函数,完成BSW后续的基础软件初始化以及GPT定时器启动,最终OS正常开始调度任务。


参数一致性检查

AUTOSAR将配置按照固件生成的过程分为了三类,Precompile、Linktime以及PostBuild。这三类比较重要的就是PostBuild类配置,这类配置可以单独放到一个存储区域,这个区域可以被单独刷写(通过Flash擦写工具,通过UDS服务),这样做的好处就是OEM不需要知道具体的代码逻辑,也不需要编译器(某些编译器需要license才能使用),也能修改BSW涉及的部分参数。

一级供应商的可以使用通过两个工具,分别开发配置完后,再用编译器,编译链接,生成HEX文件。OEM使用配置工具完成PostBuild参数的配置,然后通过Post Build Tool生成二进制文件,单独将这个二进制文件更新到特定的存储区域(例如上图中的ECU Post Build Data Image写入地址0x8000_0000中)。

这个时候就需要验证单独更新的这部分参数是否与其余的参数是配套的,如果不配套则会出现很多意想不到的问题,AUTOSAR的方式是对Precompile、Linktime进行哈希算法得到一个例如MD5值,并将这个值写于PostBuild参数中,这样就可以在代码运行时从PostBuild参数中拿出这个MD5值与上图中的ECU Code Image中的MD5值相对比。


运行阶段(UP Phase)

在运行阶段,ECU的状态由BswM来控制,EcuM_MainFunction会定期执行,完成下面三个任务。

  • 检查唤醒源是否被唤醒,并将唤醒源的状态通知其他模块,并在必要时启动唤醒验证。
  • 更新闹钟定时器(Alarm Clock timer)。
  • 仲裁RUN和POST_RUN的请求和释放。

当闹钟服务存在时,EcuM_MainFunction主功能将更新闹钟定时器,这里主要针对在Sleep模式下进行定时唤醒功能的实现,在EcuM框架下实现这个功能很少,这里就不赘述了。

下图为唤醒验证过程,看起来比较复杂,下图的动态流程以Can模块为唤醒源,集成代码负责重新启动和停止CAN模块唤醒功能(特定帧或别的判决唤醒方式),唤醒源存在之后会告知EcuM,并通知ComM与BswM存在验证过的唤醒源,如果超时了也没有,则通知BswM唤醒源现在为废弃的状态。

EcuM用一种数据类型定义了所有的启动和唤醒源,我们统一称为唤醒源。下面这五种唤醒源为ISOLAR自动配置的,并不会触发验证过程,直接。

  • ECUM_WKSOURCE_POWER
  • ECUM_WKSOURCE_RESET
  • ECUM_WKSOURCE_INTERNAL_RESET
  • ECUM_WKSOURCE_INTERNAL_WDG
  • ECUM_WKSOURCE_EXTERNAL_WDG

ECU状态管理器为SW-C提供接口以请求和释放RUN模式和可选的POST_RUN模式。在ECUM_CFG_MODE_HANDLING==STD_ON时,EcuMFlex对SW-C发出的请求和释放进行仲裁,并将结果传送给BswM。因为只有BswM可以决定何时可以转换到不同的模式,所以EcuM和BswM之间的合作是必需的。外EcuM将当前请求的仲裁通知BswM。

现在的状态管理都放到了BswM里,什么时候要进入睡眠状态已经由应用程序决定了,所以唤醒源的验证以及对RUN和POST_RUN的仲裁已经不常用了。


关闭阶段(SHUTDOWN Phase)

这个阶段出现在调用EcuM_GoDown()之后,Ecum首先检验当前的ShutdownTarget是否为ECUM_SHUTDOWN_TARGET_OFF或者ECUM_SHUTDOWN_TARGET_RESET,如果是才正式修改GoDown的全局变量,EcuM_MainFunction会根据此全局变量执行对应的关闭阶段行为,ISOLAR会根据AUTOSAR默认创建三个重启模式,如果ShutdownTarget选择ECUM_SHUTDOWN_TARGET_RESET的话可以配置选择对应模式,并在关闭阶段根据对应模式自定义一些行为。

  • ECUM_RESET_MCU
  • ECUM_RESET_WDGM
  • ECUM_RESET_IO


OffPreOS Sequence 

下表按顺序描述了OffPreOS Sequence涉及的动作。

  1. De-init BSW Mode Manager:取消BswM初始化(BswM_Deinit)。
  2. De-init BSW Scheduler:取消基础软件调度初始化(SchM_Deinit)。
  3. Check for pending wakeup events:目的是检测关机期间发生的唤醒事件。
  4. 如果唤醒事件挂起,设置RESET为shutdown target:只有当检测到挂起的唤醒事件允许立即启动时,才应执行此操作(这块在ETAS生成的静态代码里没有看到体现)。
  5. ShutdownOS:关闭OS。


OffPostOS Sequence 

OffPostOs序列实现了在操作系统关闭后达到关闭目标的最后步骤。EcuM_Shutdown()启动该序列,其挂接在Os的回调函数Os_Cbk_InShutdown()。ShutdownTarget可以是ECUM_SHUTDOWN_TARGET_RESET或ECUM_SHUTDOWN_TARGET_OFF,其中具体的复位模式由ShutdownModeType决定,默认ISOLAR会创建上文提到的ECUM_RESET_MCU等三种模式。

下表按顺序描述了OffPostOS Sequence涉及的动作。

  1. 调用EcuM_OnGoOffTwo:集成商自定义的动作。
  2. 调用EcuM_AL_Reset 或者 EcuM_AL_SwitchOff:取决于所选择的ShutdownTarget(RESET or OFF)


睡眠阶段(SLEEP Phase)

ECU在SLEEP阶段整个板卡处于低功耗(saves energy)状态。不同的微控制器对低功耗模式有不同的实现,最常见的实现为核心不执行任何代码,在核心进入这种模式之前,通过配置相应的唤醒中断(IO口电平转换或者定时器超时)会将核心唤醒,这种模式可以使用ECU管理器模块提供的Halt睡眠模式。

还有另外一种,例如瑞萨平台,它的低功耗模式(STOP)是可以执行代码的,Mcu_SetMode (MCU_STOP_MODE)进入低功耗模式之后可以轮询检测各个IO口状态,状态变化之后可以离开这种模式,这种模式可以使用ECU管理器模块提供的Polling睡眠模式。

还有一种外围芯片(电源芯片和CAN收发器配合)完成休眠唤醒的方式,微控制芯片可以通过不喂狗等方式使电源芯片停止对微控制器供电,此时休眠,微控制器直接掉电了,但是CAN收发器还有供电,在满足唤醒要求(接收到特定帧等情况),它会通过自己的INH引脚反映到电源管理芯片上的WAKE引脚,上升沿来重启电源管理芯片。

规范里使用SLEEP作为ShutdownTarget时,EcuM_GoDownHaltPoll函数会启动两种控制流。具体哪种控制流取决于EcuMSleepMode参数所配置的睡眠模式。但实际在ETAS的静态代码里,两种不同的流程调用的分别是EcuM_GoHalt和GotPoll,在关闭时也是直接调用EcuM_GoDown。Poll和Halt在实现睡眠的机制上的结构是不同(Poll需要主动轮询中断源,Halt则被中断启动核心)。但是它们在准备睡眠和从睡眠恢复过程的顺序却是相同的。


GoSleep Sequence

在GoSleep的序列中,ECU管理器模块需为即将到来的睡眠阶段进行相关的硬件配置,ECU管理器模块为了后续的睡眠模式,需进行唤醒源的配置。ECU管理器模块调用EcuM_EnableWakeupSources(),然后集成商会依次为每个在EcuM_WakeupSource中配置的唤醒源执行相关的设置工作。与SHUTDOWN阶段相比,ECU管理器模块在进入SLEEP阶段时,不应关闭操作系统。


Halt Sequence 

下图是暂停阶段EcuM涉及的动态行为,这里边EcuM主要完成与操作系统的交互(开关中断)和MCU模式切换,并在最后将唤醒源事件汇报给BswM。

集成代码需要实现两个主要的函数,一个是EcuM_CheckWakeUp(),其实这个函数的名字主要是因为在Poll模式下需要不断轮询唤醒源,在Halt模式下成为了使能PLL等操作,另一个是一对函数,在睡眠之前调用EcuM_GenerateRamHash()对RAM区计算一个Hash值,等唤醒之后再调用EcuM_CheckRamHash(uint8)确保RAM区在睡眠过程中没有发生意外的变化。

中断源最后还要通过EcuM_SetWakeupEvent()告诉EcuM中断源事件已经出现。


Poll Sequence 

这个动作序列跟Halt序列相比,集成代码增加了EcuM_SleepActivity()的实现,在睡眠的时候可以执行一些代码,并在EcuM_CheckWakeup(EcuM_WakeupSourceType)轮询查找是否有唤醒源触发了。


WakeupRestart Sequence

下表按顺序描述了WakeupRestart Sequence涉及的动作。

  1. Restore MCU normal mode:恢复参数EcuMNormalMcuModeRef定义的MCU模式。
  2. Get the pending wakeup sources:获取当前已触发但是未验证的唤醒源。
  3. 调用EcuM_DisableWakeupSources:禁用进入睡眠模式之前使能的唤醒源。
  4. 调用EcuM_AL_DriverRestart:重写初始化一些睡眠会影响的外设。
  5. Unlock Scheduler:到此节点,所有其他任务可能会再次运行。


多核(MultiCore) 

BSW模块在不同分区上(partition)的分布。分区(partition)可以被看作是映射在一个内核(core)上的独立部分。所以每个核(无论是单核架构还是多核架构)都至少包含一个,但也可以包含任意多个分区。但是任何分区都不能跨越一个以上的内核。

BswM这类的BSW模块需包含在每个分区中,但是如OS或EcuM这类的其他模块需包含在每个内核的一个分区中。具体示例请参考下图。即EcuM在每个核需要存在一个实例。

引导加载程序(boot loader)指定的主内核通过EcuM_Init启动主EcuM(master EcuM)。 主EcuM负责启动一些驱动程序,确定Post Build配置,接着启动其他的内核及其所附属EcuM(Satellite EcuMs), 其他内核的EcuM完成启动本核心附属的OS和BswM。

ECU管理器模块在多核ECU上支持与传统ECU上相同的阶段(即:STARTUP、UP、SHUTDOWN和SLEEP)。但是每个阶段都因其是在主核还是其他核心部署而行为有所不同,EcuM会通过GetCoreID获取核心ID来判断自己是否身处在主核,如果是主核心则跟完成跟单核类似的阶段活动,如果有必要需要在开始的时候通过OS提供的资源或者任务来启动其他核心这个阶段的活动,其他核心的阶段活动一般都为阉割版本,进处理本核心相关的一些组件,主核这个阶段最后往往还需要等待所有从核完成对应阶段的活动,才算完成了整个阶段。下面是一个关闭阶段的实例,可以看到在主核部署的EcuM核从核部署的EcuM之间配合的过程。


ISOLAR-AB配置

因为选择的是外围芯片(电源管理芯片与CAN芯片配合)完成休眠唤醒的工作,并且因为休眠是直接相当于直接断了微控制器的电,所以一些不同模式切换引发的驱动和存储区状态不确定的问题也不需要进行特殊处理,所以休眠唤醒相关的完整流程可以比较轻松的在应用层完成实现。

下面是完整的相关配置项。


EcuMGeneral 

该容器一般包含一些预编译配置参数,如果您在ISOLAR-AB选中要配置的参数,在Quick Info窗口会显示该参数的描述,如下图所示。如果您有的时候发现描述和规范里说明有所出入,那么这很正常,因为规范是规范,而ISOLAR-AB是对规范的实现,难免会有所出入。

所以我这边就不采用地毯式的把所有参数的介绍都翻译一遍了,我们只挑一些重要的配置进行说明。

  • EcuMIncludeDet: 如果为真,初始化对应的BSW模块。
  • EcuMRbRunMinimumDuration:持续时间以秒为单位。如果将其配置为非零值,则在启动后,即使没有任何用户的运行请求,EcuM也将继续保持在RUN状态。在配置此值时,Integrator应该参考Rte启动的时间来配置。
  • EcuMMainFunctionPerio:主函数EcuM_MainFunction调用周期,现在的基础软件主函数都映射到了Task里了。
  • EcuMRbSlaveCoreEarlyStart:如果此参数设置为TRUE。从内核会更早地启动,比如从内核将在初始化EcuMDriverlnitListOne之前由master启动。如果该参数设置为FALSE,则在EcuM_Init的结束阶段启动Slave内核。
  • EcuMRbNvMBlockDeviceld:命名为ECUM_CFG_NVM_block的NVRAM块所在设备的标识。当配置了NvM模块时,该块在CodeGen期间转发给NvM。设备ID为0固定为地址Fee,设备ID 为1固定为地址Eep设备。如果不配置,则默认转发设备ID为0。
  • EcuMRbIncludeHeaderList:自定义头文件列表,它将包含在EcuM.h中。
  • XXXXXXXXCallout:EcuM中的调用函数,可以配置调用的函数名和其他内容,用于生成在EcuM_Callout中函数的实现,用户也可以在EcuM_Callout_Stubs.c模板文件中手动添加逻辑。

EcuMCommonConfiguration

EcuMDefaultAppMode:ECU复位后加载的默认操作系统应用模式。


EcuMDefaultShutdownTarget 

EcuMDefaultState:该参数描述ECU默认shutdowntarget。即OFF或RESET或SLEEP。如果选择了重启或者是睡眠,则参数EcuMDefaultResetModeRef将选择具体的模式。 


EcuMDriverInitListOne

  • EcuMModuleID:要初始化的模块的短名称,例如Mcu, Gpt等。
  • EcuMModuleParameter:定义函数原型和传递给函数的参数。如果EcuM模块参数“POSTBUILD”,然后EcuM将调用MCU_lnit(&Mcu_Config),MCAL生成的静态代码的模块初始化函数名可以保证,但是参数名称往往不是Mcu_Config,需要利用刚才提到的EcuMRbIncludeHeaderList配置包含一个头文件,完成MCAL模块参数结构体的映射。
    /* EcuM Initialization */
    #define Mcu_Config	              Mcu_ConfigRoot[0]
    /* BswM Initialization */

EcuMWakeupSource 

系统默认配置的五个唤醒源。

  • EcuMValidationTimeout:验证超时(ECU状态管理器等待唤醒事件验证的时间)可以为每个唤醒源独立定义。超时时间以主函数周期为单位指定。如果没有配置这个超时,那么这个唤醒源就不会有任何验证例程,EcuM会立即认为这个源是有效的。
  •  EcuMComMChannelRef:该参数是对通信管理器中定义的网络(通道)的引用,不引用表示唤醒源不是通信通道。如果配置了此引用,则唤醒源检测将指示给ComM。
  • EcuMResetReasonRef:该参数描述MCU驱动检测到的复位原因到唤醒源的映射。在EcuM初始化期间需要此映射来检查上次重置原因。
  • EcuMComMPNCRef:这是对通信管理器中定义的一个或多个PNC的引用。没有引用表示唤醒源没有分配给部分网络。

EcuMFlexConfiguration

  • EcuMFlexUserConfig:用户序号定义。
  • EcuMGoDownAllowedUsers:允许使用GoDown接口关闭ECU的用户,引用EcuMFlexUserConfig。
  • EcuMResetMode:这些容器描述了重置模式的。3种复位模式是标准的,
    这是由EcuM自动配置的。
  • EcuMShutdownCause:这些容器描述了配置的Shutdown原因。这三种关闭原因是默认的,由EcuM自动配置。

代码解析

动态代码

我们下面挑几个常用的进行内容说明。

  • EcuM_PBcfg.c:包含Post Build配置EcuM_Config结构体,主要启动OS需要的AppMode,关闭阶段用到的shutdowntarget,MCAL初始化模块的参数指针,以及验证一致性用到的Hash值等。结构体原型如下,注释体现了对应包含的内容。
    typedef struct
    {
        AppModeType DefaultAppMode;
        EcuM_ShutdownTargetInfoType DefaultShutdownTarget; /*Structure to hold the Default Shutdown Target*/
        EcuM_Cfg_adrModuleInitRef_t ModuleInitPtrPB; /*Structure to hold the post build configuration pointer of the modules*/
        const EcuM_Cfg_dataWkupPNCRefStruct_tst *adrWkupPNCRefs; /* Pointer to the PNC references associated with Wakeups */
        uint8 PostBuildHash[ECUM_CFG_LENGTH_OF_HASH];
    } EcuM_ConfigType;
  • EcuM_Lcfg.c:包含EcuM_Cfg_dataPreCompileHash_au8参数,链接参数的Hash值,用于与PB参数中的Hash值比较。
  • EcuM_Cfg.c:包含EcuM_Cfg_idxWakeupSourcesPC_au32等常量配置。
    CONST( EcuM_Cfg_dataWkupSrcStruct_tst,  ECUM_CONST)  EcuM_Cfg_idxWakeupSourcesPC_au32[ECUM_NUM_OF_WKP_SOURCES] =
    {/*IsComChannelPresent,       ComChannelReferance,                     ResetReason,             ValidationTimeout,   IsWakeupSourcePolling,                WakeupSourceId                         */
    {      FALSE          ,       255                                   ,  MCU_RESET_UNDEFINED   ,         0         ,        FALSE  ,              EcuMConf_EcuMWakeupSource_ECUM_WKSOURCE_POWER},
    {      FALSE          ,       255                                   ,  MCU_RESET_UNDEFINED   ,         0         ,        FALSE  ,              EcuMConf_EcuMWakeupSource_ECUM_WKSOURCE_RESET},
    {      FALSE          ,       255                                   ,  MCU_RESET_UNDEFINED   ,         0         ,        FALSE  ,              EcuMConf_EcuMWakeupSource_ECUM_WKSOURCE_INTERNAL_RESET},
    {      FALSE          ,       255                                   ,  MCU_RESET_UNDEFINED   ,         0         ,        FALSE  ,              EcuMConf_EcuMWakeupSource_ECUM_WKSOURCE_INTERNAL_WDG},
    {      FALSE          ,       255                                   ,  MCU_RESET_UNDEFINED   ,         0         ,        FALSE  ,              EcuMConf_EcuMWakeupSource_ECUM_WKSOURCE_EXTERNAL_WDG}
    };
  • EcuM_Cfg.h:包含一些宏定义预编译配置。
    #define	ECUM_VERSION_INFO_API	(STD_ON)
    
    #define ECUM_DEV_ERROR_DETECT 	(STD_ON) 
    
    #define ECUM_INCLUDE_DET (STD_ON)
    
    #define ECUM_CFG_MULTICORE_ENABLED	(STD_OFF)
    
    /* If ECUM_CFG_MODE_HANDLING is STD_ON then All the Mode management APi's and Run handling protocol will be enabled*/
    #define ECUM_CFG_MODE_HANDLING  (STD_OFF)
  • EcuM_Cfg_Startup.c:EcuM_AL_DriverInitZero()与EcuM_AL_DriverInitOne()实现,在EcuM_AL_DriverInitOne初始化上述定义的MCU模块。

集成代码

我们这里就不描述通用的SchM.h以及MemMap.h以及CompilerSpecific.h头文件。主要看一下EcuM_Callout_Stubs.c文件,下面是完整的默认模板文件,集成商可以在其添加自己的处理逻辑。

/*
 * This is a template file. It defines integration functions necessary to complete RTA-BSW.
 * The integrator must complete the templates before deploying software containing functions defined in this file.
 * Once templates have been completed, the integrator should delete the #error line.
 * Note: The integrator is responsible for updates made to this file.
 *
 * To remove the following error define the macro NOT_READY_FOR_TESTING_OR_DEPLOYMENT with a compiler option (e.g. -D NOT_READY_FOR_TESTING_OR_DEPLOYMENT)
 * The removal of the error only allows the user to proceed with the building phase
 */
#ifndef NOT_READY_FOR_TESTING_OR_DEPLOYMENT
#error The content of this file is a template which provides empty stubs. The content of this file must be completed by the integrator accordingly to project specific requirements
#else
#warning The content of this file is a template which provides empty stubs. The content of this file must be completed by the integrator accordingly to project specific requirements
#endif /* NOT_READY_FOR_TESTING_OR_DEPLOYMENT */


/**********************************************************************************************************************
* CONTAINS THE STUBS OF THE CALLOUTS REALIZED IN THE IMPLEMENTATION
*********************************************************************************************************************/

/*
 **************************************************************************************************
 * Includes
 **************************************************************************************************
 */

#include "EcuM.h" /*BSW_HeaderInc_002*/

#include "EcuM_Callout.h"

#include "EcuM_RunTime.h" /*For init callout duration measurement*/

#include "EcuM_Prv.h"

/* External Header Include */
#include "Os.h"
#if (ECUM_CFG_NVM_BLOCK_CONFIGURED == TRUE)
#include "NvM.h"                    /*for setramblockstatus api*/
#if (!defined(NVM_AR_RELEASE_MAJOR_VERSION) || (NVM_AR_RELEASE_MAJOR_VERSION != 4))
#error "AUTOSAR major version undefined or mismatched"
#endif
#if (!defined(NVM_AR_RELEASE_MINOR_VERSION) || (NVM_AR_RELEASE_MINOR_VERSION != 2))
#error "AUTOSAR minor version undefined or mismatched"
#endif
#endif//ECUM_CFG_NVM_BLOCK_CONFIGURED


#define ECUM_START_SEC_VAR_CLEARED_BOOLEAN
#include "EcuM_Cfg_MemMap.h"

/*If EcuM_OnGoOffOne() is not added via configuration then
 * hard coded callout stub will be enabled */
#ifndef ECUM_CFG_ON_GOOFFONE
/*Variable used to check,whether the execution reached the EcuM_OnGoOffOne() callout.*/
static volatile boolean EcuM_IsOnGoOffOneReached_b;
#endif

/*If EcuM_OnGoOffTwo() is not added via configuration then
 * hard coded callout stub will be enabled */
#ifndef ECUM_CFG_ON_GOOFFTWO
/*Variable used to check,whether the execution reached the EcuM_OnGoOffTwo() callout.*/
static volatile boolean EcuM_IsOnGoOffTwoReached_b;
#endif

/*If EcuM_AL_SwitchOff() is not added via configuration then
 * hard coded callout stub will be enabled */
#ifndef ECUM_CFG_AL_SWITCHOFF
/*Variable used to check,whether the execution reached the EcuM_AL_SwitchOff() callout.*/
static volatile boolean EcuM_IsALSwitchOffReached_b;
#endif

#define ECUM_STOP_SEC_VAR_CLEARED_BOOLEAN
#include "EcuM_Cfg_MemMap.h"

#ifndef ECUM_CFG_ON_GOOFFTWO
#if (ECUM_STARTUP_DURATION == TRUE) /*will activate the Run time measurement*/

#define ECUM_START_SEC_VAR_CLEARED_32
#include "EcuM_Cfg_MemMap.h"
/*To store the time taken for shutdown / reset*/
VAR( uint32, ECUM_VAR_CLEARED_32 ) EcuM_Shutdown_delta_us_u32;
#define ECUM_STOP_SEC_VAR_CLEARED_32
#include "EcuM_Cfg_MemMap.h"

#define ECUM_START_SEC_VAR_CLEARED_UNSPECIFIED
#include "EcuM_Cfg_MemMap.h"
VAR( EcuM_TimeTicks_tu64, ECUM_VAR_CLEARED_UNSPECIFIED ) EcuM_Shutdown_begin_ticks_u64;
VAR( EcuM_TimeTicks_tu64, ECUM_VAR_CLEARED_UNSPECIFIED ) EcuM_Shutdown_end_ticks_u64;
#define ECUM_STOP_SEC_VAR_CLEARED_UNSPECIFIED
#include "EcuM_Cfg_MemMap.h"



#endif//ECUM_STARTUP_DURATION
#endif//ifdef

/*************************************************************************************************
							CALLOUTS
*************************************************************************************************/

#define ECUM_START_SEC_CALLOUT_CODE
#include "EcuM_Cfg_MemMap.h"

/*************************************************************************************************
  Function name     :   EcuM_ErrorHook

  Description       :   In case of serious error conditions like consistancy check failure or
                        Ram check failure, ecuM will initiate this call. In such situations it is not possible to
                        continue processing and Ecu has to be stopped.
  Parameter         :   Std_ReturnType reason
  Return value      :   none

************************************************************************************/

FUNC(void , ECUM_CALLOUT_CODE) EcuM_ErrorHook(VAR(uint16, AUTOMATIC) reason )
{
    while(1);
}

/*************************************************************************************************
  Function name     :   EcuM_AL_SetProgrammableInterrupts

  Description       :   EcuM_AL_SetProgrammableInterrupts shall set the interrupts on ECUs with programmable
                        interrupts.
  Parameter         :   none
  Return value      :   none

************************************************************************************/
FUNC(void , ECUM_CALLOUT_CODE) EcuM_AL_SetProgrammableInterrupts(void)
{

}

/**********************************************************************************
  Function name     :   EcuM_DeterminePbConfiguration
  Description       :   This callout should evaluate some condition, like port pin or
                        NVRAM value, to determine which post-build configuration shall
                        be used in the remainder of the startup process. It shall load
                        this configuration data into a piece of memory that is accessible
                        by all BSW modules and shall return a pointer to the EcuM post-build
                        configuration as a base for all BSW module post-build configrations.
  Parameter (in)    :   None
  Parameter (inout) :   None
  Parameter (out)   :   None
  Return value      :   EcuM_ConfigType*
  Remarks           :
***********************************************************************************/
FUNC_P2CONST( EcuM_ConfigType , AUTOMATIC, ECUM_CALLOUT_CODE ) EcuM_DeterminePbConfiguration( void )
{
#if ECUM_STARTUP_DURATION == TRUE /*will activate the Run time measurement*/
    EcuM_DeterminePbConfiguration_begin_ticks_u64    =   EcuM_GetTicks();
#endif /*ECUM_STARTUP_DURATION*/
    /* Function definition can be added here , that is in between EcuM_DeterminePbConfiguration_begin_ticks_u64
     * and EcuM_DeterminePbConfiguration_end_ticks_u64. By this if project can measure the time duration
     * of this function*/

#if ECUM_STARTUP_DURATION == TRUE /*will activate the Run time measurement*/
    EcuM_DeterminePbConfiguration_end_ticks_u64    =   EcuM_GetTicks();
#endif /*ECUM_STARTUP_DURATION*/

    return(EcuM_EcuMConfigurations_cpcast[0]);
}

#ifndef ECUM_CFG_ON_GOOFFONE
/**********************************************************************************
  Function name     :   EcuM_OnGoOffOne
  Description       :   This call allows the system designer to notify that the GO OFF I
                        state is about to be entered.
  Parameter (in)    :   None
  Parameter (inout) :   None
  Parameter (out)   :   None
  Return value      :   None
  Remarks           :
***********************************************************************************/
FUNC(void , ECUM_CALLOUT_CODE) EcuM_OnGoOffOne(void )
{
    /*Update Flag variable to indicate that the execution reached the particular APi call.
     * Variable provided only for Debug purpose*/
    EcuM_IsOnGoOffOneReached_b = TRUE;

}
#endif

#ifndef ECUM_CFG_ON_GOOFFTWO
/**********************************************************************************
  Function name     :   EcuM_OnGoOffTwo
  Description       :   This call allows the system designer to notify that the GO OFF II
                        state is about to be entered.
  Parameter (in)    :   None
  Parameter (inout) :   None
  Parameter (out)   :   None
  Return value      :   None
  Remarks           :
***********************************************************************************/
FUNC(void , ECUM_CALLOUT_CODE) EcuM_OnGoOffTwo(void )
{
    /*Update Flag variable to indicate that the execution reached the particular APi call.
     * Variable provided only for Debug purpose*/
    EcuM_IsOnGoOffTwoReached_b = TRUE;
#if (ECUM_STARTUP_DURATION == TRUE) /*will activate the Run time measurement*/
    EcuM_Shutdown_end_ticks_u64 = EcuM_GetTicks();
    EcuM_Shutdown_delta_us_u32 = EcuM_GetDuration(EcuM_Shutdown_end_ticks_u64,EcuM_Shutdown_begin_ticks_u64);

#if (ECUM_CFG_NVM_BLOCK_CONFIGURED == TRUE)
    /*update the RAM variable in NV memory to the current shutdown target*/
    EcuM_Rb_dataShutdownInfo_st.ShutdownInfo.TimeMeasured = EcuM_Shutdown_delta_us_u32;
    (void)NvM_SetRamBlockStatus(NvMConf_NvMBlockDescriptor_ECUM_CFG_NVM_BLOCK,TRUE);
#endif//ECUM_CFG_NVM_BLOCK_CONFIGURED

#endif//ECUM_STARTUP_DURATION

/*NOTE to integrator: place the shutdown callouts below*/




}
#endif

#ifndef ECUM_CFG_AL_SWITCHOFF
/**********************************************************************************
  Function name     :   EcuM_AL_SwitchOff
  Description       :   This callout shall take the code for shutting off the power
                        supply of the ECU. If the ECU cannot unpower itself, a reset
                        may be an adequate reaction.
  Parameter (in)    :   None
  Parameter (inout) :   None
  Parameter (out)   :   None
  Return value      :   None
  Remarks           :
***********************************************************************************/
FUNC(void , ECUM_CALLOUT_CODE) EcuM_AL_SwitchOff(void )
{
    /*Update Flag variable to indicate that the execution reached the particular APi call.
     * Variable provided only for Debug purpose*/
    EcuM_IsALSwitchOffReached_b = TRUE;

}
#endif

/**********************************************************************************
  Function name     :   EcuM_AL_Reset
  Description       :   This callout shall take the code for resetting the ECU.
  Parameter (in)    :   reset - Type of reset to be performed.
  Parameter (inout) :   None
  Parameter (out)   :   None
  Return value      :   None
  Remarks           :
***********************************************************************************/

FUNC( void, ECUM_CALLOUT_CODE ) EcuM_AL_Reset( VAR(EcuM_ResetType, AUTOMATIC) reset )
{

}



/**********************************************************************************
  Function name     :   EcuM_CheckWakeup
  Description       :   this will be called from the corresponding driver when a wakeup is detected .
  Parameter (in)    :   wakeupSource.
  Parameter (inout) :   None
  Parameter (out)   :   None
  Return value      :   None
  Remarks           :
***********************************************************************************/

FUNC( void, ECUM_CALLOUT_CODE ) EcuM_CheckWakeup( VAR(EcuM_WakeupSourceType, AUTOMATIC) wakeupSource )
                        {

                        }




/**********************************************************************************
  Function name     :   EcuM_StartWakeupSources
  Description       :   This callout shall start the given wakeup source(s) so that they are ready to perform wakeup validation.
  Parameter (in)    :   wakeupSource.
  Parameter (inout) :   None
  Parameter (out)   :   None
  Return value      :   None
  Remarks           :
***********************************************************************************/

FUNC( void, ECUM_CALLOUT_CODE ) EcuM_StartWakeupSources( VAR(EcuM_WakeupSourceType, AUTOMATIC) wakeupSource )
                        {

                        }


/**********************************************************************************
  Function name     :   EcuM_StopWakeupSources
  Description       :   This callout shall stop the given wakeup source(s) after unsucessful wakeup validation..
  Parameter (in)    :   wakeupSource.
  Parameter (inout) :   None
  Parameter (out)   :   None
  Return value      :   None
  Remarks           :
***********************************************************************************/

FUNC( void, ECUM_CALLOUT_CODE ) EcuM_StopWakeupSources( VAR(EcuM_WakeupSourceType, AUTOMATIC) wakeupSource )
                        {

                        }


/**********************************************************************************
  Function name     :   EcuM_CheckValidation
  Description       :   This callout is called by EcuM to validate Wakeup source. if a valid wakeup is detected it shall send report to EcuM via EcuM_ValidateWakeupEvent.
  Parameter (in)    :   wakeupSource.
  Parameter (inout) :   None
  Parameter (out)   :   None
  Return value      :   None
  Remarks           :
***********************************************************************************/

FUNC( void, ECUM_CALLOUT_CODE ) EcuM_CheckValidation( VAR(EcuM_WakeupSourceType, AUTOMATIC) wakeupSource )
                        {

                        }

/**********************************************************************************
  Function name     :   EcuM_SwitchOsAppMode
  Description       :   This will be called from Master and Slave core Init api's. This is required for CalWup functionality.
                        In Master core this will be started after starting all cores
                        In Master and Slave core this will be called just before OS Start.
  Parameter (in)    :   None
  Parameter (inout) :   None
  Parameter (out)   :   None
  Return value      :   None
  Remarks           :
***********************************************************************************/

FUNC(void, ECUM_CALLOUT_CODE) EcuM_SwitchOsAppMode(void)
                        {

                        }

#if ECUM_SLEEP_SUPPORT_ENABLE
/**********************************************************************************
  Function name     :   EcuM_EnableWakeupSources
  Description       :   The ECU Manager Module calls EcuM_EnableWakeupSource to allow the system designer to notify
                        wakeup sources defined in the wakeupSource bitfield that SLEEP will be entered
                        and to adjust their source accordingly.
  Parameter (in)    :   wakeupSource
  Parameter (inout) :   None
  Parameter (out)   :   None
  Return value      :   None
  Remarks           :
***********************************************************************************/

FUNC(void, ECUM_CALLOUT_CODE) EcuM_EnableWakeupSources(VAR(EcuM_WakeupSourceType, AUTOMATIC) wakeupSource)
                        {

                        }

/**********************************************************************************
  Function name     :   EcuM_DisableWakeupSources
  Description       :   The ECU Manager Module calls EcuM_DisableWakeupSources to set the wakeup source(s) defined
                        in the wakeupSource bitfield so that they are not able to wake the ECU up.
  Parameter (in)    :   wakeupSource
  Parameter (inout) :   None
  Parameter (out)   :   None
  Return value      :   None
  Remarks           :
***********************************************************************************/

FUNC(void, ECUM_CALLOUT_CODE) EcuM_DisableWakeupSources(VAR(EcuM_WakeupSourceType, AUTOMATIC) wakeupSource)
                        {

                        }

/**********************************************************************************
  Function name     :   EcuM_CheckRamHash
  Description       :   This callout is intended to provide a RAM integrity test. The goal of this test is to ensure
                        that after a long SLEEP duration, RAM contents is still consistent.
  Parameter (in)    :   none
  Parameter (inout) :   None
  Parameter (out)   :   None
  Return value      :   uint8
  Remarks           :
***********************************************************************************/

FUNC(uint8, ECUM_CALLOUT_CODE) EcuM_CheckRamHash(void)
                        {

                        }

/**********************************************************************************
  Function name     :   EcuM_GenerateRamHash
  Description       :
  Parameter (in)    :   none
  Parameter (inout) :   None
  Parameter (out)   :   None
  Return value      :   none
  Remarks           :
***********************************************************************************/

FUNC(void, ECUM_CALLOUT_CODE) EcuM_GenerateRamHash(void)
                        {

                        }
#endif//ECUM_SLEEP_SUPPORT_ENABLE
#define ECUM_STOP_SEC_CALLOUT_CODE
#include "EcuM_Cfg_MemMap.h"

静态代码 

我们首先来看一些常用的函数解析,休眠涉及的API在这里就不在赘述了,有兴趣的读者可以参考《AUTOSAR_SWS_ECUStateManager.pdf》与《RTA-BSWReferenceGuide.pdf》中寻找详细的解析。

  • EcuM_MainFunction:函数周期调用,目的是在操作系统启动和运行时实现EcuM的所有活动。
  • EcuM_Init:初始化ECU状态管理器并执行启动过程。函数将永远不会返回(它调用Startos)。
  • EcuM_Shutdown:这个函数通常从OS关闭的回调函数处调用,它接管执行控制并执行EcuM_OnGoOffTwo以及EcuM_AL_SwitchOff活动。
  • EcuM_GoDown:指示ECU状态管理器模块进入关闭阶段。
  • EcuM_SelectShutdownTarget:选择ShutdownTarget。
  • EcuM_ErrorHook:如果出现其他错误条件,如包含检查失败或Ram检查失败,EcuM将启动此调用。在这种情况下,不可能继续处理,Ecu必须停止。
  • EcuM_DeterminePbConfiguration:返回一个指向完全初始化的EcuM_ConfigType结构的指针,该结构包含ECU Manager模块和所有其他BSW模块的Post Build配置数据。
  • EcuM_OnGoOffTwo:执行GO OFF II 动作。

下图为ETAS针对EcuM相关代码流程:


十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

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

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

相关文章

迷你主机Esxi 6.7挂载新硬盘

背景 硬件:零刻SER Pro 6 系统:vmware Exsi 6.7.0 Update 3 现有的硬盘槽位占满了,但空间不够用,想要通过USB外接移动硬盘来进行扩容。使用了一块250G的硬盘做测试。 步骤 TL;DR # 停止usbarbitrator服务 /etc/init.d/usbarbi…

django中,出现CSRF verification failed. Request aborted.错误

这是跨站点访问的防范机制&#xff0c;csrf是一个令牌&#xff0c;会验证登录&#xff0c;需要在setting中把 "django.middleware.csrViewMiddleware" 注释掉 并在html文件中的<body>内添加 {% csrf token %} 就可以了

③单细胞学习-pbmc的Seurat 流程

目录 1&#xff0c;数据读取 2&#xff0c;线粒体基因查看 3&#xff0c;数据标准化 4&#xff0c;识别高变基因 5&#xff0c;进行数据归一化 6&#xff0c;进行线性降维 7&#xff0c;确定细胞簇 8&#xff0c;UMAP/tSNE降维&#xff08;保存pbmc_tutorial.rds&#…

路由选路原则

5.2路由选路原则 路由就是报文从源端到目的端的路径。当报文从路由器到目的网段有多条路由可达时&#xff0c;路由器可以根据路由表中最佳路由进行转发。最佳路由的选取与发现此路由的路由协议的优先级、路由的度量有关。当多条路由的协议优先级与路由度量都相同时&#xff0c…

elasticsearch7.15实现用户输入自动补全

Elasticsearch Completion Suggester&#xff08;补全建议&#xff09; Elasticsearch7.15安装 官方文档 补全建议器提供了根据输入自动补全/搜索的功能。这是一个导航功能&#xff0c;引导用户在输入时找到相关结果&#xff0c;提高搜索精度。 理想情况下&#xff0c;自动补…

chap5 CNN

卷积神经网络&#xff08;CNN&#xff09; 问题描述&#xff1a; 利用卷积神经网络&#xff0c;实现对MNIST数据集的分类问题 数据集&#xff1a; MNIST数据集包括60000张训练图片和10000张测试图片。图片样本的数量已经足够训练一个很复杂的模型&#xff08;例如 CNN的深层…

【课程总结】Day4:信息论和决策树算法

前言 本章内容主要是学习机器学习中的一个重要模型&#xff1a;决策树&#xff0c;围绕决策树的应用&#xff0c;我们展开了解到&#xff1a;熵的定义、熵的计算、决策树的构建过程(基于快速降熵)、基尼系数等&#xff0c;从而使得我们对决策树有了直观认识。 熵的介绍 因为…

U盘损坏打不开?数据恢复攻略全解析

随着信息技术的飞速发展&#xff0c;U盘已成为我们日常工作和生活中不可或缺的数据存储工具。然而&#xff0c;当U盘突然损坏&#xff0c;无法打开时&#xff0c;我们往往会陷入焦虑和无助之中。本文将为大家详细解析U盘损坏打不开的原因&#xff0c;并提供两种有效的数据恢复方…

【stm32】stm32f407 ch340下载

一、接线 1、ch340 Vcc短接3v3 5v---------5v GND-----GND TX ------RX RX --------TX 2、stm32F407 如上图&#xff0c;我们需要进入isp下载模式&#xff0c;接线图如下 二、下载 使用FlyMcu选择你要下载的程序文件中的.hex文件&#xff0c; 然后配置图如下&#xff1…

5月安全月报 | 钓鱼事件频发,OKLink带你开启“防钓”模式

本月全网安全事件所造成的损失环比上升 27.27%&#xff0c;钓鱼与诈骗事件占比 60% 以上。 安全意识是您保护数字资产的第一道防线&#xff0c;OKLink 提供 40 头部区块链浏览器与一站式查询入口以及地址监控、代币授权查询和地址健康度等工具&#xff0c;为您的资产安全保驾护…

使用CS抓取WIN2012明文密码

目录 实验概述&#xff1a; 开始实验&#xff1a; 实验准备&#xff1a; 打开CS&#xff1a; 生成木马控制wind2012&#xff1a; 抓取明文密码&#xff1a; 实验概述&#xff1a; win2012及win10版本是不允许将明文密码储存在内存中的&#xff0c;此时我们…

大量path计算优化方案

1.影响path基础属性数据做key缓存&#xff0c;缓存的path应去除坐标变换&#xff0c;归一化。基础属性应满足CAB, BC-A 2.高频path操作以&#xff08;keykey操作&#xff09;做新key缓存。 3.高频修改高级属性&#xff0c;以新key属性变更做新key缓存。 4.key与id做中转映射&am…

【每日刷题】Day52

【每日刷题】Day52 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 2965. 找出缺失和重复的数字 - 力扣&#xff08;LeetCode&#xff09; 2. 350. 两个数组的交集 II …

C# FTP/SFTP 详解及连接 FTP/SFTP 方式示例汇总

文章目录 1、FTP/SFTP基础知识FTPSFTP 2、FTP连接示例3、SFTP连接示例4、总结 在软件开发中&#xff0c;文件传输是一个常见的需求。尤其是在不同的服务器之间传输文件时&#xff0c;FTP&#xff08;文件传输协议&#xff09;和SFTP&#xff08;安全文件传输协议&#xff09;成…

dolphinscheduler docker部署海豚mysql版本,docker重新封装正在运行服务为镜像

1.官方文档&#xff1a; https://dolphinscheduler.apache.org/zh-cn/docs/3.2.1/guide/installation/standalone#%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93 2.github: dolphinscheduler/docs/docs/zh/guide/howto/datasource-setting.md at 3.2.1-release apache/do…

【R基础】如何开始学习R-从下载R及Rstudio开始

文章目录 概要下载R流程下载Rstudio流程下载完成-打开 概要 提示&#xff1a;如何开始学习R-从下载R及Rstudio开始&#xff0c;此处我只是想下载指定版本R4.3.3 下载R流程 链接: R官网 文件下载到本地 下载文件展示 按照向导指示安装 下载Rstudio流程 链接: Rstudio官网…

深度学习-语言模型

深度学习-语言模型 统计语言模型神经网络语言模型语言模型的应用序列模型&#xff08;Sequence Model&#xff09;语言模型&#xff08;Language Model&#xff09;序列模型和语言模型的区别 语言模型&#xff08;Language Model&#xff09;是自然语言处理&#xff08;NLP&…

AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试5月31日预测第7弹

昨天的3D已命中&#xff01;今天继续基于8883的大底&#xff0c;使用尽可能少的条件进行缩号。好了&#xff0c;直接上结果吧~ 首先&#xff0c;888定位如下&#xff1a; 百位&#xff1a;7,6,5,8,9,3,2,0 十位&#xff1a;3,4,5,2,1,7,8,9 …

20240531在飞凌的OK3588-C开发板上跑原厂的Buildroot测试USB摄像头

20240531在飞凌的OK3588-C开发板上跑原厂的Buildroot测试USB摄像头 2024/5/31 20:04 USB摄像头分辨率&#xff1a;1080p&#xff08;1920x1080&#xff09; 默认编译Buildroot的SDK即可点亮USB摄像头。v4l2-ctl --list-devices v4l2-ctl --list-formats-ext -d /dev/video74 …

【UnityShader入门精要学习笔记】第十六章 Unity中的渲染优化技术 (下)

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 减少需要处…