Перейти на компактные 12-словные записи v4 и сохранять 10 процентов банка после отключения. Добавить трёхсекундное ожидание роста ЗПТ и настраиваемый лимит пусков. Явно инициализировать состояние UART и гарантировать публикацию параметров EEPROM перед запуском Timer2. Сохранить воспроизводимые сборки, регрессионные проверки, документацию и обновлённые результаты сборки; исключить временные артефакты.
94 lines
9.0 KiB
C
94 lines
9.0 KiB
C
/* Проверка ump_logger на модели ПК. Русские пояснения сохранены в UTF-8. */
|
||
/* Подключает "../../Source/Internal/log_to_mem.c": двухбанковый регистратор событий нагрузки во внешней RAM. */
|
||
#include "../../Source/Internal/log_to_mem.c"
|
||
|
||
/* Описывает структуру mock_gpio GpioDataRegs;; порядок полей определяет расположение данных. */
|
||
struct mock_gpio GpioDataRegs;
|
||
/* Объявляет READY — данные READY; Desk — аппаратно определённый тип платы; Mode — рабочий адрес или режим платы, выбранный перемычками. Начальное значение задаётся справа от знака равенства. */
|
||
int READY = 1, Desk = 6, Mode = 5;
|
||
/* Объявляет modbus — массив технологических регистров; слово int на C28x занимает 16 бит; CanTimeOutErrorTR — CAN Time Out ошибка TR. */
|
||
int modbus[128], CanTimeOutErrorTR;
|
||
/* Объявляет IMPowse — данные IMPowse; WAKEpowse — данные WAKEpowse. */
|
||
unsigned long IMPowse, WAKEpowse;
|
||
/* Объявляет ADC_table — АЦП table. */
|
||
unsigned int ADC_table[4];
|
||
/* Задаёт CHECK = if (!(x)) return __LINE__; данные CHECK. */
|
||
#define CHECK(x) if (!(x)) return __LINE__
|
||
|
||
/* Точка входа: настраивает периферию, загружает параметры и обслуживает команды в главном цикле. */
|
||
int main(void)
|
||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||
{
|
||
/* Объявляет i — данные i. */
|
||
unsigned int i;
|
||
/* Simulate COFF boot with dirty RAM, including a stale active bank. */
|
||
/* Записывает ump_state значением ump_count = ump_cursor = ump_next = 0xA5A5; данные ump_state. */
|
||
ump_state = ump_count = ump_cursor = ump_next = 0xA5A5;
|
||
/* Записывает ump_period значением ump_divider = 0xA5A5; период записи регистратора в миллисекундных тактах. */
|
||
ump_period = ump_divider = 0xA5A5;
|
||
/* Записывает ump_time значением ump_sequence = 0xA5A5A5A5UL; миллисекундное время регистратора. */
|
||
ump_time = ump_sequence = 0xA5A5A5A5UL;
|
||
/* Записывает ump_bank значением ump_archive_bank = 0xA5A5; индекс активного банка регистратора. */
|
||
ump_bank = ump_archive_bank = 0xA5A5;
|
||
/* Записывает ump_archive_count значением ump_archive_next = ump_generation = 0xA5A5; ump archive число. */
|
||
ump_archive_count = ump_archive_next = ump_generation = 0xA5A5;
|
||
/* Записывает ump_source значением ump_post = 0xA5A5; данные ump_source. */
|
||
ump_source = ump_post = 0xA5A5;
|
||
/* Цикл for (i = 0; i < 2; i++) ump_pm67_voltage[i] = 0xA5A5;; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||
for (i = 0; i < 2; i++) ump_pm67_voltage[i] = 0xA5A5;
|
||
/* Записывает ump_prev_commands значением ump_prev_inputs = ump_prev_outputs = 0xA5A5; данные ump_prev_commands. */
|
||
ump_prev_commands = ump_prev_inputs = ump_prev_outputs = 0xA5A5;
|
||
|
||
/* Вызывает ump_log_init. Явно инициализирует оба банка регистратора до включения IRQ; повторный старт записи архив не стирает. */
|
||
ump_log_init();
|
||
/* Вызывает CHECK с аргументами (ump_log_read(UMP_LOG_BASE) == 0x554D) в текущей последовательности операций. */
|
||
CHECK(ump_log_read(UMP_LOG_BASE) == 0x554D);
|
||
/* Вызывает CHECK с аргументами (ump_log_read(UMP_LOG_BASE+1) == 4) в текущей последовательности операций. */
|
||
CHECK(ump_log_read(UMP_LOG_BASE+1) == 4);
|
||
/* Вызывает CHECK с аргументами (ump_log_read(UMP_LOG_BASE+2) == 0) в текущей последовательности операций. */
|
||
CHECK(ump_log_read(UMP_LOG_BASE+2) == 0);
|
||
/* Вызывает CHECK с аргументами (ump_log_read(UMP_LOG_BASE+3) == 0) в текущей последовательности операций. */
|
||
CHECK(ump_log_read(UMP_LOG_BASE+3) == 0);
|
||
/* Вызывает CHECK с аргументами (ump_log_read(UMP_LOG_BASE+6) == 20) в текущей последовательности операций. */
|
||
CHECK(ump_log_read(UMP_LOG_BASE+6) == 20);
|
||
/* Цикл for (i = 7; i <= 8; i++) CHECK(ump_log_read(UMP_LOG_BASE+i) == 0);; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||
for (i = 7; i <= 8; i++) CHECK(ump_log_read(UMP_LOG_BASE+i) == 0);
|
||
/* Цикл for (i = 12; i <= 15; i++) CHECK(ump_log_read(UMP_LOG_BASE+i) == 0);; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||
for (i = 12; i <= 15; i++) CHECK(ump_log_read(UMP_LOG_BASE+i) == 0);
|
||
/* Вызывает CHECK с аргументами (ump_bank == 0 && ump_archive_bank == 1) в текущей последовательности операций. */
|
||
CHECK(ump_bank == 0 && ump_archive_bank == 1);
|
||
/* Вызывает CHECK с аргументами (ump_cursor == 0 && ump_next == 0 && ump_archive_next == 0) в текущей последовательности операций. */
|
||
CHECK(ump_cursor == 0 && ump_next == 0 && ump_archive_next == 0);
|
||
/* Вызывает CHECK с аргументами (ump_divider == 0 && ump_sequence == 0 && ump_post == 0) в текущей последовательности операций. */
|
||
CHECK(ump_divider == 0 && ump_sequence == 0 && ump_post == 0);
|
||
/* Цикл for (i = 0; i < 2; i++) CHECK(ump_pm67_voltage[i] == 0);; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||
for (i = 0; i < 2; i++) CHECK(ump_pm67_voltage[i] == 0);
|
||
/* Вызывает CHECK с аргументами (ump_prev_commands == 0 && ump_prev_inputs == 0 && ump_prev_outputs == 0) в текущей последовательности операций. */
|
||
CHECK(ump_prev_commands == 0 && ump_prev_inputs == 0 && ump_prev_outputs == 0);
|
||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE+1, 20)) в текущей последовательности операций. */
|
||
CHECK(ump_log_write(UMP_LOG_BASE+1, 20));
|
||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE, 1)) в текущей последовательности операций. */
|
||
CHECK(ump_log_write(UMP_LOG_BASE, 1));
|
||
/* Вызывает CHECK с аргументами (ump_state == 1 && ump_count == 1) в текущей последовательности операций. */
|
||
CHECK(ump_state == 1 && ump_count == 1);
|
||
/* Вызывает ump_log_tick. Продвигает время регистратора в Timer1 и снимает записи с заданным периодом. */
|
||
ump_log_tick();
|
||
/* Вызывает CHECK с аргументами (ump_time == 1) в текущей последовательности операций. */
|
||
CHECK(ump_time == 1);
|
||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE, 0)) в текущей последовательности операций. */
|
||
CHECK(ump_log_write(UMP_LOG_BASE, 0));
|
||
/* Записывает ump_archive_count значением 7; ump_generation = 2; ump archive число. */
|
||
ump_archive_count = 7; ump_generation = 2;
|
||
/* Записывает ump_pm67_voltage[0] значением 123; данные ump_pm67_voltage. */
|
||
ump_pm67_voltage[0] = 123;
|
||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE, 1)) в текущей последовательности операций. */
|
||
CHECK(ump_log_write(UMP_LOG_BASE, 1));
|
||
/* Вызывает CHECK с аргументами (ump_time == 1 && ump_archive_count == 7 && ump_generation == 2) в текущей последовательности операций. */
|
||
CHECK(ump_time == 1 && ump_archive_count == 7 && ump_generation == 2);
|
||
/* Вызывает CHECK с аргументами (ump_word(0, 0, 9) == 123) в текущей последовательности операций. */
|
||
CHECK(ump_word(0, 0, 9) == 123);
|
||
/* Завершает main и возвращает 0. */
|
||
return 0;
|
||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||
}
|