1、概述
诊断事件管理器(Dem)处理并存储诊断监视器在软件组件(SW-Cs)和基本软件(BSW)模块中检测到的事件。存储的事件信息可以通过接口访问其他BSW模块或SW-Cs。下图显示了Dem配置。DemGeneral包含配置的全局部分,DemConfigSet包含多个配置部分。
2、启动行为
Dem_Prelnit函数通过使用Dem_ReportErrorStatus和Dem_ResetEventDebounceStatus初始化Dem模块处理事件和重置BSW模块上报的debounce计数器所需的内部状态。
在NVRAM管理器初始化之前,ECUM在ECU的启动阶段调用Dem_Prelnit函数。对于所有通过配置参数DemOperationCycleAutostart具有自动启动功能的操作周期,BSW模块可以通过Dem_ReportErrorStatus开始报告相关事件。
函数Dem_Init在ECU的启动阶段被调用,在NVRAM管理器完成恢复之后 NVRAM的数据。SWC之后初始化包括监视器在内的组件。函数Dem_Init也用于在调用Dem_Shutdown后重新初始化Dem模块。
Dem_Init的注意事项:在Dem模块的环境调用Dem_Init函数之前,Dem模块不会起作用。
3、诊断事件event定义
“诊断事件”定义了Dem模块可以处理的原子单元。“诊断事件”的状态表示监视器的结果。Dem通过RTE或其他BSW模块接收来自SW-C的监视器结果。
Dem模块使用Eventld来管理系统的“诊断事件”的状态,并对单个测试结果执行所需的操作,例如存储冻结帧。
Dem模块用Eventld和相关的EventName表示每个诊断事件。
所有监视器和BSW模块都使用Eventld作为符号EventName。Dem配置工具将符号名称替换为数字。
Eventld和相关的EventName在ECU配置所代表的Dem模块中是唯一的。
3.1、Event优先级
事件优先级定义为基于重要程度的事件排序。它用于确定在存储的事件数量超过最大内存条目数量(事件内存已满)的情况下,可以从事件内存中删除哪些错误条目。
每个受支持的事件都应分配一个优先级
优先级为1时优先级最高。优先级值越大,重要性越低。
3.2、Event occurrence
Dem模块应该为每个事件内存条目提供一个发生计数器。
如果相关的事件被输入到相应的事件内存中,Dem模块将初始化事件计数器的值为1。
如果配置参数DemOccurrenceCounterProcessing(参考DemGeneral)为DEM_PROCESS_OCCCTR_TF,如果相关事件已经存储在事件内存中,则每次UDS DTC状态位0 (TestFailed)从0到1转换触发,Dem模块将发生计数器加1。
如果配置参数DemOccurrenceCounterProcessing(参考DemGeneral)为DEM_PROCESS_OCCCTR_CDTC,如果相关事件已经存储在事件内存中并且UDS DTC状态位3 (ConfirmedDTC)等于1,则Dem模块将发生计数器增加1,由每次UDS DTC状态位0 (TestFailed)从0转换到1触发。
Dem模块将不再增加事件特定的发生计数器,如果它已经达到最大值255。
4、DTC的字节顺序
配置参数DemTypeOfDTCSupported(参考DemGeneral)用于选择ECU的DTC格式之一(参考Dem_DcmGetTranslationType)。这是确定要为ISO-14229-1[1]服务报告的DTC格式值所必需的。
Dem模块支持UDS、OBD、J1939三种DTC的不同DTC编号,且需要单独配置参数(参考DemConfigSet中的DemDTC和DemObdDTC参数)。
DTC支持三种格式(UDS、OBD和J1939)的任意组合,即同时使用一种、两种或三种格式。因此,Dem将在内部处理三个DTC值列表。报告的格式依赖于Dem_DTCFormatType或由相关API的上下文定义。
Dem将DTC值报告为字节0 = LowByte,字节1= MiddleByte,字节2= HighByte,字节3未使用的uint32。对于OBD DTC格式,只使用两个字节(HighByte, LowByte)。Dem服务应将这些dtc报告为字节1= LowByte,字节2= HighByte,字节3未使用,字节0= 0x00的uint32。
Dem应报告DTC值为字节0- LowByte,字节1 = MiddleByte,字节2 = HighByte,字节3未使用的uint32。]对于whh - obd DTC格式,只使用三个字节(HighByte, MiddleByte和LowByte)。Dem服务将这些dtc报告为一个uint32,其中字节1 = LowByte,字节2 = HighByte,字节0用作FTB(根据SAE J2012-DA)[14]。
Dem_GetDTCOfEvent函数将获取由Dem配置映射到Eventld的DTc。
5、Event Memory描述
事件内存”被定义为位于专用内存块中的一组事件记录。所述事件记录至少包括所述扩展事件状态和所述事件相关数据。
Dem应该支持主要的event memory
如果支持Dem应该支持额外的event memory
Dem应提供配置参数,以使故障内存大小适应ECU可用内存空间(参见配置参数DemMaxNumberEventEntry<…> in DemGeneral)。
下图展示了event memory的逻辑内存。
如果存在内存大小的限制,则必须提供事件内存的溢出指示和置换策略。
5.1、Event status management
“事件状态管理”是Dem记录和保留事件、事件状态和相关数据的能力。
Dem模块应提供报告事件状态的功能,允许诊断监视器通知Dem关于内部诊断测试的结果。
位于应用程序中的监视器应该在获得新的测试结果后立即调用函数(Dem_SetEventStatus)来报告事件状态。这将独立于Dem模块的当前状态完成。
Dem模块应该提供在不报告通过结果的情况下重置事件失败状态的能力。
注意:Dem_ResetEventStatus并不表示事件状态报告(就像Dem_SetEventStatus那样)。调用后,事件状态为不合格或未经过测试。
监视器将使用Dem_ResetEventStatus函数来停用跛行home并切换回正常操作。在这个时间点上,监视器通常没有经过ok测试,因此带有已测试和通过的Dem_SetEventStatus不能使用。
Dem_ResetEventStatus函数设置UDS DTC状态位0 (TestFailed)为0,如果配置了,则将UDS内部的debon算法复位为初始值。
注意:Dem_ResetEventStatus不会改变UDS DTC状态位6 (TestNotCompletedThisOperationCycle),也不会清除预先保存的冻结帧。
函数Dem_ResetEventStatus返回E_NOT_OK,如果事件已经测试过这个操作周期(UDS DTC状态位6 - TestNotCompletedThisOperationCycle设置为0)。
Dem模块应提供检索特定事件的当前UDS DTC状态字节的能力。
注意:函数Dem_GetEventStatus提供给SW-Cs或其他BSW模块(例如FiM)在事件级别上使用。Dcm在dtc级别使用Dem_DcmGetStatusOfDTC函数。
5.1.1、状态位更新
是使用同步还是异步事件处理是一个系统设计决策。如果一个事件是合格的,无论是通过报告(通过/不通过)还是达到计数器阈值,Dem都应该执行事件状态在报告函数(例如Dem SetEventStatus)中同步转换,至少对于以下状态位
• Bit 0 TestFailed
• Bit 1 TestFailedThisOperationCycle
• Bit 6 TestNotCompletedThisOperationCycle
根据设计决策(同步或异步事件处理),以下位的状态更新:
• Bit 2 PendingDTC
• Bit 3 ConfirmedDTC
• Bit 7 WarningIndicatorRequested
可能在稍后的时间点发生。”
理由:即时状态更新可能与即时故障反应相关,如功能抑制(FIM)的更新。
注意:如果状态更新是异步实现的,则需要一个排队机制来确保在计算位2,3和7时考虑应用于位0,1,4,5和6的所有更改。同样,与位2、位3和位7相关的所有处理和数据存储都需要排队(参见下图,下图描述了同步和异步事件处理设计的不同方法)。
5.1.2、状态位转换
对指定DTC执行clear命令后,Dem模块将UDS状态字节设置为0x50(准备位4和6置1,其他置0)。
备注:使用clear命令后,UDS状态字节的值同时代表该字节的下发状态(初始状态)。
Dem模块根据下图实现UDS DTC状态位0 (TestFailed)的状态位转换。
Dem模块支持配置参数DemStatusBitStorageTestFailed(参考DemGeneral)来判断UDS DTC状态位O (TestFailed)的信息是易失还是非易失。也就是需不需要进行NVM存储。
如果配置参数DemStatusBitStorageTestFailed设置为False,则Dem模块在power cycles (volatile)上不保留UDS DTC状态位0 (TestFailed)的信息。
如果配置参数DemStatusBitStorageTestFailed设置为True,则Dem模块会在上下电周期(非易失性)中保留UDS DTC状态位0 (TestFailed)的信息。
将bit1本周期内置位为1,可以参考下图的状态切换,注:如果使用PendingDTC位,或者Dem模块支持操作周期而不是电源周期(参考DemOperationCycleStatusStorage),则UDS DTC状态位1 (TestFailedThisOperationCycle)的信息是非易失的。
SWUDS DTC状态位2 (PendingDTC)信息需要非易失性存储。
注意:UDS DTC状态位3 (ConfirmedDTC)的信息是非易失性的(但也可以根据各自的事件内存项计算)。
注:UDS DTC状态位4 (TestNotCompletedSinceLastClear)的信息是非易失的。
注:UDS DTC状态位5 (TestFailedSinceLastClear)为非易失性。
注:如果使用PendingDTC位,或者Dem模块支持操作周期而不是电源周期(参考DemOperationCycleStatusStorage),则需要将DTC状态位6 (TestNotCompleteThisOperationCycle)的信息非易失性存储。
注:UDS DTC状态位7 (WarningIndicatorRequested)的信息可能不稳定(因为是根据分配的告警指示灯状态计算的)。
5.1.3、主动与被动状态
如果一个事件被认定为失败,它就变为活动事件。如果事件被限定为通过,它就变成被动事件。该状态可以从UDS DTC状态字节中获取。
由于在持久化存储能力(参考配置参数DemStatusBitStorageTestFailed)中,TestFailed位(UDS DTC状态位0)是可配置的,因此也会影响到主动/被动的含义:
·如果TestFailed位存储为非易失性,则“event active”= TestFailed = 1,“event passive”= TestFailed = 0。
·如果TestFailed位仅存储为易失性,则需要另外的信息(如果事件已经测试/报告了此电源周期)。只要这个信息不存在,主动/被动状态就是未定义的。
对于分配给操作周期类型DEM_OPCYC_POWER的事件, TestNotCompletedThisOperationCycle位表示关于“已测试/报告此电源周期”的信息。注意:还有ecu,其中所有监视器在启动阶段运行。在这种情况下,将主动/被动状态直接映射到TestFailed位也足够了。
5.2、Event memory management
事件内存管理定义为在Dem模块中添加、更新和删除事件内存条目的过程。Dem模块确定事件内存条目是新的还是当前存在于事件内存中。
通用诊断事件存储处理
5.2.1、事件保留
事件保留定义了Dem模块记录和处理事件(DTC)、DTC状态信息和事件相关数据(例如冻结帧、扩展数据)的能力。
处理流程如下:
市场上有几种不同的策略来分配事件内存条目。因此,Dem模块有能力配置主触发器(参见DemEventMemoryEntryStorageTrigger)来分配事件内存项。除了主触发器之外,可能还有次要触发器(参考DemFreezeFrameRecordTrigger),主要用于更新事件内存的内容(例如,拥有最近更新的FreezeFrames)。
5.2.2、清除event memory 条目
清除event memory 条目
0x14 04可以清除诊断信息,对应以下API
• Dem_ClearDTC (to CDDs, refer below)
• Dem_DcmClearDTC (for UDS to the Dcm)
• Dem_SetClearDTC (for OBD to SW-Cs)
• Dem_J1939DcmClearDTC (for J1939 to the J1939Dcm)
5.2.3、event memory溢出
如果事件内存已满,并且试图在该事件内存中存储额外的事件,则Dem模块应该对每个事件内存进行指示。
这个溢出指示可以用来触发Dem模块的进一步内部行为(例如位移策略)。此外,它还可以用于车间的附加故障分析。
Dem模块需要提供API Dem_GetEventMemoryOverflow来获取 Event memory的状态。
注意:此API可用于特定于供应商的诊断服务或其他特定于供应商的处理,并提供给sw - c以及复杂的设备驱动程序。
Dem模块需要提供API Dem_GetNumberOfEventMemoryEntries来获取 Event memory的编号。
如果Dem_<…>ClearDTC删除了该内存中的所有dtc,则相应的事件内存溢出指示将被重置。注意:在老化和删除单个dtc的情况下,事件内存的溢出指示不会重置以保留此状态信息,直到ECU接收到该特定事件内存的明确命令。ECU本身在正常操作期间不应更改此状态信息(因为它用于车间)。
存储时候假设已满内存,此时需要制定存储策略,例如利用存储事件,存储优先级等来依次FIFO替换。
内存缓存也是如此。(oro_Dlay_o +奥罗ono_Diay_o + ro)注意:如果在同一时间点存储了多个事件内存条目,则这些元素的时间顺序是未定义的。这取决于执行情况,首先报告或取代哪些条目。
5.3、Debouncing
Dem模块应通过使用配置容器DemDebounceAlgorithmClass来支持特定于事件的debounce算法配置。注意:这意味着可以为每个单独的事件指定一个特定的算法。
基于Count的Debounce,范围值是无符号数据-128 ~ +127,假设选择了基于Count的Debounce,是存在阈值的设置选项DemDebounceCounterFailedThreshold来定义失败限制。Count曾加的步长也需要有配置参数DemDebounceCounterIncrementStepSize
基于Count的Debounce示例如下:
Debounce也可以基于时间,基于时间每一个event均有一个内部时间参数。较长的消抖周期,为无符号类型。
Dem模块计算故障检测计数器(-128…+128根据内部定时器的值和范围,将内部定时器的值与外部定时器的值线性映射,如下图所示。
如果某个特定事件的内部消抖定时器已经被触发为预失败或该事件被限定为失败,监视器再次连续报告DEM_EVENT_STATUS_PREFAILED,则Dem模块不重新启动内部消抖定时器。
如果监视器报告DEM_EVENT_STATUS_FAILED,则Dem模块将内部debouncetimefailedthreshold设置为其配置的失败标准阈值(参考DemDebounceTimeFailedThreshold)。
当监视器报告DEM_EVENT_STATUS_PREPASSED时,Dem模块将启动内部debounce timer来限定所报告的事件是否通过。
当监视器报告DEM_EVENT_STATUS_PREPASSED时,Dem模块将启动内部debounce timer来限定所报告的事件是否通过。
如果某个特定事件的内部脱脱定时器已经触发为预通过,或者该事件被限定为已通过,监视器再次连续报告DEM_EVENT_STATUS_PREPASSED,则Dem模块不重新启动内部脱脱定时器。
Dem模块应提供配置参数demdebouncetimepasssedthreshold,用于定义特定于事件的延迟,指示通过的状态(非活动)。如果监视器报告DEM_EVENT_STATUS_PASSED,则Dem模块应将内部debouncetimepasssedthreshold设置为其配置的阈值,即通过的标准(参见demdebouncetimepasssedthreshold)。
故障检测计数器应该通过API Dem_GetFaultDetectionCounter来获取计数值。此值既可以在Dem内部,又可以处于监视器里面。
5.4、Event组合
事件组合定义了Dem模块将多个事件合并到一个DTC的能力。它是用来适应不同的监测结果,以一个重大故障,这是明确的可评估的服务。实现组合DTC的关键部分是计算其状态信息。组合的DTC状态字节来自所有相关事件的按位逻辑操作。
存储组合:配置参数“DemEventCombinationSupport”设置为“DEM_EVCOMB_ONSTORAGE”。合并后的DTC在单个事件内存项中存储和更新。
检索组合:配置参数DemEventCombinationSupport设置为DEM_EVCOMB_ONRETRIEVAL。每个事件存储在单独的事件内存位置中。
Disabled:配置参数DemEventCombinationSupport设置为DEM_EVCOMB_DISABLED,不使用事件组合
注意:对于OBD,也可以通过DemObdDTCRef多次分配相同的DTC号码。但与UDS和J1939 dtc不同的是,OBD dtc向Dcm报告多次。基于事件相关数据的配置,Dem模块允许两种不同类型的事件组合(将事件相关数据分配给组合事件/DTC或子事件)。注意:事件组合的主要用例是将多个事件(由Eventld表示)映射到仅一个DTC号。如果使用组合“on storage”,则Dem模块仅使用一个事件内存条目及其合并到DTC的所有事件的相关数据。如果使用组合检索,则每个事件都存储在单独的事件内存位置中,并具有自己的事件相关数据集。Dem模块处理合并的DTC,考虑到其相关的事件内存项。
假设选择清除组合DTC,应该清除所有的关联events。
合并DTC的故障检测计数器为子事件故障检测计数器的最大值。Dem_DcmGetNextFilteredDTCAndFDC (UDS Service 0x19 14)需要配置该组合故障检测指标值。注意:在事件组合被禁用的情况下,不允许从多个事件引用到同一个DTC。
5.5、诊断使能与存储条件
如果请求Dem模块支持启用条件,则Dem模块应提供API Dem_SetEnableCondition,接收特定启用条件的当前状态(条件是否满足)。
如果要求Dem模块支持启用条件,则Dem模块应提供为特定事件分配一个启用条件组(参见DemEnableConditionGroup)的能力,其中包括一个或多个启用条件(参见DemEnableCondition)。
注意:引入启用条件组是为了改进Dem模块的配置方法。如果大量事件总是依赖于相同的启用条件,那么选择一个已定义的启用条件组比为每个事件分配几个启用条件要省力得多。
如果请求Dem模块支持使能条件,则在诊断监视器报告事件(通过/失败或预通过/预失败,参考api)后,Dem模块将检查分配的使能条件。Dem_ReportErrorStatus 和 Dem_SetEventStatus)。
如果一个启用条件没有满足,所有来自swc (Dem_SetEventStatus))和BSW模块(dem_reportterrorstatus)的状态报告都将被Dem忽略(不改变UDS DTC状态字节)。
如果所有事件特定的启用条件都满足,则从此时间点开始,所有来自SW-Cs (Dem_SetEventStatus))和BSW模块(dem_reportterrorstatus)的状态报告都将被分配给这些条件。
5.6、事件相关数据
“事件相关数据”是在发生事件时存储的附加数据(其实也就是冻结帧与扩展帧),例如传感器值或时间戳/里程。ISO-14229-1[1]定义了两种不同类型的事件相关数据:快照数据(冻结帧)和扩展数据。存储的事件相关数据的数量或集合与OEM /故障密切相关,因此是可配置的。该数据由SW-C或其他BSW模块提供。
注意:确认DTC状态的存在并不一定意味着“事件相关数据”也是可用的。Dem模块不负责事件相关数据的有效性。事件相关数据的时间一致性取决于数据源和存储时间。
Dem模块提供了一个配置表,用于将事件相关数据(冻结帧和扩展数据)与特定的DTC编号等组合在一起。注意:这并没有定义一个特定的实现(例如,查找表,矩阵等)。此外,它还涉及配置数据之间的链接。事件由其事件Id、DTC值、配置的冻结帧和扩展的数据记录等来表征。
5.6.1、存储冻结帧数据
通常,有两种冻结帧配置选项:
(1)针对特定事件配置与非排放相关的冻结帧。冻结帧记录可以通过使用相对数字(计算或配置)来寻址,因此记录编号对于事件是唯一的(不是全局的)。
(2)排放相关的冻结帧是为特定ECU全局配置的(OBD法规只要求一个单一的冻结帧类别)。冻结帧记录可以通过使用值0x00来处理每个事件。
Dem模块应支持存储一个或多个由配置分配的冻结帧记录(参考DemFreezeFrame类)。
注意:一个冻结帧被表示为did(参考DemDidClass)或pid(参考DemPidClass)的列表。
注:由于实现原因,Dem通常需要为最大冻结帧大小乘以冻结帧数量保留内存。
如果DemEnvironmentDataCapture等于DEM_CAPTURE_SYNCHRONOuS_TO REPORTING,则可以使用一个队列来存储环境数据,直到数据被传输到事件内存。为了不丢失任何报告,需要将队列大小配置为在Dem_MainFunction的两个循环之间存储所有报告。
冻结帧也可对高度易失性数据进行预先存储,就是特定事件一旦出现了苗头,即使尚未完成形成逻辑闭环,也会将数据先存起来。
如果DemEnvironmentDataCapture等于DEM_CAPTURE_SYNCHRONOuS_TO REPORTING,则可以使用一个队列来存储环境数据,直到数据被传输到事件内存。为了不丢失任何报告,需要将队列大小配置为在Dem_MainFunction的两个循环之间存储所有报告。
预存储的数据在事件存储成功或事件存储失败时都会被丢弃。
当事件通过合格(UDS DTC状态位0从1变为0)时,Dem模块释放预先存储的针对该事件的冻结帧。
扩展数据记录包含与特定事件相关的附加信息,这些信息不包含在冻结帧中(扩展数据,例如频率计数器,老化计数器等)。根据基于DID或pid的冻结帧数据配置,扩展数据被划分为由其记录号定义的扩展数据记录。
扩展数据感觉是对自身相关数据的存储,不是记录产生DTC时刻的工况信息。
如果存在事件内存项,Dem模块将在配置的触发器(参考DemExtendedDataRecordTrigger)上捕获ExtendedDataRecord并将其存储到事件内存项中。在这种情况下,存储触发器不能分配事件内存项(由于事件保留),同时可能(由于老化)有合适的内存项,因此ExtendedDataRecord触发器应该再次尝试分配事件内存项。
5.7、老化诊断事件
Dem模块提供了从事件存储器中删除特定事件的能力,如果它的故障条件在一段时间(操作周期)内没有满足。这个过程被称为“老化”或“忘却”。
DemAgingCycleCounterThreshold或DemAgingCycleCounterThresholdForTFSLC(取决于哪个值更高)定义了完成老化周期的数量,之后事件内存条目将从事件内存中删除(老化)。
如果配置参数DemResetConfirmedBitOnOverflow设置为false,如果事件设置了UDS状态位3 (ConfirmedDTC),并且事件被判定为通过,并且没有存储在事件内存表项中,Dem模块将尝试分配事件内存表项以获取老化计数器。
注意:如果不可能分配事件内存项,则老化延迟,直到事件内存项可用为止。
如果配置参数DemResetConfirmedBitOnOverflow设置为false,并且发生事件内存项老化,则Dem模块检查是否有其他UDS状态位3 (ConfirmedDTC)设置为1,状态位0 (TestFailed)设置为0的事件。如果发现这样的事件,Dem将分配一个事件内存位置来获得一个老化计数器。
注意:选择事件的优先级是特定于实现的。
当事件老化计数器达到阈值DemAgingCycleCounterThreshold时,将UDS状态位3 (ConfirmedDTC)置为0。
注:其他UDS状态位不因对应事件老化而被修改.
Dem模块应该处理像新事件一样的未学习事件的再次出现,因为它们之前已经通过老化从事件内存中删除了。
Dem模块只允许处理(进一步计数)老化计数器的值,如果相关的事件存储在事件内存中并且被认定为通过。
注:老化与UDS状态位3 (ConfirmedDTC)无关,因此也与故障确认无关
事件老化时,Dem从事件内存中删除与事件相关的快照数据(冻结帧)和扩展数据记录。
6、BSW的故障处理
除了应用软件组件之外,基本软件(BSW)也可以检测错误(例如硬件驱动程序故障),特别是在启动期间。对于这些错误(与特定于应用程序的事件相比,数量很少),有一些额外的方面适用:
·错误可以在Dem完全初始化之前检测到
·错误可以在启动期间报告,信息需要缓冲,直到Dem完全可用
·在启动和关闭之间可以报告错误,信息需要缓冲,需要由Dem主函数处理
·事件内存中的条目可以有不同的配置(例如,不强调车间的冻结帧数据)。
由于BSW事件在事件内存中被视为正常的SW-C事件,因此它们也可以被分类(车间测试器中的可用性)、老化(参见第7.6.9章)和优先级(位移处理)。
Dem_ReportErrorStatus由BSW模块使用,从Dem模块预初始化的时间点开始报告错误。在Dem_Init中,将处理排队的事件。在正常运行时(完全初始化后),需要API Dem_ReportErrorStatus的排队机制来处理Dem模块主功能内上报的故障。
Dem模块应该提供一个缓冲机制(FIFO),将在Dem_Init之前通过Dem_ReportErrorStatus报告的事件排队为合格(失败/通过)或达到合格(Dem模块无法访问事件内存)。
Dem模块应提供缓冲机制(FIFO),以便在正常操作期间(在Dem模块已经初始化之后)通过Dem_ReportErrorStatus报告的事件队列。
Dem_ReportErrorStatus函数的队列大小可以通过配置参数DemBswErrorBufferSize来配置.
Dem应根据Dem_Init之前可以报告的事件数量来确定队列大小,即那些DemEvent Kind = DEM_EVENT_KIND_BSW和未定义DemReportBehavior或DemReportBehavior = REPORT_BEFORE_INIT的事件。如果配置了DemBswErrorBufferSize,它将覆盖队列的计算大小。
注意:在启动阶段,并非所有与事件相关的数据都可用。在Dem完全初始化之前,不能存储SW-C事件(SWC的启动应该在Dem之后)。
注意:在Dem_Init之前通过dem_reportterrorstatus报告的所有事件应该使用一个自动启动(DemOperationCycleAutostart设置为true)或持久存储(DemOperationCycleStatusStorage设置为true)的操作周期。
7、与其他模块的交互
7.1、SWC
在AUTOSAR ECU架构中,诊断事件管理器实现了AUTOSAR服务。这意味着Dem模块不专门与其他BSW模块通信,但是与RTE与SWC通信。
从BSW“Cmodule”Dem的角度来看,Dem服务与RTE之上的AUTOSAR软件组件之间存在三种依赖关系:
·应用程序访问Dem的API(作为c函数实现)(通过访问Dem服务组件)。
·根据请求的异步活动的结果通知应用程序(通过Dem的直接/间接RTE API)。
·Dem调用SWC的初始化函数。
这些依赖关系必须用AUTOSAR元模型来描述,这将有助于应用组件的SWC描述以及Dem服务的服务组件描述。
对SWCs的回调不使用端口定义参数的机制。相反,Dem配置机制必须确保回调被传递到配置的端口,并使用RTE(直接或间接)API调用该端口的正确操作。例如,不能将Eventld作为操作的第一个参数传递,因为监视器(和其他sw - c)不会显式地处理Eventld。
7.2、DCM
1、访问DTC和状态信息(通过特定API)
2、访问Event的相关数据(通过特定API)
3、清除DTC信息- API Dem_DcmClearDTC
4、控制DTC设置- API Dem_DcmEnableDTCSetting
5、异步Dcm操作
7.3、FIM
功能抑制管理器的目的是基于抑制条件(如检测到的错误)来控制(启用/禁用)软件组件中的功能实体。Dem对该功能的贡献是向FiM提供事件状态信息。
FiM使用SWCs提供的依赖项信息。
如果启用了DemTriggerFimReports(参见DemGeneral),则Dem模块应通过调用函数FiM_DemTriggerOnEventStatus来通知FiM模块所有事件。
7.4、NVM
通常,Dem模块使用非易失性内存块(可由NVRAM配置大小)来实现事件状态信息、事件相关数据和所需内部状态(例如启动时的检索状态)的永久存储。从Dem中使用的每个非易失性内存块也需要配置(参见DemNvRamBlockld)。所使用的非易失性存储器块的数量、类型和内容没有规定。这些问题应根据具体实施情况进行处理。NvM的使用也可以通过配置去激活(参考DemNvRamBlockld的多样性),这样Dem将只基于RAM工作。
如果NVM模块无法读取Dem模块的一些非易失性数据,Dem模块将用它们的初始值初始化所有非易失性数据。
注意:为了避免可读块和错误块之间的不一致,所有非易失性数据都被初始化。初始化是为了允许NvM模块的故障检测机制,将各自的读取错误报告给Dem模块(参见dem_reportterrorstatus)。这些错误表示有缺陷的NVRAM。
API Dem_Init完成后,Dem将完全运行。
Dem模块应为每个DTC提供配置参数DemlmmediateNvStorage(参见demdtattributes),以立即触发相应事件内存元素的存储,包括在非易失性内存(参见NvM_WriteBlock)中的事件相关数据。
如果为特定的DTC启用了立即非易失性存储,则Dem模块将触发新的事件内存项的存储,并且在事件相关数据的每次更改(事件内存项被更新)之后。
注意:对于立即存储的事件内存项,有必要在Dem_Init期间确保数据一致性(例如与事件状态字节)。注意:如果立即非易失性存储被禁用,事件内存条目及其事件相关数据将在关闭阶段持久存储。
如果为特定的DTC启用了立即非易失性存储,如果DTC的发生计数器达到配置定义的阈值,则Dem模块将不会触发该DTC的进一步立即写入NVRAM操作。参数 DemlmmediateNvStorageLimit(请参阅 DemGeneral)。
API Dem_Shutdown将完成Dem模块中所有挂起的操作,以准备将内部状态和数据传输到NVRAM。这个时候除非重新初始化,否则event memory是锁起来的。
对于需要改变的非易失性数据,Dem模块将在Dem_Shutdown之前或期间触发存储到NVRAM。
根据Dem的配置和实现,Dem_Shutdown后存储的与Dem_Shutdown相关的nvmblock拷贝到NVRAM的过程由ECU State Manager调用的API NvM_WriteAll执行。
如果在NvM完成将所有数据复制到NVRAM之前断开ECU电源,则这些数据将不完整/不一致或不存储。在下次启动时,再也找不到上一个工作周期的事件。因此,NVRAM Manager配置提供了数据一致性机制,比如冗余数据Blocks。
如果需要在Dem_Init和Dem_Shutdown之间存储和恢复数据,Dem模块将使用NVRAM Manager的api NvM_WriteBlock和NvM_ReadBlock。
注:NvM模块实现了块读写的重试机制。因此,Dem模块不为其非易失性的同类实现任何重试机制。
如果NVM模块无法写入Dem模块的(某些)非易失性数据,则Dem模块将忽略NVM报告的负返回值。
注意:如果写入非易失性Dem数据失败,则Dem模块无法执行任何适当的反应。
8、API说明
下图为Dem与其周边SW-Cs和BSW模块之间的接口。接口的描述应该给出这些关系的简单概述。
Dem与其他BSW模块之间的接口概述
Dem与Dcm的交互如下