文章目錄
- 摘要
摘要
在一些可以不使用AUTOSAR的項目中,往往也有故障檢測和DTC存儲的需求,開發一套類似于AUTOSAR DEM模塊的軟件代碼,能夠滿足DTC的檢出和存儲,使用FalshDB代替Nvm模塊,輕松構建持久化存儲,如果你也有這樣的需求,請閱讀本篇,希望能夠幫到你。
/********************************************************************************* @file dem.c* @brief DEM模塊實現 - 基于FlashDB的故障管理* @note 支持功能:* - DTC狀態管理(當前/歷史故障)* - 故障計數器* - 快照功能* - FlashDB持久化存儲*******************************************************************************/
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "fdb.h"
#include "stm32f4xx_hal.h"/* 配置區 - 根據實際硬件調整 -------------------------------------------------*/
#define DEM_DB_NAME "dem_db" // 數據庫名稱
#define DEM_MAX_DTC_ENTRIES 50 // 最大DTC條目數
#define DEM_CURRENT_THRESHOLD 3 // 當前故障確認閾值
#define DEM_HISTORY_MAX_COUNT 0xFF // 歷史故障最大計數/* 宏定義 --------------------------------------------------------------------*/
#define DTC_STATUS_CURRENT (0x01U) // 當前故障狀態位
#define DTC_STATUS_HISTORY (0x02U) // 歷史故障狀態位
#define DEM_SNAPSHOT_MAGIC (0xDEADC0DE) // 快照數據魔數/* 類型定義 ------------------------------------------------------------------*/
#pragma pack(push, 1) // 嚴格字節對齊
/*** @brief DTC條目存儲結構*/
typedef struct {uint32_t dtc_code; // DTC編碼 (SAE標準格式)uint8_t status; // 狀態位uint16_t current_counter; // 當前故障計數器uint16_t history_counter; // 歷史故障計數器uint32_t first_occurrence; // 首次發生時間戳uint32_t last_occurrence; // 最后發生時間戳
} DTC_Entry;/*** @brief 快照數據結構*/
typedef struct {uint32_t magic; // 魔數校驗uint32_t timestamp; // 快照時間戳uint16_t dtc_count; // 有效DTC數量DTC_Entry entries[]; // DTC條目數組
} DEM_Snapshot;
#pragma pack(pop)/* 模塊全局變量 --------------------------------------------------------------*/
static struct fdb_kvdb dem_kvdb; // FlashDB實例
static DTC_Entry dtc_list[DEM_MAX_DTC_ENTRIES];