Добавлены DTC (сброс)

This commit is contained in:
cfif 2026-09-01 11:43:21 +03:00
parent fb1a1f04a3
commit d69de48d13
16 changed files with 119 additions and 55 deletions

View File

@ -7,9 +7,9 @@ M_VECTOR_RAM_SIZE = 0x0400;
_BootloaderSize = 64K;
_BootloaderBegin = 0x01000000; /* BANK1 */
_FirmwareSize = 704K;
_FirmwareSize = 768K;
_MetadataSize = 256;
_FirmwareSize_CALIB = 256K;
_FirmwareSize_CALIB = 192K;
_FirmwareMainBegin = _BootloaderBegin + _BootloaderSize;
_FirmwareMetaBegin = _FirmwareMainBegin + _FirmwareSize - _MetadataSize;
@ -31,12 +31,12 @@ MEMORY
SRAM1 (RW) : ORIGIN = 0x21010000, LENGTH = 0x00008000 /* 32KB */
PFLASH_BOOT (RW) : ORIGIN = _BootloaderBegin, LENGTH = _BootloaderSize /* 64K */
PFLASH_MAIN (RW) : ORIGIN = _FirmwareMainBegin, LENGTH = _FirmwareSize /* 704K */
PFLASH_MAIN (RW) : ORIGIN = _FirmwareMainBegin, LENGTH = _FirmwareSize /* 768K */
PFLASH_MAIN_META (RW) : ORIGIN = _FirmwareMetaBegin, LENGTH = _MetadataSize /* 256 */
PFLASH_CALIB (RW) : ORIGIN = _FirmwareCalibBegin, LENGTH = _FirmwareSize_CALIB /* 256K */
PFLASH_CALIB (RW) : ORIGIN = _FirmwareCalibBegin, LENGTH = _FirmwareSize_CALIB /* 192K */
PFLASH_CALIB_META (RW) : ORIGIN = _FirmwareMetaCalibBegin, LENGTH = _MetadataSize /* 256 */
PFLASH_R_MAIN (RW) : ORIGIN = _FirmwareRecoveryBegin, LENGTH = _FirmwareSize /* 704K */
PFLASH_R_MAIN (RW) : ORIGIN = _FirmwareRecoveryBegin, LENGTH = _FirmwareSize /* 768K */
PFLASH_R_MAIN_META (RW) : ORIGIN = _FirmwareRecoveryMetaBegin, LENGTH = _MetadataSize /* 256 */
PFLASH_R_CALIB (RW) : ORIGIN = _FirmwareRecoveryCalibBegin, LENGTH = _FirmwareSize_CALIB /* 192K */
PFLASH_R_CALIB_META (RW) : ORIGIN = _FirmwareRecoveryMetaCalibBegin, LENGTH = _FirmwareSize_CALIB /* 256 */

View File

@ -76,7 +76,7 @@ extern uint32_t SystemCoreClock;
#define configTICK_RATE_HZ ((TickType_t)1000)
#define configMAX_PRIORITIES ( 56 )
#define configMINIMAL_STACK_SIZE ((uint16_t)64)
#define configTOTAL_HEAP_SIZE ((size_t)20 * 1024)
#define configTOTAL_HEAP_SIZE ((size_t)28 * 1024)
#define configMAX_TASK_NAME_LEN ( 16 )
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0

View File

@ -49,7 +49,7 @@ SET(VECT_TAB_OFFSET "0x00000")
#-- Defines --------------------------------------------------------------------
ADD_DEFINITIONS(-DLFS_NO_MALLOC=1)
#ADD_DEFINITIONS(-DLFS_NO_MALLOC=1)
ADD_DEFINITIONS(-DINTERNAL_HW_YEAR=${INTERNAL_HW_YEAR})
ADD_DEFINITIONS(-DINTERNAL_HW_MONTH=${INTERNAL_HW_MONTH})

View File

