Обновить логгер УМП и исправить запуск UART и EEPROM

Перейти на компактные 12-словные записи v4 и сохранять 10 процентов банка после отключения. Добавить трёхсекундное ожидание роста ЗПТ и настраиваемый лимит пусков. Явно инициализировать состояние UART и гарантировать публикацию параметров EEPROM перед запуском Timer2. Сохранить воспроизводимые сборки, регрессионные проверки, документацию и обновлённые результаты сборки; исключить временные артефакты.
This commit is contained in:
2026-10-12 12:25:41 +03:00
parent f741741cf8
commit 1e911e5250
38 changed files with 2089 additions and 1485 deletions
+16 -58
View File
@@ -75,19 +75,11 @@ static unsigned int ump_source, ump_post;
#define UMP_POST_POINTS (UMP_LOG_CAPACITY / 10U)
/* Замораживает заполненный банк и переключает рабочий банк, сохраняя доступный архив. */
static void ump_freeze(void);
/* Объявляет ump_can_header — ump CAN header; ump_can_data — ump CAN данные; ump_can_count — ump CAN число. */
static unsigned int ump_can_header, ump_can_data[3], ump_can_count;
/* Latest PM67 sums: register 306 (index 305), register 9 (index 8). */
/* Объявляет ump_pm67_voltage — данные ump_pm67_voltage. */
static unsigned int ump_pm67_voltage[2];
/* Объявляет ump_prev_commands — данные ump_prev_commands; ump_prev_inputs — данные ump_prev_inputs; ump_prev_outputs — данные ump_prev_outputs. */
static unsigned int ump_prev_commands, ump_prev_inputs, ump_prev_outputs;
/* Объявляет CanTimeOutErrorTR — CAN Time Out ошибка TR. Память определена в другом модуле. */
extern int CanTimeOutErrorTR;
/* Диагностика внутренних переменных разгона. Обновляется самим Load_runner,
* не пересчитывает и не изменяет управляющий алгоритм. */
/* Объявляет ump_dac_ramp — ump ЦАП ramp; ump_dac_duration — ump ЦАП duration; ump_dac_go10 — ump ЦАП go 10; ump_dac_stop10 — ump ЦАП stop 10; ump_dac_position — ump ЦАП position. */
unsigned int ump_dac_ramp, ump_dac_duration, ump_dac_go10, ump_dac_stop10, ump_dac_position;
/* Called once at boot, before enabling interrupts. TI COFF startup does
* not clear uninitialized globals in .ebss. Do not use for record restart:
@@ -110,18 +102,10 @@ void ump_log_init(void)
ump_archive_count = 0; ump_archive_next = 0; ump_generation = 0;
/* Записывает ump_source значением 0; ump_post = 0; данные ump_source. */
ump_source = 0; ump_post = 0;
/* Записывает ump_can_header значением 0; ump_can_count = 0; ump CAN header. */
ump_can_header = 0; ump_can_count = 0;
/* Цикл for (i = 0; i < 3; i++) ump_can_data[i] = 0;; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 3; i++) ump_can_data[i] = 0;
/* Цикл for (i = 0; i < 2; i++) ump_pm67_voltage[i] = 0;; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 2; i++) ump_pm67_voltage[i] = 0;
/* Записывает ump_prev_commands значением 0; ump_prev_inputs = 0; ump_prev_outputs = 0; данные ump_prev_commands. */
ump_prev_commands = 0; ump_prev_inputs = 0; ump_prev_outputs = 0;
/* Записывает ump_dac_ramp значением 0; ump_dac_duration = 0; ump_dac_go10 = 0; ump ЦАП ramp. */
ump_dac_ramp = 0; ump_dac_duration = 0; ump_dac_go10 = 0;
/* Записывает ump_dac_stop10 значением 0; ump_dac_position = 0; ump ЦАП stop 10. */
ump_dac_stop10 = 0; ump_dac_position = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
@@ -164,8 +148,8 @@ static void ump_capture(unsigned int reason)
{
/* Объявляет p — данные p. Хранит указатель на данные. volatile требует фактического чтения или записи при каждом доступе. */
volatile unsigned int *p;
/* Объявляет i — данные i; commands — данные commands; inputs — данные inputs; outputs — данные outputs. */
unsigned int i, commands, inputs, outputs;
/* Объявляет commands — данные commands; inputs — данные inputs; outputs — данные outputs. */
unsigned int commands, inputs, outputs;
/* Проверяет if (ump_state != 1 или Desk != dsk_LOAD или !READY) return; последующий оператор выполняется только при истинном условии. */
if (ump_state != 1 || Desk != dsk_LOAD || !READY) return;
/* Проверяет if (no_write или never_write); последующий оператор выполняется только при истинном условии. */
@@ -200,40 +184,20 @@ static void ump_capture(unsigned int reason)
if (ump_post && !(reason & 0x100) && --ump_post == 0) reason = 5;
/* Записывает p значением logs_block + ((unsigned long)ump_bank * UMP_LOG_CAPACITY + ump_next) * UMP_LOG_WORDS; данные p. */
p = logs_block + ((unsigned long)ump_bank * UMP_LOG_CAPACITY + ump_next) * UMP_LOG_WORDS;
/* Записывает p[0] значением (unsigned int)ump_time; p[1] = (unsigned int)(ump_time >> 16); данные p. */
/* Сохраняет 32-битное миллисекундное время младшим словом вперёд; это первые два слова записи v4. */
p[0] = (unsigned int)ump_time; p[1] = (unsigned int)(ump_time >> 16);
/* Записывает p[2] значением reason; p[3] = commands; данные p. */
p[2] = reason; p[3] = commands;
/* Записывает p[4] значением inputs; p[5] = outputs; данные p. */
/* Событие сохраняет причину и метку отключения; от команд остаются только нужные дискретные пуск и сброс, биты 7/6. */
p[2] = reason; p[3] = commands & 0xC0U;
/* Оставляет логические уровни входов и выходов для графиков START, STOP, OMEGA и разрешения нагрузки. */
p[4] = inputs; p[5] = outputs;
/* Записывает p[6] значением (unsigned int)IMPowse; p[7] = (unsigned int)WAKEpowse; данные p. */
p[6] = (unsigned int)IMPowse; p[7] = (unsigned int)WAKEpowse;
/* Записывает p[8] значением modbus[0x7B]; p[9] = modbus[0x1C]; данные p. */
p[8] = modbus[0x7B]; p[9] = modbus[0x1C];
/* Цикл for (i = 0; i < 4; i++) ; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 4; i++) { p[10+i] = sens_data[i]; p[14+i] = modbus[i]; }
/* Записывает p[18] значением ump_can_header; данные p. */
p[18] = ump_can_header;
/* Записывает p[19] значением ump_can_data[0]; p[20] = ump_can_data[1]; p[21] = ump_can_data[2]; данные p. */
p[19] = ump_can_data[0]; p[20] = ump_can_data[1]; p[21] = ump_can_data[2];
/* Записывает p[22] значением ump_can_count; p[23] = CanTimeOutErrorTR; данные p. */
p[22] = ump_can_count; p[23] = CanTimeOutErrorTR;
/* Исходные уставки — мА; эффективные уставки после ограничений — 0.1 мА.
* p[8] — отправленный код, а p[9] — расчётное задание, НЕ измерение тока. */
/* Записывает p[24] значением DAC_go; p[25] = DAC_stop; данные p. */
p[24] = DAC_go; p[25] = DAC_stop;
/* Записывает p[26] значением DAC_min(); p[27] = DAC_max(); p[28] = DAC_cal(); данные p. */
p[26] = DAC_min(); p[27] = DAC_max(); p[28] = DAC_cal();
/* Записывает p[29] значением DAC_04; p[30] = DAC_20; данные p. */
p[29] = DAC_04; p[30] = DAC_20;
/* Записывает p[31] значением ump_dac_ramp; p[32] = ump_dac_duration; данные p. */
p[31] = ump_dac_ramp; p[32] = ump_dac_duration;
/* Записывает p[33] значением ump_dac_go10; p[34] = ump_dac_stop10; p[35] = ump_dac_position; данные p. */
p[33] = ump_dac_go10; p[34] = ump_dac_stop10; p[35] = ump_dac_position;
/* Цикл for (i = 0; i < 4; i++) p[36+i] = ADC_table[i];; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 4; i++) p[36+i] = ADC_table[i];
/* Записывает p[40] значением ump_pm67_voltage[0]; p[41] = ump_pm67_voltage[1]; данные p. */
p[40] = ump_pm67_voltage[0]; p[41] = ump_pm67_voltage[1];
/* Задание тока берётся из регистра 0x1C в единицах 0,1 мА; это расчётная величина, а не измерение физического тока. */
p[6] = modbus[0x1C];
/* Сохраняет оставшиеся выбранные начальную и конечную уставки в целых мА. */
p[7] = DAC_go; p[8] = DAC_stop;
/* Оставляет оба ЗПТ в вольтах: CAN-индекс 305 относится к ЗПТ1, индекс 8 — к ЗПТ2. */
p[9] = ump_pm67_voltage[0]; p[10] = ump_pm67_voltage[1];
/* Резервное нулевое слово делает длину записи чётной: служебный CAN передаёт по два 16-битных слова за фрагмент. */
p[11] = 0;
/* Изменяет счётчик в выражении ump_next++; на один для следующего шага. */
ump_next++;
/* Проверяет if (ump_next == UMP_LOG_CAPACITY) ump_next = 0; последующий оператор выполняется только при истинном условии. */
@@ -338,12 +302,6 @@ void ump_log_can(unsigned int header, unsigned int a, unsigned int b, unsigned i
}
/* Проверяет if (ump_state != 1); последующий оператор выполняется только при истинном условии. */
if (ump_state != 1) { __restore_interrupts(saved); return; }
/* Записывает ump_can_header значением header; ump CAN header. */
ump_can_header = header;
/* Записывает ump_can_data[0] значением a; ump_can_data[1] = b; ump_can_data[2] = c; ump CAN данные. */
ump_can_data[0] = a; ump_can_data[1] = b; ump_can_data[2] = c;
/* Изменяет счётчик в выражении ump_can_count++; на один для следующего шага. */
ump_can_count++;
/* Вызывает ump_capture. Создаёт одну запись состояния: входы, выходы, команды, напряжения и параметры тока нагрузки. */
ump_capture(2);
/* Вызывает __restore_interrupts с аргументами (saved) в текущей последовательности операций. */
@@ -456,7 +414,7 @@ unsigned int ump_log_read(unsigned int address)
/* Ветвь выбора для UMP_LOG_BASE; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE: return 0x554D;
/* Ветвь выбора для UMP_LOG_BASE+1; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+1: return 3;
case UMP_LOG_BASE+1: return 4;
/* Ветвь выбора для UMP_LOG_BASE+2; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+2: return ump_source ? 3 : ump_state;
/* Ветвь выбора для UMP_LOG_BASE+3; выполняется при совпадении селектора switch. */
@@ -501,7 +459,7 @@ unsigned int ump_log_read(unsigned int address)
return ump_word(ump_source, ump_cursor + offset / UMP_LOG_WORDS, offset % UMP_LOG_WORDS);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Последние три записи для онлайн-графика, без остановки и без
/* Последние UMP_LOG_LIVE_RECORDS записей для онлайн-графика, без остановки и без
* изменения курсора архивного чтения. Первые два слова — их номер. */
/* Проверяет if (address >= UMP_LOG_LIVE и address < UMP_LOG_LIVE+124); последующий оператор выполняется только при истинном условии. */
if (address >= UMP_LOG_LIVE && address < UMP_LOG_LIVE+124) {