Улучшение структуры с флагами

This commit is contained in:
2026-02-20 16:40:17 +03:00
parent 81dc223d98
commit b11e7cfa83
2 changed files with 38 additions and 30 deletions

View File

@@ -24,7 +24,7 @@
- Инициализировать каждый элемент структуры функцией @ref InitSettingsToMem - Инициализировать каждый элемент структуры функцией @ref InitSettingsToMem
- Добавить @ref WriteSettingsArrayToMem и @ref ReadSettingsArrayFromMem для записи/считывания - Добавить @ref WriteSettingsArrayToMem и @ref ReadSettingsArrayFromMem для записи/считывания
каждого элемента структуры в память каждого элемента структуры в память
- Выставлять флаг @ref update_settings_flag для записи настроек в память, - Выставлять флаг @ref f.settings_need_to_update для записи настроек в память,
когда необходимо это сделать (само по себе оно не может определить когда надо записать, когда необходимо это сделать (само по себе оно не может определить когда надо записать,
т.к. нет буфера для отслеживания изменений) т.к. нет буфера для отслеживания изменений)
@@ -58,30 +58,36 @@ typedef struct
#define MEMORY_ERROR_WRITE ((uint32_t)(1<<1)) ///< Бит ошибки - запись #define MEMORY_ERROR_WRITE ((uint32_t)(1<<1)) ///< Бит ошибки - запись
#define MEMORY_ERROR_READ ((uint32_t)(1<<2)) ///< Бит ошибки - чтение #define MEMORY_ERROR_READ ((uint32_t)(1<<2)) ///< Бит ошибки - чтение
typedef struct
{
unsigned settings_need_to_update:1;
unsigned settings_is_updated:1;
}SettingsFlagsTypeDef;
/** /**
* @brief Структура для хранения настроек устройства. * @brief Структура для хранения настроек устройства.
* @details Содержит указатели на настройки и другие параметры для их обработки. * @details Содержит указатели на настройки и другие параметры для их обработки.
*/ */
typedef struct typedef struct
{ {
MEMSPI_HandleTypeDef *hmemspi; ///< Указатель на хендл для работы с памятью MEMSPI_HandleTypeDef *hmemspi; ///< Указатель на хендл для работы с памятью
#ifdef SETTINGS_USE_WEAR_LEVELING_FLASH #ifdef SETTINGS_USE_WEAR_LEVELING_FLASH
ParamsFlashHandle_t flash_handle; ///< Хендл для равномерного использования флеш памяти ParamsFlashHandle_t flash_handle; ///< Хендл для равномерного использования флеш памяти
#endif #endif
#ifdef SETTINGS_USE_SETTINGS_FROM_BUFFER #ifdef SETTINGS_USE_SETTINGS_FROM_BUFFER
uint8_t *buffer; uint8_t *buffer;
#endif #endif
SettingArrayTypeDef setarr[32]; ///< Структура настроек для хранения в памяти SettingArrayTypeDef setarr[32]; ///< Структура настроек для хранения в памяти
uint8_t setarr_count; uint8_t setarr_count;
uint32_t start_adr; ///< Начальный адрес в памяти для записи настроек uint32_t start_adr; ///< Начальный адрес в памяти для записи настроек
uint32_t settings_size; ///< Размер всего массива настроек uint32_t settings_size; ///< Размер всего массива настроек
uint8_t update_settings_flag; ///< Флаг для обновления настроек в памяти SettingsFlagsTypeDef f; ///< Флаг для обновления настроек в памяти
uint32_t settings_error; ///< Флаг ошибки настроек uint32_t settings_error; ///< Флаг ошибки настроек
}SettingsTypeDef; }SettingsTypeDef;
extern SettingsTypeDef Settings; extern SettingsTypeDef Settings;

View File

@@ -112,37 +112,37 @@ void Settings_WriteSettings(SettingsTypeDef *settings)
settings->setarr[i].real_ptr, settings->setarr[i].real_ptr,
settings->setarr[i].length) != 0) settings->setarr[i].length) != 0)
{ {
settings->update_settings_flag = 1; settings->f.settings_need_to_update = 1;
break; break;
} }
} }
#endif #endif
if(settings->update_settings_flag) // if(settings->f.settings_need_to_update)
{ // {
// if(GPIO_Read_Switch(&MZKT_DISCIN.err_24V)) //// if(GPIO_Read_Switch(&MZKT_DISCIN.err_24V))
//// {
//// printf_memspi_err("Power Err, cancel writing");
//// settings->f.settings_need_to_update = 0;
//// update_start = 0;
//// return;
//// }
// if(msDelayDone(1000, &update_request_tick))
// { // {
// printf_memspi_err("Power Err, cancel writing"); // update_start = 1;
// settings->update_settings_flag = 0; // }
// update_start = 0; // }
// return; // else
// } // {
if(msDelayDone(1000, &update_request_tick)) // msDelayStart(&update_request_tick);
{ // update_start = 0;
update_start = 1; // }
}
}
else
{
msDelayStart(&update_request_tick);
update_start = 0;
}
settings->f.settings_is_updated = 0;
if(update_start) if(settings->f.settings_need_to_update)
{ {
// Сбрасываем флаг обновления // Сбрасываем флаг обновления
settings->update_settings_flag = 0; settings->f.settings_need_to_update = 0;
update_start = 0; update_start = 0;
#ifdef SETTINGS_USE_SETTINGS_FROM_BUFFER #ifdef SETTINGS_USE_SETTINGS_FROM_BUFFER
@@ -158,7 +158,9 @@ void Settings_WriteSettings(SettingsTypeDef *settings)
// Записываем настройки в память // Записываем настройки в память
WriteSettingsToMem(settings); WriteSettingsToMem(settings);
Settings_ReadSettings(settings);
Settings_CheckSettings(settings); Settings_CheckSettings(settings);
settings->f.settings_is_updated = 1;
__enable_irq(); __enable_irq();
} }
} }