@ -51,9 +51,7 @@ extern "C"
{
#endif
extern void * pvPortMalloc( size_t xSize );
extern void vPortFree( void * pv );
#include "freertos_os2.h" // Configuration check and setup
// Macros, may be replaced by system specific wrappers. Arguments to these
// macros must not have side-effects as the macros can be removed for a smaller
@ -240,12 +238,12 @@ static inline void *lfs_malloc(size_t size) {
#if defined(LFS_MALLOC)
return LFS_MALLOC(size);
#elif !defined(LFS_NO_MALLOC)
void *p = malloc(size);
return p;
// void *p = pvPortMalloc(size);
// void *p = malloc(size);
// return p;
void *p = pvPortMalloc(size);
return p;
#else
(void)size;
return NULL;
@ -258,8 +256,8 @@ static inline void lfs_free(void *p) {
LFS_FREE(p);
#elif !defined(LFS_NO_MALLOC)
// vPortFree(p);
free(p);
vPortFree(p);
// free(p);
//free(p);
#else
(void)p;

View File

@ -8,10 +8,10 @@
#include "stdint.h"
#define ADR_META_BOOT (0x01000000 + (64 * 1024) - 256)
#define ADR_META_MAIN (0x01000000 + ((64 + 704) * 1024) - 256)
#define ADR_META_MAIN (0x01000000 + ((64 + 768) * 1024) - 256)
#define ADR_META_MAPPED_BOOT (0x01100000 + (64 * 1024) - 256)
#define ADR_META_MAPPED_MAIN (0x01100000 + ((64 + 704) * 1024) - 256)
#define ADR_META_MAPPED_MAIN (0x01100000 + ((64 + 768) * 1024) - 256)
extern volatile const uint32_t META_FW_CRC;

View File

@ -32,8 +32,8 @@
#define ADR_HEX_Mapped_BlockCalib 0x011C0000
#define SIZE_HEX_BlockBoot (64 * 1024)
#define SIZE_HEX_BlockMain (704 * 1024)
#define SIZE_HEX_BlockCalib (256 * 1024)
#define SIZE_HEX_BlockMain (768 * 1024)
#define SIZE_HEX_BlockCalib (192 * 1024)
#define LEN_DEBUG_UDS_BUFF 128

View File

@ -95,8 +95,8 @@ static _Noreturn void Mma_Thread(tMma *env) {
ModelTask_StartThread(&env->ModelTask);
LoggerInfoStatic(LOGGER, LOG_TASK_ARB, "Waiting for the model to run...")
while (!env->ModelTask.isRunning) {
LoggerInfoStatic(LOGGER, LOG_TASK_ARB, "Waiting for the model to run...")
SystemDelayMs(1);
}

View File

@ -11,7 +11,7 @@ uint32_t __attribute__((section(".stack_data"))) tAdc1Task_stack[384];
uint32_t __attribute__((section(".stack_data"))) tCanSpamDebugTransmitter_stack[384];
uint32_t __attribute__((section(".stack_data"))) tCanSpamReceiver_stack[384];
uint32_t __attribute__((section(".stack_data"))) tCanSpamTransmitter_stack[384];
uint32_t __attribute__((section(".stack_data"))) tCanUds_stack[384];
uint32_t __attribute__((section(".stack_data"))) tCanUds_stack[512];
uint32_t __attribute__((section(".stack_data"))) tCommandLine_stack[512];
uint32_t __attribute__((section(".stack_data"))) tMma_stack[512];
//uint32_t __attribute__((section(".stack_data"))) tIndication_stack[128];

View File

@ -16,7 +16,7 @@ extern uint32_t __attribute__((section(".stack_data"))) tAdc1Task_stack[384];
extern uint32_t __attribute__((section(".stack_data"))) tCanSpamDebugTransmitter_stack[384];
extern uint32_t __attribute__((section(".stack_data"))) tCanSpamReceiver_stack[384];
extern uint32_t __attribute__((section(".stack_data"))) tCanSpamTransmitter_stack[384];
extern uint32_t __attribute__((section(".stack_data"))) tCanUds_stack[384];
extern uint32_t __attribute__((section(".stack_data"))) tCanUds_stack[512];
extern uint32_t __attribute__((section(".stack_data"))) tCommandLine_stack[512];
extern uint32_t __attribute__((section(".stack_data"))) tMma_stack[512];
//extern uint32_t __attribute__((section(".stack_data"))) tIndication_stack[128];

View File

@ -612,21 +612,13 @@ void InitWakeupModel(tModelTask *env) {
#define SLEEP_TIME 3000
static uint8_t fileBuffer[2048];
struct lfs_file_config file_cfg = {
.buffer = fileBuffer, // Указываем статический буфер
.attrs = NULL,
.attr_count = 0
};
lfs_file_t file;
static _Noreturn void ModelTask_Thread(tModelTask *env) {
lfs_soff_t lfs_err = lfs_file_opencfg(&fs.lfs, &file, "/dtc.bin", LFS_O_RDONLY, &file_cfg);
uint32_t timeDTC = SystemGetMs() + 5000;
lfs_soff_t lfs_err = lfs_file_open(&fs.lfs, &file, "dtc.bin", LFS_O_RDONLY);
uint32_t timeDTC = SystemGetMs() + 500;
if (lfs_err == LFS_ERR_OK) {
@ -634,6 +626,8 @@ static _Noreturn void ModelTask_Thread(tModelTask *env) {
if (reading != sizeof(dtc_state_error)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Error read dtc.bin");
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Read dtc.bin - OK");
}
lfs_file_close(&fs.lfs, &file);
@ -904,7 +898,7 @@ static _Noreturn void ModelTask_Thread(tModelTask *env) {
memcpy(env->dtc_state_error, rtY.dtc_state_error_model, sizeof(env->dtc_state_error));
if (SystemGetMs() > timeDTC) {
set_Dtc_state(env->diagnostic, &file, &file_cfg, &env->ccu_candb_tx.CCU_Errors, env->dtc_state_error,
set_Dtc_state(env->diagnostic, &env->ccu_candb_tx.CCU_Errors, env->dtc_state_error,
env->GET_HVAC_VIN, &env->CAN_ERROR_MISSLE, &env->CAN_TIME_MISSLE);
}
//конец--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ DTC-------------------------------------------

View File

@ -14,7 +14,7 @@
#define LOG_SIGN "DIAGNOSTIC"
#define LOGGER env->logger
const char* DTC_Error_Code_Strings[COUNT_DTC_CODE_ERROR] = {
const char *DTC_Error_Code_Strings[COUNT_DTC_CODE_ERROR] = {
"DTC_CCU_POWER_SUPPLY_VOLTAGE_OUT_OF_RANGE", // 0xA0101C
"DTC_IGNITION_VOLTAGE_OUT_OF_RANGE", // 0xA0111C
"DTC_REAR_HVAC_AROMA_CONFIG_INVALID", // 0xA02056
@ -161,16 +161,47 @@ void Diagnostic_Init(tDiagnostic *env, tLoggerInterface *logger) {
// osPriorityNormal);
}
extern lfs_file_t file;
uint32_t diagnostic_ClearDiagnosticInformation_14(tDiagnostic *env) {
if (osMutexAcquire(env->access, 5000) == osOK) {
// for (uint8_t i = 0; i < COUNT_DTC_CODE_ERROR; ++i) {
// Тест DTC не был выполнен с момента последней очистки
// dtc_state_error[i] |= UDS_dtc_mask_testNotCompletedSinceLastClear;
// dtc_state_FIX_error[i] |= UDS_dtc_mask_testNotCompletedSinceLastClear;
// }
env->isCleanDTC = true;
// memset(dtc_state_error, 0, sizeof(dtc_state_error));
/*
lfs_soff_t lfs_err = lfs_remove(&fs.lfs, "dtc.bin");
if (lfs_err == LFS_ERR_OK) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Clean dtc.bin - OK");
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Clean dtc.bin - ERROR");
}
*/
/*
lfs_soff_t lfs_err = lfs_file_open(&fs.lfs, &file, "dtc.bin", LFS_O_WRONLY);
if (lfs_err == LFS_ERR_OK) {
int writes = lfs_file_write(&fs.lfs, &file, dtc_state_error, sizeof(dtc_state_error));
if (writes != sizeof(dtc_state_error)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Error write dtc.bin")
LoggerInfoStatic(LOGGER, LOG_SIGN, "Clean dtc.bin - ERROR");;
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Write dtc.bin - OK");
LoggerInfoStatic(LOGGER, LOG_SIGN, "Clean dtc.bin - OK");
}
lfs_err = lfs_file_close(&fs.lfs, &file);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Error clear dtc.bin");
}
*/
osMutexRelease(env->access);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Access error diagnostic_ClearDiagnosticInformation_14");
@ -390,12 +421,20 @@ static void setErrorDTC_CAN(uint8_t *dtc_state_error_model, ccu_candb_error_miss
}
}
void set_Dtc_state(tDiagnostic *env, lfs_file_t *file, struct lfs_file_config *file_cfg, CCU_Errors_t *CCU_Errors,
void set_Dtc_state(tDiagnostic *env, CCU_Errors_t *CCU_Errors,
uint8_t *dtc_state_error_model, char *VIN,
ccu_candb_error_missing_rx_t *CAN_ERROR_MISSLE, ccu_candb_time_missing_rx_t *CAN_TIME_MISSLE) {
if (osMutexAcquire(env->access, 5000) == osOK) {
if (env->isCleanDTC) {
env->isCleanDTC = false;
memset(dtc_state_error, 0, sizeof(dtc_state_error));
}
for (uint8_t i = 0; i < COUNT_DTC_CODE_ERROR; ++i) {
if (dtc_state_error_model[i]) {
dtc_state_error_model[i] = DTC_TEST_FAILED_CONFIRMED;
@ -409,31 +448,62 @@ void set_Dtc_state(tDiagnostic *env, lfs_file_t *file, struct lfs_file_config *f
if (memcmp(dtc_state_error, dtc_state_error_model, sizeof(dtc_state_error)) != 0) {
bool isDTC_FileWrite = false;
LoggerInfoStatic(LOGGER, LOG_SIGN, "begin------------------------------DTC-------------------------------")
for (uint8_t i = 0; i < COUNT_DTC_CODE_ERROR; ++i) {
if (dtc_state_error_model[i]) {
LoggerFormatInfo(LOGGER, LOG_SIGN, "DTC: %s", DTC_Error_Code_Strings[i])
if ((dtc_state_error[i] & DTC_TEST_CONFIRMED) != (dtc_state_error_model[i] & DTC_TEST_CONFIRMED)) {
isDTC_FileWrite = true;
}
bool failed = false;
bool confirmed = false;
if (dtc_state_error_model[i] & DTC_TEST_FAILED) {
failed = true;
}
if (dtc_state_error_model[i] & DTC_TEST_CONFIRMED) {
confirmed = true;
}
LoggerFormatInfo(LOGGER, LOG_SIGN, "DTC: %s (CONFIRMED: %d FAILED: %d)", DTC_Error_Code_Strings[i],
confirmed, failed)
}
}
LoggerInfoStatic(LOGGER, LOG_SIGN, "end------------------------------DTC---------------------------------")
memcpy(dtc_state_error, dtc_state_error_model, sizeof(dtc_state_error));
lfs_soff_t lfs_err = lfs_file_opencfg(&fs.lfs, file, "/dtc.bin", LFS_O_RDWR | LFS_O_CREAT, file_cfg);
if (isDTC_FileWrite) {
if (lfs_err == LFS_ERR_OK) {
int writes = lfs_file_write(&fs.lfs, file, dtc_state_error, sizeof(dtc_state_error));
if (writes != sizeof(dtc_state_error)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Error write dtc.bin");
for (uint8_t i = 0; i < COUNT_DTC_CODE_ERROR; ++i) {
dtc_state_error_model[i] = dtc_state_error[i] & (~(DTC_TEST_FAILED));
}
lfs_err = lfs_file_close(&fs.lfs, file);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Write dtc.bin");
lfs_soff_t lfs_err = lfs_file_open(&fs.lfs, &file, "dtc.bin", LFS_O_WRONLY | LFS_O_CREAT);
if (lfs_err == LFS_ERR_OK) {
int writes = lfs_file_write(&fs.lfs, &file, dtc_state_error_model, sizeof(dtc_state_error));
if (writes != sizeof(dtc_state_error)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Error write dtc.bin");
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Write dtc.bin - OK");
}
lfs_err = lfs_file_close(&fs.lfs, &file);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Error open (write) dtc.bin");
}
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Error open (write) dtc.bin");
}
asm("nop");
}

View File

@ -25,11 +25,13 @@ typedef struct {
bool isNoBitsDTC;
bool isCleanDTC;
} tDiagnostic;
void Diagnostic_Init(tDiagnostic *env, tLoggerInterface *logger);
void set_NoBitsDTC(tDiagnostic *env, bool noBitsDTC);
void set_Dtc_state(tDiagnostic *env, lfs_file_t *file, struct lfs_file_config *file_cfg, CCU_Errors_t *CCU_Errors, uint8_t *dtc_state_error_model, char *VIN,
void set_Dtc_state(tDiagnostic *env, CCU_Errors_t *CCU_Errors, uint8_t *dtc_state_error_model, char *VIN,
ccu_candb_error_missing_rx_t *CAN_ERROR_MISSLE, ccu_candb_time_missing_rx_t *CAN_TIME_MISSLE);
uint32_t diagnostic_ClearDiagnosticInformation_14(tDiagnostic *env);
uint32_t diagnostic_UDS_ReadDTCInformation_19_count(tDiagnostic *env, tDiagnosticDTC *diagnosticDTC);

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -2,7 +2,7 @@
echo "=== Processing HVAC Firmware ==="
# Разделение файла
./fc_bin_hvac --split 0xB0000 --output1 HVAC_MAIN.bin --output2 HVAC_CALIB.bin HVAC_M7.bin && \
./fc_bin_hvac --split 0xC0000 --output1 HVAC_MAIN.bin --output2 HVAC_CALIB.bin HVAC_M7.bin && \
echo "✓ Split OK" || { echo "✗ Split failed"; exit 1; }
# Запись CRC в MAIN файл