You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SWC中获取完整冻结帧?(AUTOSAR测试场景背景)

在AUTOSAR SWC中获取完整冻结帧的方法

针对你的测试场景(ATS_DIAG_00247)和配置,我来一步步帮你理清怎么在SWC里拿到关联E06事件的完整冻结帧,以及访问其中的FreezeFrameCounter成员:

核心逻辑先明确

首先得记住:AUTOSAR里,冻结帧是由DEM模块负责存储和管理的,SWC不能直接访问DEM的内部数据,必须通过DEM提供的标准化Client API来获取——这是架构要求,别想着直接读内存哈。

你的配置里,E06事件的冻结帧是同步捕获(DemEnvironmentDataCapture = DEM_CAPTURE_SYNCHRONOUS_TO_REPORTING),而且只包含FreezeFrameCounter一个uint32成员,这会让获取过程更简单。

具体步骤

1. 找到DEM生成的冻结帧结构体类型

在你的项目中,DEM模块会根据配置自动生成头文件(通常是Dem.h),里面已经定义好了对应E06事件的冻结帧结构体,比如:

typedef struct {
    uint32 FreezeFrameCounter;
} Dem_FreezeFrame_E06Type;

不要自己手动定义这个结构体,直接用DEM生成的类型,避免成员顺序、内存对齐等问题导致的错误。

2. 调用DEM的API获取冻结帧

DEM提供的获取冻结帧的核心API通常是Dem_GetFreezeFrame(不同AUTOSAR版本可能略有差异,但功能一致)。调用方式如下:

#include "Dem.h"

void YourTestRunnable(void) {
    // 声明缓冲区存储冻结帧
    Dem_FreezeFrame_E06Type freezeFrameData;
    Std_ReturnType retStatus;

    // 调用API获取冻结帧:
    // 参数1:事件ID(你配置的DemConf_DemEvent_E06)
    // 参数2:冻结帧记录索引(你的配置里只有1个,填0即可)
    // 参数3:缓冲区地址(强制转换为uint8*是API要求)
    // 参数4:缓冲区大小
    retStatus = Dem_GetFreezeFrame(
        DemConf_DemEvent_E06,
        0U,
        (uint8*)&freezeFrameData,
        sizeof(Dem_FreezeFrame_E06Type)
    );

    // 检查获取是否成功
    if (retStatus == E_OK) {
        // 成功拿到冻结帧,现在可以访问FreezeFrameCounter
        uint32 capturedCounter = freezeFrameData.FreezeFrameCounter;
        // 这里执行你的测试逻辑:对比预存的Counter值
    } else {
        // 处理失败情况:比如冻结帧还未被捕获、事件ID无效等
        // 结合你的测试场景,这里可能需要先确认故障事件已经上报成功
    }
}

3. 结合你的测试场景的注意点

你的测试流程是“预存Counter → 2秒后上报故障 → 检查冻结帧Counter”,这里要注意:

  • 因为你配置的是DEM_CAPTURE_SYNCHRONOUS_TO_REPORTING,冻结帧会在故障事件上报的瞬间同步捕获。所以如果你的“预存Counter”是在上报前2秒做的,那测试会失败——除非你是先手动触发冻结帧捕获,再上报故障?
  • 如果你需要提前捕获冻结帧(比如预存时刻的Counter),可以调用Dem_CaptureFreezeFrame API主动触发捕获,再上报故障,这样冻结帧里的Counter就是你预存的那个值。调用示例:
    // 预存当前Counter后,主动触发冻结帧捕获
    Dem_CaptureFreezeFrame(DemConf_DemEvent_E06, 0U);
    // 等待2秒后上报故障
    Dem_SetEventStatus(DemConf_DemEvent_E06, DEM_EVENT_STATUS_FAILED);
    

额外要确认的配置

  • 确保你的SWC在AUTOSAR工具中已经依赖了DEM的Client接口,这样才能生成允许调用DEM API的代码,否则编译会报错。
  • 检查DemAgingAllowed = FALSE的配置:这意味着冻结帧不会被老化清除,所以一旦捕获就会一直存在,直到故障被清除,符合你的测试需求。

内容的提问来源于stack exchange,提问作者Wreigh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:16:39