Сохранить русские комментарии и настройки проекта в UTF-8
Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
This commit is contained in:
@@ -1,56 +1,109 @@
|
||||
/* Проверка 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;
|
||||
/* Записывает ump_can_header значением ump_can_count = 0xA5A5; ump CAN header. */
|
||||
ump_can_header = ump_can_count = 0xA5A5;
|
||||
/* Цикл for (i = 0; i < 3; i++) ump_can_data[i] = 0xA5A5;; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (i = 0; i < 3; i++) ump_can_data[i] = 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_dac_ramp значением ump_dac_duration = ump_dac_go10 = 0xA5A5; ump ЦАП ramp. */
|
||||
ump_dac_ramp = ump_dac_duration = ump_dac_go10 = 0xA5A5;
|
||||
/* Записывает ump_dac_stop10 значением ump_dac_position = 0xA5A5; ump ЦАП stop 10. */
|
||||
ump_dac_stop10 = ump_dac_position = 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) == 3) в текущей последовательности операций. */
|
||||
CHECK(ump_log_read(UMP_LOG_BASE+1) == 3);
|
||||
/* Вызывает 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);
|
||||
/* Вызывает CHECK с аргументами (ump_can_header == 0 && ump_can_count == 0) в текущей последовательности операций. */
|
||||
CHECK(ump_can_header == 0 && ump_can_count == 0);
|
||||
/* Цикл for (i = 0; i < 3; i++) CHECK(ump_can_data[i] == 0);; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (i = 0; i < 3; i++) CHECK(ump_can_data[i] == 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_dac_ramp == 0 && ump_dac_duration == 0 && ump_dac_go10 == 0) в текущей последовательности операций. */
|
||||
CHECK(ump_dac_ramp == 0 && ump_dac_duration == 0 && ump_dac_go10 == 0);
|
||||
/* Вызывает CHECK с аргументами (ump_dac_stop10 == 0 && ump_dac_position == 0) в текущей последовательности операций. */
|
||||
CHECK(ump_dac_stop10 == 0 && ump_dac_position == 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, 40) == 123) в текущей последовательности операций. */
|
||||
CHECK(ump_word(0, 0, 40) == 123);
|
||||
/* Завершает main и возвращает 0. */
|
||||
return 0;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
@@ -1,163 +1,311 @@
|
||||
/* Проверка ump_logger на модели ПК. Русские пояснения сохранены в UTF-8. */
|
||||
/* Подключает "../../Source/Internal/log_to_mem.c": двухбанковый регистратор событий нагрузки во внешней RAM. */
|
||||
#include "../../Source/Internal/log_to_mem.c"
|
||||
/* Подключает "../../Source/Internal/Include/ump_can_protocol.h": настройки и интерфейс ump_can_protocol. */
|
||||
#include "../../Source/Internal/Include/ump_can_protocol.h"
|
||||
/* Описывает структуру mock_gpio GpioDataRegs;; порядок полей определяет расположение данных. */
|
||||
struct mock_gpio GpioDataRegs;
|
||||
/* Объявляет READY — данные READY; Desk — аппаратно определённый тип платы; Mode — рабочий адрес или режим платы, выбранный перемычками. Начальное значение задаётся справа от знака равенства. */
|
||||
int READY = 1, Desk = 6, Mode = 5;
|
||||
/* Объявляет modbus — массив технологических регистров; слово int на C28x занимает 16 бит. */
|
||||
int modbus[128];
|
||||
/* Объявляет CanTimeOutErrorTR — CAN Time Out ошибка TR. */
|
||||
int 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__
|
||||
|
||||
/* Возвращаем номер строки при ошибке, ноль при успехе; CRT не требуется. */
|
||||
/* Вызывает __declspec с аргументами (dllexport) int run_tests(void) в текущей последовательности операций. */
|
||||
__declspec(dllexport) int run_tests(void)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Объявляет i — данные i; generation — данные generation; archived — данные archived; error — ошибка; length — длина. */
|
||||
unsigned int i, generation, archived, error, length;
|
||||
/* Объявляет reply — данные reply. */
|
||||
uint16_t reply[UMP_CAN_MAX_WORDS];
|
||||
/* Объявляет sequence — последовательность. */
|
||||
unsigned long sequence;
|
||||
/* Вызывает ump_log_init. Явно инициализирует оба банка регистратора до включения IRQ; повторный старт записи архив не стирает. */
|
||||
ump_log_init();
|
||||
/* Вызывает CHECK с аргументами (!ump_log_write(UMP_LOG_BASE+1, 0)) в текущей последовательности операций. */
|
||||
CHECK(!ump_log_write(UMP_LOG_BASE+1, 0));
|
||||
/* Вызывает CHECK с аргументами (!ump_log_write(UMP_LOG_BASE+1, 1001)) в текущей последовательности операций. */
|
||||
CHECK(!ump_log_write(UMP_LOG_BASE+1, 1001));
|
||||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE+1, 1)) в текущей последовательности операций. */
|
||||
CHECK(ump_log_write(UMP_LOG_BASE+1, 1));
|
||||
/* Записывает modbus[127] значением 0x80; массив технологических регистров; слово int на C28x занимает 16 бит. */
|
||||
modbus[127] = 0x80;
|
||||
/* Записывает modbus[0x50] значением 6; modbus[0x51] = 16; массив технологических регистров; слово int на C28x занимает 16 бит. */
|
||||
modbus[0x50] = 6; modbus[0x51] = 16;
|
||||
/* Записывает modbus[0x7B] значением 1234; modbus[0x1C] = 160; массив технологических регистров; слово int на C28x занимает 16 бит. */
|
||||
modbus[0x7B] = 1234; modbus[0x1C] = 160;
|
||||
/* PM67 reception is independent of recording; all three CAN slots work. */
|
||||
/* Вызывает ump_log_can. Обновляет последние CAN-данные и напряжения для следующего снимка регистратора. */
|
||||
ump_log_can(0x8000U | 305U, 0xFEDCU, 0, 0);
|
||||
/* Вызывает ump_log_can. Обновляет последние CAN-данные и напряжения для следующего снимка регистратора. */
|
||||
ump_log_can(0x4000U | 7U, 0, 456, 0);
|
||||
/* Вызывает CHECK с аргументами (ump_pm67_voltage[0] == 0xFEDCU && ump_pm67_voltage[1] == 456) в текущей последовательности операций. */
|
||||
CHECK(ump_pm67_voltage[0] == 0xFEDCU && ump_pm67_voltage[1] == 456);
|
||||
ump_log_can(305U, 1, 2, 3); /* Masked-out word must not overwrite. */
|
||||
ump_log_can(305U, 1, 2, 3); /* Masked-out word must not overwrite. */ /* Вызывает ump_log_can. Обновляет последние CAN-данные и напряжения для следующего снимка регистратора. */
|
||||
/* Вызывает ump_log_can. Обновляет последние CAN-данные и напряжения для следующего снимка регистратора. */
|
||||
ump_log_can(0x2000U | 303U, 0, 0, 123);
|
||||
/* Вызывает ump_log_can. Обновляет последние CAN-данные и напряжения для следующего снимка регистратора. */
|
||||
ump_log_can(0x2000U | 6U, 0, 0, 789);
|
||||
/* Вызывает CHECK с аргументами (ump_pm67_voltage[0] == 123 && ump_pm67_voltage[1] == 789) в текущей последовательности операций. */
|
||||
CHECK(ump_pm67_voltage[0] == 123 && ump_pm67_voltage[1] == 789);
|
||||
ump_log_can(0x8000U | 306U, 999, 0, 0); /* Not a one-based CAN address. */
|
||||
ump_log_can(0x8000U | 306U, 999, 0, 0); /* Not a one-based CAN address. */ /* Вызывает ump_log_can. Обновляет последние CAN-данные и напряжения для следующего снимка регистратора. */
|
||||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE, 1)) в текущей последовательности операций. */
|
||||
CHECK(ump_log_write(UMP_LOG_BASE, 1));
|
||||
/* Вызывает CHECK с аргументами (ump_word(0, 0, 40) == 123 && ump_word(0, 0, 41) == 789) в текущей последовательности операций. */
|
||||
CHECK(ump_word(0, 0, 40) == 123 && ump_word(0, 0, 41) == 789);
|
||||
/* Вызывает CHECK с аргументами (2UL * UMP_LOG_CAPACITY * UMP_LOG_WORDS <= LOG_PAGE_LEN) в текущей последовательности операций. */
|
||||
CHECK(2UL * UMP_LOG_CAPACITY * UMP_LOG_WORDS <= LOG_PAGE_LEN);
|
||||
/* Вызывает CHECK с аргументами (!ump_log_write(UMP_LOG_BASE, 1)) в текущей последовательности операций. */
|
||||
CHECK(!ump_log_write(UMP_LOG_BASE, 1));
|
||||
/* Вызывает CHECK с аргументами (!ump_log_write(UMP_LOG_BASE+1, 20)) в текущей последовательности операций. */
|
||||
CHECK(!ump_log_write(UMP_LOG_BASE+1, 20));
|
||||
/* Цикл for (i=0; i<900; i++) ump_log_tick();; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (i=0; i<900; i++) ump_log_tick();
|
||||
/* Вызывает CHECK с аргументами (ump_count == UMP_LOG_CAPACITY) в текущей последовательности операций. */
|
||||
CHECK(ump_count == UMP_LOG_CAPACITY);
|
||||
/* Вызывает CHECK с аргументами (ump_word(0, 0, 0) == 901-UMP_LOG_CAPACITY) в текущей последовательности операций. */
|
||||
CHECK(ump_word(0, 0, 0) == 901-UMP_LOG_CAPACITY);
|
||||
/* Вызывает CHECK с аргументами (ump_word(0, UMP_LOG_CAPACITY-1, 0) == 900) в текущей последовательности операций. */
|
||||
CHECK(ump_word(0, UMP_LOG_CAPACITY-1, 0) == 900);
|
||||
/* Вызывает CHECK с аргументами (ump_word(0, 0, 8) == 1234) в текущей последовательности операций. */
|
||||
CHECK(ump_word(0, 0, 8) == 1234);
|
||||
/* Вызывает CHECK с аргументами (ump_word(0, 0, 24) == 6) в текущей последовательности операций. */
|
||||
CHECK(ump_word(0, 0, 24) == 6);
|
||||
/* Короткая CAN-команда должна остаться отдельным событием. */
|
||||
/* Записывает modbus[127] значением 0x40; массив технологических регистров; слово int на C28x занимает 16 бит. */
|
||||
modbus[127] = 0x40;
|
||||
/* Вызывает ump_log_can. Обновляет последние CAN-данные и напряжения для следующего снимка регистратора. */
|
||||
ump_log_can(0x807F, 0x40, 0, 0);
|
||||
CHECK(ump_post == 0); /* A command alone is not an output transition. */
|
||||
CHECK(ump_post == 0); /* A command alone is not an output transition. */ /* Вызывает CHECK с аргументами (ump_post == 0) в текущей последовательности операций. */
|
||||
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO58 значением 1; аппаратная линия ввода/вывода GPIO58. */
|
||||
GpioDataRegs.GPBDAT.bit.GPIO58 = 1;
|
||||
ump_log_io(); /* STOP may be sampled before RES_OUT_2 is cleared. */
|
||||
ump_log_io(); /* STOP may be sampled before RES_OUT_2 is cleared. */ /* Вызывает ump_log_io. Обслуживает изменения дискретных входов и выходов из главного цикла. */
|
||||
/* Вызывает CHECK с аргументами (ump_post == 0) в текущей последовательности операций. */
|
||||
CHECK(ump_post == 0);
|
||||
/* Записывает GpioDataRegs.GPADAT.bit.GPIO3 значением 1; аппаратная линия ввода/вывода GPIO3. */
|
||||
GpioDataRegs.GPADAT.bit.GPIO3 = 1;
|
||||
/* Вызывает ump_log_io. Обслуживает изменения дискретных входов и выходов из главного цикла. */
|
||||
ump_log_io();
|
||||
/* Вызывает CHECK с аргументами (ump_post == UMP_POST_POINTS) в текущей последовательности операций. */
|
||||
CHECK(ump_post == UMP_POST_POINTS);
|
||||
/* Вызывает CHECK с аргументами (ump_word(0, ump_count-1, 2) == 0x103) в текущей последовательности операций. */
|
||||
CHECK(ump_word(0, ump_count-1, 2) == 0x103);
|
||||
/* Вызывает CHECK с аргументами (ump_word(0, ump_count-1, 18) == 0x807F) в текущей последовательности операций. */
|
||||
CHECK(ump_word(0, ump_count-1, 18) == 0x807F);
|
||||
/* Цикл for (i=0; i<UMP_POST_POINTS-1; i++) ump_log_tick();; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (i=0; i<UMP_POST_POINTS-1; i++) ump_log_tick();
|
||||
/* Вызывает CHECK с аргументами (ump_generation == 0) в текущей последовательности операций. */
|
||||
CHECK(ump_generation == 0);
|
||||
/* Вызывает ump_log_tick. Продвигает время регистратора в Timer1 и снимает записи с заданным периодом. */
|
||||
ump_log_tick();
|
||||
/* Вызывает CHECK с аргументами (ump_generation == 1) в текущей последовательности операций. */
|
||||
CHECK(ump_generation == 1);
|
||||
/* Вызывает CHECK с аргументами (ump_archive_count == UMP_LOG_CAPACITY) в текущей последовательности операций. */
|
||||
CHECK(ump_archive_count == UMP_LOG_CAPACITY);
|
||||
/* Вызывает CHECK с аргументами (ump_word(1, UMP_LOG_CAPACITY-UMP_POST_POINTS-1, 2) == 0x103) в текущей последовательности операций. */
|
||||
CHECK(ump_word(1, UMP_LOG_CAPACITY-UMP_POST_POINTS-1, 2) == 0x103);
|
||||
/* Вызывает CHECK с аргументами (ump_word(1, UMP_LOG_CAPACITY-1, 2) == 5) в текущей последовательности операций. */
|
||||
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 2) == 5);
|
||||
/* Вызывает CHECK с аргументами (ump_count == 0 && ump_state == 1) в текущей последовательности операций. */
|
||||
CHECK(ump_count == 0 && ump_state == 1);
|
||||
/* Вызывает CHECK с аргументами (ump_word(1, UMP_LOG_CAPACITY-1, 40) == 123) в текущей последовательности операций. */
|
||||
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 40) == 123);
|
||||
/* Вызывает CHECK с аргументами (ump_word(1, UMP_LOG_CAPACITY-1, 41) == 789) в текущей последовательности операций. */
|
||||
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 41) == 789);
|
||||
/* Вызывает ump_log_can. Обновляет последние CAN-данные и напряжения для следующего снимка регистратора. */
|
||||
ump_log_can(0x8000U | 305U, 999, 0, 0);
|
||||
/* Вызывает CHECK с аргументами (ump_word(0, ump_count-1, 40) == 999) в текущей последовательности операций. */
|
||||
CHECK(ump_word(0, ump_count-1, 40) == 999);
|
||||
/* Вызывает CHECK с аргументами (ump_word(1, UMP_LOG_CAPACITY-1, 40) == 123) в текущей последовательности операций. */
|
||||
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 40) == 123);
|
||||
/* Записывает generation значением ump_generation; данные generation. */
|
||||
generation = ump_generation;
|
||||
/* Записывает archived значением ump_word(1, UMP_LOG_CAPACITY-1, 0); данные archived. */
|
||||
archived = ump_word(1, UMP_LOG_CAPACITY-1, 0);
|
||||
/* Записывает sequence значением ump_sequence; последовательность. */
|
||||
sequence = ump_sequence;
|
||||
/* Цикл for (i=0; i<200; i++) ump_log_tick();; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (i=0; i<200; i++) ump_log_tick();
|
||||
/* Вызывает CHECK с аргументами (ump_word(1, UMP_LOG_CAPACITY-1, 0) == archived) в текущей последовательности операций. */
|
||||
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 0) == archived);
|
||||
/* Вызывает CHECK с аргументами (ump_generation == generation) в текущей последовательности операций. */
|
||||
CHECK(ump_generation == generation);
|
||||
/* Вызывает CHECK с аргументами (ump_sequence == sequence + 200) в текущей последовательности операций. */
|
||||
CHECK(ump_sequence == sequence + 200);
|
||||
/* Вызывает CHECK с аргументами (ump_log_read(UMP_LOG_LIVE+2) == UMP_LOG_LIVE_RECORDS) в текущей последовательности операций. */
|
||||
CHECK(ump_log_read(UMP_LOG_LIVE+2) == UMP_LOG_LIVE_RECORDS);
|
||||
/* Вызывает CHECK с аргументами (ump_log_read(UMP_LOG_LIVE+4) == ump_time-(UMP_LOG_LIVE_RECORDS-1)) в текущей последовательности операций. */
|
||||
CHECK(ump_log_read(UMP_LOG_LIVE+4) == ump_time-(UMP_LOG_LIVE_RECORDS-1));
|
||||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE+3, 1)) в текущей последовательности операций. */
|
||||
CHECK(ump_log_write(UMP_LOG_BASE+3, 1));
|
||||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE+2, UMP_LOG_CAPACITY-1)) в текущей последовательности операций. */
|
||||
CHECK(ump_log_write(UMP_LOG_BASE+2, UMP_LOG_CAPACITY-1));
|
||||
/* Вызывает CHECK с аргументами (ump_log_read(UMP_LOG_DATA) == archived) в текущей последовательности операций. */
|
||||
CHECK(ump_log_read(UMP_LOG_DATA) == archived);
|
||||
/* Вызывает CHECK с аргументами (ump_log_read(UMP_LOG_DATA+UMP_LOG_WORDS) == 0) в текущей последовательности операций. */
|
||||
CHECK(ump_log_read(UMP_LOG_DATA+UMP_LOG_WORDS) == 0);
|
||||
/* Вызывает CHECK с аргументами (!ump_log_write(UMP_LOG_BASE+2, UMP_LOG_CAPACITY)) в текущей последовательности операций. */
|
||||
CHECK(!ump_log_write(UMP_LOG_BASE+2, UMP_LOG_CAPACITY));
|
||||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE, 0)) в текущей последовательности операций. */
|
||||
CHECK(ump_log_write(UMP_LOG_BASE, 0));
|
||||
/* Записывает sequence значением ump_sequence; последовательность. */
|
||||
sequence = ump_sequence;
|
||||
/* Вызывает ump_log_tick. Продвигает время регистратора в Timer1 и снимает записи с заданным периодом. */
|
||||
ump_log_tick(); ump_log_io(); ump_log_can(1,2,3,4);
|
||||
/* Вызывает CHECK с аргументами (sequence == ump_sequence) в текущей последовательности операций. */
|
||||
CHECK(sequence == ump_sequence);
|
||||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE, 1)) в текущей последовательности операций. */
|
||||
CHECK(ump_log_write(UMP_LOG_BASE, 1));
|
||||
/* Вызывает CHECK с аргументами (ump_word(1, UMP_LOG_CAPACITY-1, 0) == archived) в текущей последовательности операций. */
|
||||
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 0) == archived);
|
||||
/* Repeated reset/STOP pulses beyond the post interval preserve archive. */
|
||||
/* Цикл for (i=0; i<3; i++) ; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (i=0; i<3; i++) {
|
||||
/* Записывает modbus[127] значением 0; GpioDataRegs.GPBDAT.bit.GPIO58 = 0; ump_log_io(); массив технологических регистров; слово int на C28x занимает 16 бит. */
|
||||
modbus[127] = 0; GpioDataRegs.GPBDAT.bit.GPIO58 = 0; ump_log_io();
|
||||
/* Записывает modbus[127] значением 0x40; ump_log_can(0x807F, 0x40, 0, 0); массив технологических регистров; слово int на C28x занимает 16 бит. */
|
||||
modbus[127] = 0x40; ump_log_can(0x807F, 0x40, 0, 0);
|
||||
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO58 значением 1; ump_log_io(); аппаратная линия ввода/вывода GPIO58. */
|
||||
GpioDataRegs.GPBDAT.bit.GPIO58 = 1; ump_log_io();
|
||||
/* Вызывает CHECK с аргументами (ump_post == 0) в текущей последовательности операций. */
|
||||
CHECK(ump_post == 0);
|
||||
/* Записывает tick значением 0; tick<1100; tick++) ump_log_tick(); }; данные tick. */
|
||||
{ unsigned int tick; for (tick=0; tick<1100; tick++) ump_log_tick(); }
|
||||
/* Вызывает CHECK с аргументами (ump_generation == generation) в текущей последовательности операций. */
|
||||
CHECK(ump_generation == generation);
|
||||
/* Вызывает CHECK с аргументами (ump_word(1, UMP_LOG_CAPACITY-1, 0) == archived) в текущей последовательности операций. */
|
||||
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 0) == archived);
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
/* Falling start alone does not freeze; a new real cycle does. */
|
||||
/* Записывает modbus[127] значением 0x80; ump_log_rs(); массив технологических регистров; слово int на C28x занимает 16 бит. */
|
||||
modbus[127] = 0x80; ump_log_rs();
|
||||
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO58 значением 0; аппаратная линия ввода/вывода GPIO58. */
|
||||
GpioDataRegs.GPBDAT.bit.GPIO58 = 0;
|
||||
/* Записывает GpioDataRegs.GPADAT.bit.GPIO3 значением 0; ump_log_io(); аппаратная линия ввода/вывода GPIO3. */
|
||||
GpioDataRegs.GPADAT.bit.GPIO3 = 0; ump_log_io();
|
||||
/* Записывает modbus[127] значением 0; ump_log_rs(); массив технологических регистров; слово int на C28x занимает 16 бит. */
|
||||
modbus[127] = 0; ump_log_rs();
|
||||
/* Вызывает CHECK с аргументами (ump_post == 0) в текущей последовательности операций. */
|
||||
CHECK(ump_post == 0);
|
||||
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO58 значением 1; аппаратная линия ввода/вывода GPIO58. */
|
||||
GpioDataRegs.GPBDAT.bit.GPIO58 = 1;
|
||||
/* Записывает GpioDataRegs.GPADAT.bit.GPIO3 значением 1; ump_log_io(); аппаратная линия ввода/вывода GPIO3. */
|
||||
GpioDataRegs.GPADAT.bit.GPIO3 = 1; ump_log_io();
|
||||
/* Вызывает CHECK с аргументами (ump_post == UMP_POST_POINTS) в текущей последовательности операций. */
|
||||
CHECK(ump_post == UMP_POST_POINTS);
|
||||
/* Цикл for (i=0; i<UMP_POST_POINTS; i++) ump_log_tick();; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (i=0; i<UMP_POST_POINTS; i++) ump_log_tick();
|
||||
/* Вызывает CHECK с аргументами (ump_generation == generation+1) в текущей последовательности операций. */
|
||||
CHECK(ump_generation == generation+1);
|
||||
/* A RES_OUT_2 fall without STOP is not a shutdown trigger. */
|
||||
/* Записывает generation значением ump_generation; данные generation. */
|
||||
generation = ump_generation;
|
||||
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO58 значением 0; аппаратная линия ввода/вывода GPIO58. */
|
||||
GpioDataRegs.GPBDAT.bit.GPIO58 = 0;
|
||||
/* Записывает GpioDataRegs.GPADAT.bit.GPIO3 значением 0; ump_log_io(); аппаратная линия ввода/вывода GPIO3. */
|
||||
GpioDataRegs.GPADAT.bit.GPIO3 = 0; ump_log_io();
|
||||
/* Записывает GpioDataRegs.GPADAT.bit.GPIO3 значением 1; ump_log_io(); аппаратная линия ввода/вывода GPIO3. */
|
||||
GpioDataRegs.GPADAT.bit.GPIO3 = 1; ump_log_io();
|
||||
/* Вызывает CHECK с аргументами (ump_post == 0) в текущей последовательности операций. */
|
||||
CHECK(ump_post == 0);
|
||||
/* Starting the recorder with stopped outputs must not invent an edge. */
|
||||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE, 0)) в текущей последовательности операций. */
|
||||
CHECK(ump_log_write(UMP_LOG_BASE, 0));
|
||||
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO58 значением 1; аппаратная линия ввода/вывода GPIO58. */
|
||||
GpioDataRegs.GPBDAT.bit.GPIO58 = 1;
|
||||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE, 1)) в текущей последовательности операций. */
|
||||
CHECK(ump_log_write(UMP_LOG_BASE, 1));
|
||||
/* Вызывает CHECK с аргументами (ump_post == 0 && ump_generation == generation) в текущей последовательности операций. */
|
||||
CHECK(ump_post == 0 && ump_generation == generation);
|
||||
/* At a slow sample period time alone cannot finish the point budget.
|
||||
* CAN and RS records count, and repeated edges do not restart it. */
|
||||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE, 0)) в текущей последовательности операций. */
|
||||
CHECK(ump_log_write(UMP_LOG_BASE, 0));
|
||||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE+1, 1000)) в текущей последовательности операций. */
|
||||
CHECK(ump_log_write(UMP_LOG_BASE+1, 1000));
|
||||
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE, 1)) в текущей последовательности операций. */
|
||||
CHECK(ump_log_write(UMP_LOG_BASE, 1));
|
||||
/* Записывает GpioDataRegs.GPADAT.bit.GPIO3 значением 0; ump_log_io(); аппаратная линия ввода/вывода GPIO3. */
|
||||
GpioDataRegs.GPADAT.bit.GPIO3 = 0; ump_log_io();
|
||||
/* Записывает GpioDataRegs.GPADAT.bit.GPIO3 значением 1; ump_log_io(); аппаратная линия ввода/вывода GPIO3. */
|
||||
GpioDataRegs.GPADAT.bit.GPIO3 = 1; ump_log_io();
|
||||
/* Вызывает CHECK с аргументами (ump_post == UMP_POST_POINTS) в текущей последовательности операций. */
|
||||
CHECK(ump_post == UMP_POST_POINTS);
|
||||
/* Цикл for (i=0; i<1000; i++) ump_log_tick();; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (i=0; i<1000; i++) ump_log_tick();
|
||||
/* Вызывает CHECK с аргументами (ump_post == UMP_POST_POINTS-1 && ump_generation == generation) в текущей последовательности операций. */
|
||||
CHECK(ump_post == UMP_POST_POINTS-1 && ump_generation == generation);
|
||||
/* Записывает GpioDataRegs.GPADAT.bit.GPIO3 значением 0; ump_log_io(); аппаратная линия ввода/вывода GPIO3. */
|
||||
GpioDataRegs.GPADAT.bit.GPIO3 = 0; ump_log_io();
|
||||
/* Записывает GpioDataRegs.GPADAT.bit.GPIO3 значением 1; ump_log_io(); аппаратная линия ввода/вывода GPIO3. */
|
||||
GpioDataRegs.GPADAT.bit.GPIO3 = 1; ump_log_io();
|
||||
/* Вызывает CHECK с аргументами (ump_post == UMP_POST_POINTS-3) в текущей последовательности операций. */
|
||||
CHECK(ump_post == UMP_POST_POINTS-3);
|
||||
/* Цикл for (i=0; i<UMP_POST_POINTS-4; i++) ump_log_can(0x807F, 0, 0, 0);; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (i=0; i<UMP_POST_POINTS-4; i++) ump_log_can(0x807F, 0, 0, 0);
|
||||
/* Вызывает CHECK с аргументами (ump_post == 1 && ump_generation == generation) в текущей последовательности операций. */
|
||||
CHECK(ump_post == 1 && ump_generation == generation);
|
||||
/* Вызывает ump_log_rs. Регистрирует изменение слова команд после записи по последовательному интерфейсу. */
|
||||
ump_log_rs();
|
||||
/* Вызывает CHECK с аргументами (ump_post == 0 && ump_generation == generation+1) в текущей последовательности операций. */
|
||||
CHECK(ump_post == 0 && ump_generation == generation+1);
|
||||
/* Вызывает CHECK с аргументами (ump_archive_count == UMP_POST_POINTS+3) в текущей последовательности операций. */
|
||||
CHECK(ump_archive_count == UMP_POST_POINTS+3);
|
||||
/* CAN читает те же регистры и формирует цельный снимок из 124 слов.
|
||||
* Запись по старым технологическим адресам через сервис запрещена. */
|
||||
/* Записывает length значением ump_can_prepare(3, UMP_LOG_BASE, 16, reply, &error); длина. */
|
||||
length = ump_can_prepare(3, UMP_LOG_BASE, 16, reply, &error);
|
||||
/* Вызывает CHECK с аргументами (!error && length == 16 && reply[0] == 0x554D && reply[1] == 3) в текущей последовательности операций. */
|
||||
CHECK(!error && length == 16 && reply[0] == 0x554D && reply[1] == 3);
|
||||
/* Записывает length значением ump_can_prepare(3, UMP_LOG_LIVE, 124, reply, &error); длина. */
|
||||
length = ump_can_prepare(3, UMP_LOG_LIVE, 124, reply, &error);
|
||||
/* Вызывает CHECK с аргументами (!error && length == 124) в текущей последовательности операций. */
|
||||
CHECK(!error && length == 124);
|
||||
/* Вызывает CHECK с аргументами (reply[2] <= UMP_LOG_LIVE_RECORDS) в текущей последовательности операций. */
|
||||
CHECK(reply[2] <= UMP_LOG_LIVE_RECORDS);
|
||||
/* Цикл for (i=4+reply[2]*UMP_LOG_WORDS; i<124; i++) CHECK(reply[i] == 0);; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (i=4+reply[2]*UMP_LOG_WORDS; i<124; i++) CHECK(reply[i] == 0);
|
||||
/* Записывает length значением ump_can_prepare(3, UMP_LOG_DATA, 84, reply, &error); длина. */
|
||||
length = ump_can_prepare(3, UMP_LOG_DATA, 84, reply, &error);
|
||||
/* Вызывает CHECK с аргументами (!error && length == 84) в текущей последовательности операций. */
|
||||
CHECK(!error && length == 84);
|
||||
/* Записывает length значением ump_can_prepare(3, UMP_LOG_DATA, 42, reply, &error); длина. */
|
||||
length = ump_can_prepare(3, UMP_LOG_DATA, 42, reply, &error);
|
||||
/* Вызывает CHECK с аргументами (!error && length == 42) в текущей последовательности операций. */
|
||||
CHECK(!error && length == 42);
|
||||
/* Вызывает ump_can_prepare с аргументами (3, UMP_LOG_LIVE, 126, reply, &error) в текущей последовательности операций. */
|
||||
ump_can_prepare(3, UMP_LOG_LIVE, 126, reply, &error);
|
||||
/* Вызывает CHECK с аргументами (error == 2) в текущей последовательности операций. */
|
||||
CHECK(error == 2);
|
||||
/* Вызывает ump_can_prepare с аргументами (6, 127, 0x80, reply, &error) в текущей последовательности операций. */
|
||||
ump_can_prepare(6, 127, 0x80, reply, &error);
|
||||
/* Вызывает CHECK с аргументами (error == 2 && modbus[127] == 0) в текущей последовательности операций. */
|
||||
CHECK(error == 2 && modbus[127] == 0);
|
||||
/* Записывает length значением ump_can_prepare(6, UMP_LOG_BASE, 0, reply, &error); длина. */
|
||||
length = ump_can_prepare(6, UMP_LOG_BASE, 0, reply, &error);
|
||||
/* Вызывает CHECK с аргументами (!error && length == 2 && reply[0] == UMP_LOG_BASE && reply[1] == 0) в текущей последовательности операций. */
|
||||
CHECK(!error && length == 2 && reply[0] == UMP_LOG_BASE && reply[1] == 0);
|
||||
/* Вызывает CHECK с аргументами (ump_state == 3) в текущей последовательности операций. */
|
||||
CHECK(ump_state == 3);
|
||||
/* Вызывает ump_can_prepare с аргументами (6, UMP_LOG_BASE+1, 0, reply, &error) в текущей последовательности операций. */
|
||||
ump_can_prepare(6, UMP_LOG_BASE+1, 0, reply, &error);
|
||||
/* Вызывает CHECK с аргументами (error == 3) в текущей последовательности операций. */
|
||||
CHECK(error == 3);
|
||||
/* Вызывает ump_can_prepare с аргументами (99, UMP_LOG_BASE, 16, reply, &error) в текущей последовательности операций. */
|
||||
ump_can_prepare(99, UMP_LOG_BASE, 16, reply, &error);
|
||||
/* Вызывает CHECK с аргументами (error == 1) в текущей последовательности операций. */
|
||||
CHECK(error == 1);
|
||||
/* Завершает функцию и возвращает 0. */
|
||||
return 0;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
@@ -1,35 +1,66 @@
|
||||
# Проверка ump_logger на модели пк. Комментарии и исходный текст в UTF-8.
|
||||
# Продолжает текущий вызов, список или выражение: """Boot regression independent of the external shared protocol checkout.; порядок аргументов сохраняется.
|
||||
"""Boot regression independent of the external shared protocol checkout.
|
||||
|
||||
Run with GCC in PATH: python tests/ump_logger/run_init_test.py
|
||||
The negative control must fail without the boot initialization call.
|
||||
"""
|
||||
# Подключает модуль os для этой проверки или подготовки сборки.
|
||||
import os
|
||||
# Импортирует необходимые имена: from pathlib import Path.
|
||||
from pathlib import Path
|
||||
# Подключает модуль subprocess для этой проверки или подготовки сборки.
|
||||
import subprocess
|
||||
# Подключает модуль tempfile для этой проверки или подготовки сборки.
|
||||
import tempfile
|
||||
|
||||
# Задаёт root по выражению справа; значение используется последующими операциями.
|
||||
root = Path(__file__).resolve().parents[2]
|
||||
# Задаёт source по выражению справа; значение используется последующими операциями.
|
||||
source = root / 'tests/ump_logger/init_test.c'
|
||||
# Задаёт compiler по выражению справа; значение используется последующими операциями.
|
||||
compiler = os.environ.get('CC', 'gcc')
|
||||
# Открывает управляемый ресурс tempfile.TemporaryDirectory(prefix='ump-init-') as directory с автоматическим освобождением.
|
||||
with tempfile.TemporaryDirectory(prefix='ump-init-') as directory:
|
||||
# Задаёт directory по выражению справа; значение используется последующими операциями.
|
||||
directory = Path(directory)
|
||||
text = source.read_text().replace(
|
||||
# Читает исходный файл или образ для последующей проверки и разбора.
|
||||
text = source.read_text(encoding="utf-8").replace(
|
||||
# Продолжает текущий вызов, список или выражение: '../../Source/Internal/log_to_mem.c',; порядок аргументов сохраняется.
|
||||
'../../Source/Internal/log_to_mem.c',
|
||||
# Продолжает текущий вызов, список или выражение: (root / 'Source/Internal/log_to_mem.c').as_posix(),; порядок аргументов сохраняется.
|
||||
(root / 'Source/Internal/log_to_mem.c').as_posix(),
|
||||
# Продолжает текущий вызов, список или выражение: ); порядок аргументов сохраняется.
|
||||
)
|
||||
# Перебирает initialize in (False, True) в указанном порядке.
|
||||
for initialize in (False, True):
|
||||
# Задаёт case по выражению справа; значение используется последующими операциями.
|
||||
case = directory / 'init_test.c'
|
||||
case.write_text(text if initialize else text.replace('ump_log_init();', ';'))
|
||||
# Сохраняет подготовленный файл в указанном формате для следующего шага.
|
||||
case.write_text(text if initialize else text.replace('ump_log_init();', ';'), encoding="utf-8")
|
||||
# Задаёт executable по выражению справа; значение используется последующими операциями.
|
||||
executable = directory / 'init_test.exe'
|
||||
# Запускает внешний компилятор, генератор или тест; ненулевой результат проверяется параметрами вызова.
|
||||
subprocess.run([
|
||||
# Продолжает текущий вызов, список или выражение: compiler, '-Wno-unknown-pragmas', '-Wno-int-to-pointer-cast',; порядок аргументов сохраняется.
|
||||
compiler, '-Wno-unknown-pragmas', '-Wno-int-to-pointer-cast',
|
||||
# Продолжает текущий вызов, список или выражение: '-I' + str(root / 'tests/ump_logger/stubs'),; порядок аргументов сохраняется.
|
||||
'-I' + str(root / 'tests/ump_logger/stubs'),
|
||||
# Продолжает текущий вызов, список или выражение: '-I' + str(root / 'Source/Internal/Include'),; порядок аргументов сохраняется.
|
||||
'-I' + str(root / 'Source/Internal/Include'),
|
||||
# Продолжает текущий вызов, список или выражение: str(case), '-o', str(executable),; порядок аргументов сохраняется.
|
||||
str(case), '-o', str(executable),
|
||||
# Задаёт ], check по выражению справа; значение используется последующими операциями.
|
||||
], check=True)
|
||||
# Запускает внешний компилятор, генератор или тест; ненулевой результат проверяется параметрами вызова.
|
||||
result = subprocess.run([str(executable)])
|
||||
# Проверяет условие if initialize перед выполнением следующего блока.
|
||||
if initialize:
|
||||
# Проверяет обязательное условие result.returncode == 0, f'Initialization failed: {result.returncode}'; нарушение делает тест неуспешным.
|
||||
assert result.returncode == 0, f'Initialization failed: {result.returncode}'
|
||||
# Обрабатывает альтернативу предыдущего условия.
|
||||
else:
|
||||
# Проверяет обязательное условие result.returncode != 0, 'Negative control unexpectedly passed'; нарушение делает тест неуспешным.
|
||||
assert result.returncode != 0, 'Negative control unexpectedly passed'
|
||||
# Продолжает текущий вызов, список или выражение: print(f'{"Initialized boot" if initialize else "Dirty RAM negative control"}: PASS'); порядок аргументов сохраняется.
|
||||
print(f'{"Initialized boot" if initialize else "Dirty RAM negative control"}: PASS')
|
||||
|
||||
@@ -1,41 +1,76 @@
|
||||
# Проверка ump_logger на модели пк. Комментарии и исходный текст в UTF-8.
|
||||
# Продолжает текущий вызов, список или выражение: """Сборка и запуск исходного регистратора с подменой GPIO/IRQ на Windows.; порядок аргументов сохраняется.
|
||||
"""Сборка и запуск исходного регистратора с подменой GPIO/IRQ на Windows.
|
||||
|
||||
Нужны GCC либо Clang и lld-link в PATH. TEMPLATES_ROOT задаёт библиотеку. Проверяется алгоритм, но не ABI и тайминги TI.
|
||||
DLL создаётся во временной папке; исходные .out/.hex прошивки не затрагиваются.
|
||||
"""
|
||||
# Подключает модуль ctypes для этой проверки или подготовки сборки.
|
||||
import ctypes
|
||||
# Подключает модуль os для этой проверки или подготовки сборки.
|
||||
import os
|
||||
# Импортирует необходимые имена: from pathlib import Path.
|
||||
from pathlib import Path
|
||||
# Подключает модуль subprocess для этой проверки или подготовки сборки.
|
||||
import subprocess
|
||||
# Подключает модуль shutil для этой проверки или подготовки сборки.
|
||||
import shutil
|
||||
# Подключает модуль tempfile для этой проверки или подготовки сборки.
|
||||
import tempfile
|
||||
|
||||
# Задаёт root по выражению справа; значение используется последующими операциями.
|
||||
root = Path(__file__).resolve().parents[2]
|
||||
# Задаёт templates по выражению справа; значение используется последующими операциями.
|
||||
templates = Path(os.environ.get('TEMPLATES_ROOT', root.parent / 'newProject/SETGUI/third_party/templates'))
|
||||
# Задаёт protocol по выражению справа; значение используется последующими операциями.
|
||||
protocol = templates / 'c/set-protocol'
|
||||
# Задаёт compiler по выражению справа; значение используется последующими операциями.
|
||||
compiler = os.environ.get('CC') or shutil.which('clang') or shutil.which('gcc')
|
||||
# Проверяет условие if not compiler перед выполнением следующего блока.
|
||||
if not compiler:
|
||||
# Останавливает текущую операцию с исключением SystemExit('Clang or GCC is required in PATH').
|
||||
raise SystemExit('Clang or GCC is required in PATH')
|
||||
# Задаёт link_flags по выражению справа; значение используется последующими операциями.
|
||||
link_flags = [] if 'gcc' in Path(compiler).name else ['-nostdlib', '-fuse-ld=lld', '-Wl,/noentry,/nodefaultlib']
|
||||
# Открывает управляемый ресурс tempfile.TemporaryDirectory(prefix='ump-recorder-') as directory с автоматическим освобождением.
|
||||
with tempfile.TemporaryDirectory(prefix='ump-recorder-') as directory:
|
||||
# Exercise the production identity binding too, using a build-local header.
|
||||
# Запускает внешний компилятор, генератор или тест; ненулевой результат проверяется параметрами вызова.
|
||||
subprocess.run([
|
||||
# Продолжает текущий вызов, список или выражение: os.sys.executable, str(root / 'UKSSTMS320F28335/prepare_identity.py'),; порядок аргументов сохраняется.
|
||||
os.sys.executable, str(root / 'UKSSTMS320F28335/prepare_identity.py'),
|
||||
# Продолжает текущий вызов, список или выражение: '--project', str(root / 'UKSSTMS320F28335'), '--templates', str(templates),; порядок аргументов сохраняется.
|
||||
'--project', str(root / 'UKSSTMS320F28335'), '--templates', str(templates),
|
||||
# Продолжает текущий вызов, список или выражение: '--output', directory,; порядок аргументов сохраняется.
|
||||
'--output', directory,
|
||||
# Задаёт ], check по выражению справа; значение используется последующими операциями.
|
||||
], check=True)
|
||||
# Задаёт library по выражению справа; значение используется последующими операциями.
|
||||
library = Path(directory) / 'recorder_test.dll'
|
||||
# Запускает внешний компилятор, генератор или тест; ненулевой результат проверяется параметрами вызова.
|
||||
subprocess.run([
|
||||
# Продолжает текущий вызов, список или выражение: compiler, '-shared', *link_flags, '-Wno-unknown-pragmas', '-Wno-int-to-pointer-cast',; порядок аргументов сохраняется.
|
||||
compiler, '-shared', *link_flags, '-Wno-unknown-pragmas', '-Wno-int-to-pointer-cast',
|
||||
# Продолжает текущий вызов, список или выражение: '-Itests/ump_logger/stubs', '-ISource/Internal/Include',; порядок аргументов сохраняется.
|
||||
'-Itests/ump_logger/stubs', '-ISource/Internal/Include',
|
||||
# Продолжает текущий вызов, список или выражение: '-I' + str(protocol), '-I' + str(protocol / 'ports/tms320f28335'),; порядок аргументов сохраняется.
|
||||
'-I' + str(protocol), '-I' + str(protocol / 'ports/tms320f28335'),
|
||||
# Продолжает текущий вызов, список или выражение: '-I' + str(templates / 'c/firmware-info/include'), '-I' + directory,; порядок аргументов сохраняется.
|
||||
'-I' + str(templates / 'c/firmware-info/include'), '-I' + directory,
|
||||
# Продолжает текущий вызов, список или выражение: 'tests/ump_logger/recorder_test.c', 'Source/Internal/shared_ump.c', '-o', str(library),; порядок аргументов сохраняется.
|
||||
'tests/ump_logger/recorder_test.c', 'Source/Internal/shared_ump.c', '-o', str(library),
|
||||
# Задаёт ], cwd по выражению справа; значение используется последующими операциями.
|
||||
], cwd=root, check=True)
|
||||
# Отдельный процесс освобождает DLL до удаления временной папки Windows.
|
||||
# Запускает внешний компилятор, генератор или тест; ненулевой результат проверяется параметрами вызова.
|
||||
subprocess.run([
|
||||
# Продолжает текущий вызов, список или выражение: os.sys.executable, '-c',; порядок аргументов сохраняется.
|
||||
os.sys.executable, '-c',
|
||||
# Задаёт 'import ctypes,sys; r по выражению справа; значение используется последующими операциями.
|
||||
'import ctypes,sys; r=ctypes.CDLL(sys.argv[1]).run_tests(); '
|
||||
# Задаёт 'print("PASS" if r по выражению справа; значение используется последующими операциями.
|
||||
'print("PASS" if r==0 else f"FAIL: C line {r}"); sys.exit(bool(r))',
|
||||
# Продолжает текущий вызов, список или выражение: str(library),; порядок аргументов сохраняется.
|
||||
str(library),
|
||||
# Задаёт ], check по выражению справа; значение используется последующими операциями.
|
||||
], check=True)
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
|
||||
/* Объявляет ADC_table — АЦП table. Память определена в другом модуле. */
|
||||
extern unsigned int ADC_table[4];
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
|
||||
/* Объявляет IMPowse — данные IMPowse; WAKEpowse — данные WAKEpowse. Память определена в другом модуле. */
|
||||
extern unsigned long IMPowse, WAKEpowse;
|
||||
|
||||
@@ -1,9 +1,19 @@
|
||||
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
|
||||
/* Начинает условие: UMP_TEST_DEVICE_H ещё не определён; защищает повторное включение или задаёт значение сборки. */
|
||||
#ifndef UMP_TEST_DEVICE_H
|
||||
/* Определяет защитный символ или переключатель UMP_TEST_DEVICE_H для последующей компиляции. */
|
||||
#define UMP_TEST_DEVICE_H
|
||||
/* Описывает структуру mock_bits; порядок полей определяет расположение данных. */
|
||||
struct mock_bits { unsigned int GPIO3, GPIO6, GPIO8, GPIO11, GPIO58, GPIO62; };
|
||||
/* Описывает структуру mock_reg; порядок полей определяет расположение данных. */
|
||||
struct mock_reg { struct mock_bits bit; };
|
||||
/* Описывает структуру mock_gpio; порядок полей определяет расположение данных. */
|
||||
struct mock_gpio { struct mock_reg GPADAT, GPBDAT; };
|
||||
/* Продолжает список аргументов, полей или выражение extern struct mock_gpio GpioDataRegs;; порядок элементов сохраняется. */
|
||||
extern struct mock_gpio GpioDataRegs;
|
||||
/* Начинает функцию __disable_interrupts; назначение модуля — проверка ump_logger/stubs на модели ПК. */
|
||||
static unsigned int __disable_interrupts(void) { return 0; }
|
||||
/* Начинает функцию __restore_interrupts; назначение модуля — проверка ump_logger/stubs на модели ПК. */
|
||||
static void __restore_interrupts(unsigned int saved) { (void)saved; }
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
|
||||
/* Подмена зависимостей для проверки регистратора без платы. */
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
|
||||
/* Подмена зависимостей для проверки регистратора без платы. */
|
||||
|
||||
@@ -1,2 +1,5 @@
|
||||
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
|
||||
/* Объявляет READY — данные READY; Desk — аппаратно определённый тип платы; Mode — рабочий адрес или режим платы, выбранный перемычками. Память определена в другом модуле. */
|
||||
extern int READY, Desk, Mode;
|
||||
/* Задаёт READY_FREQ = 1000; частота основного такта Timer1 в герцах. */
|
||||
#define READY_FREQ 1000
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
|
||||
/* Подмена зависимостей для проверки регистратора без платы. */
|
||||
|
||||
@@ -1,11 +1,23 @@
|
||||
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
|
||||
/* Объявляет modbus — массив технологических регистров; слово int на C28x занимает 16 бит. Память определена в другом модуле. */
|
||||
extern int modbus[128];
|
||||
/* Задаёт dsk_LOAD = 6; код платы нагрузки. */
|
||||
#define dsk_LOAD 6
|
||||
/* Задаёт Commands = modbus[127]; слово команд, технологический регистр 127. */
|
||||
#define Commands modbus[127]
|
||||
/* Задаёт sens_data = (modbus+24); sens данные. */
|
||||
#define sens_data (modbus+24)
|
||||
/* Задаёт DAC_go = modbus[0x50]; начальный ток нагрузки в мА, технологический регистр 0x50. */
|
||||
#define DAC_go modbus[0x50]
|
||||
/* Задаёт DAC_stop = modbus[0x51]; конечный ток нагрузки в мА, технологический регистр 0x51. */
|
||||
#define DAC_stop modbus[0x51]
|
||||
/* Задаёт DAC_min = modbus[0x79]; ЦАП min. */
|
||||
#define DAC_min() modbus[0x79]
|
||||
/* Задаёт DAC_max = modbus[0x78]; ЦАП max. */
|
||||
#define DAC_max() modbus[0x78]
|
||||
/* Задаёт DAC_cal = modbus[0x7A]; ЦАП cal. */
|
||||
#define DAC_cal() modbus[0x7A]
|
||||
/* Задаёт DAC_04 = modbus[0x6F]; ЦАП 04. */
|
||||
#define DAC_04 modbus[0x6F]
|
||||
/* Задаёт DAC_20 = modbus[0x6E]; ЦАП 20. */
|
||||
#define DAC_20 modbus[0x6E]
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
|
||||
/* Подмена зависимостей для проверки регистратора без платы. */
|
||||
|
||||
@@ -1,65 +1,117 @@
|
||||
# Проверка ump_logger на модели пк. Комментарии и исходный текст в UTF-8.
|
||||
# Продолжает текущий вызов, список или выражение: """Exercise the current board-specific SCI8 gate without TI tools or hardware."""; порядок аргументов сохраняется.
|
||||
"""Exercise the current board-specific SCI8 gate without TI tools or hardware."""
|
||||
# Импортирует необходимые имена: from pathlib import Path.
|
||||
from pathlib import Path
|
||||
# Подключает модуль struct для этой проверки или подготовки сборки.
|
||||
import struct
|
||||
# Подключает модуль subprocess для этой проверки или подготовки сборки.
|
||||
import subprocess
|
||||
# Подключает модуль sys для этой проверки или подготовки сборки.
|
||||
import sys
|
||||
# Подключает модуль tempfile для этой проверки или подготовки сборки.
|
||||
import tempfile
|
||||
# Подключает модуль unittest для этой проверки или подготовки сборки.
|
||||
import unittest
|
||||
|
||||
# Задаёт ROOT по выражению справа; значение используется последующими операциями.
|
||||
ROOT = Path(__file__).resolve().parents[2]
|
||||
# Задаёт LIMIT по выражению справа; значение используется последующими операциями.
|
||||
LIMIT = (0x3FFF - (128 + 1)) * 2
|
||||
|
||||
|
||||
# Объявляет функцию image и её входные параметры.
|
||||
def image(size):
|
||||
# Задаёт header по выражению справа; значение используется последующими операциями.
|
||||
header = struct.pack('<H', 0x08AA) + bytes(16) + struct.pack('<HH', 0, 0x8000)
|
||||
# Задаёт blocks по выражению справа; значение используется последующими операциями.
|
||||
blocks = max(1, (size-24+131075)//131076)
|
||||
# Задаёт remaining по выражению справа; значение используется последующими операциями.
|
||||
remaining = (size-24-blocks*6)//2
|
||||
# Задаёт result по выражению справа; значение используется последующими операциями.
|
||||
result = bytearray(header)
|
||||
# Перебирает _ in range(blocks) в указанном порядке.
|
||||
for _ in range(blocks):
|
||||
# Задаёт words по выражению справа; значение используется последующими операциями.
|
||||
words = min(65535, remaining)
|
||||
# Задаёт result + по выражению справа; значение используется последующими операциями.
|
||||
result += struct.pack('<HHH', words, 0, 0x8000) + bytes(words*2)
|
||||
# Задаёт remaining - по выражению справа; значение используется последующими операциями.
|
||||
remaining -= words
|
||||
# Возвращает bytes(result)+bytes(2) вызывающему коду и завершает функцию.
|
||||
return bytes(result)+bytes(2)
|
||||
|
||||
|
||||
# Объявляет класс FirmwareGateTest для группировки проверок.
|
||||
class FirmwareGateTest(unittest.TestCase):
|
||||
# Объявляет функцию check_image и её входные параметры.
|
||||
def check_image(self, data, success, profile="AT25256B"):
|
||||
# Открывает управляемый ресурс tempfile.TemporaryDirectory() as directory с автоматическим освобождением.
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
# Задаёт source по выражению справа; значение используется последующими операциями.
|
||||
source = Path(directory) / 'candidate.bin'
|
||||
# Сохраняет подготовленный файл в указанном формате для следующего шага.
|
||||
source.write_bytes(data)
|
||||
# Запускает внешний компилятор, генератор или тест; ненулевой результат проверяется параметрами вызова.
|
||||
result = subprocess.run([
|
||||
# Продолжает текущий вызов, список или выражение: sys.executable, str(ROOT / 'tests/gas167/check_image.py'),; порядок аргументов сохраняется.
|
||||
sys.executable, str(ROOT / 'tests/gas167/check_image.py'),
|
||||
# Продолжает текущий вызов, список или выражение: str(source), '--eeprom', profile,; порядок аргументов сохраняется.
|
||||
str(source), '--eeprom', profile,
|
||||
# Задаёт ], capture_output по выражению справа; значение используется последующими операциями.
|
||||
], capture_output=True)
|
||||
# Задаёт self.assertEqual(result.returncode по выражению справа; значение используется последующими операциями.
|
||||
self.assertEqual(result.returncode == 0, success,
|
||||
# Задаёт result.stderr.decode(errors по выражению справа; значение используется последующими операциями.
|
||||
result.stderr.decode(errors='replace'))
|
||||
# Читает исходный файл или образ для последующей проверки и разбора.
|
||||
self.assertEqual(source.read_bytes(), data)
|
||||
# Возвращает result.stdout + result.stderr вызывающему коду и завершает функцию.
|
||||
return result.stdout + result.stderr
|
||||
|
||||
# Объявляет функцию test_exact_boundary_is_accepted и её входные параметры.
|
||||
def test_exact_boundary_is_accepted(self):
|
||||
# Продолжает текущий вызов, список или выражение: self.check_image(image(LIMIT), True); порядок аргументов сохраняется.
|
||||
self.check_image(image(LIMIT), True)
|
||||
|
||||
# Объявляет функцию test_34a95bc5_size_is_rejected и её входные параметры.
|
||||
def test_34a95bc5_size_is_rejected(self):
|
||||
# Продолжает текущий вызов, список или выражение: self.check_image(image(32518), False); порядок аргументов сохраняется.
|
||||
self.check_image(image(32518), False)
|
||||
|
||||
# Объявляет функцию test_missing_boot_terminator_is_rejected и её входные параметры.
|
||||
def test_missing_boot_terminator_is_rejected(self):
|
||||
# Продолжает текущий вызов, список или выражение: self.check_image(image(100)[:-2], False); порядок аргументов сохраняется.
|
||||
self.check_image(image(100)[:-2], False)
|
||||
|
||||
# Объявляет функцию test_partial_block_is_rejected и её входные параметры.
|
||||
def test_partial_block_is_rejected(self):
|
||||
# Продолжает текущий вызов, список или выражение: self.check_image(image(100)[:-10], False); порядок аргументов сохраняется.
|
||||
self.check_image(image(100)[:-10], False)
|
||||
|
||||
# Объявляет функцию test_m95_capacity_does_not_expand_code_ram и её входные параметры.
|
||||
def test_m95_capacity_does_not_expand_code_ram(self):
|
||||
# Задаёт diagnostic по выражению справа; значение используется последующими операциями.
|
||||
diagnostic = self.check_image(image(261884), False, "M95M02")
|
||||
# Продолжает текущий вызов, список или выражение: self.assertIn(b'outside code RAM', diagnostic); порядок аргументов сохраняется.
|
||||
self.assertIn(b'outside code RAM', diagnostic)
|
||||
# Продолжает текущий вызов, список или выражение: self.check_image(image(261886), False, "M95M02"); порядок аргументов сохраняется.
|
||||
self.check_image(image(261886), False, "M95M02")
|
||||
|
||||
# Объявляет функцию test_m95_image_rejected_for_small_part и её входные параметры.
|
||||
def test_m95_image_rejected_for_small_part(self):
|
||||
# Продолжает текущий вызов, список или выражение: self.check_image(image(32734), True, "M95M02"); порядок аргументов сохраняется.
|
||||
self.check_image(image(32734), True, "M95M02")
|
||||
# Продолжает текущий вызов, список или выражение: self.check_image(image(32734), False, "AT25256B"); порядок аргументов сохраняется.
|
||||
self.check_image(image(32734), False, "AT25256B")
|
||||
|
||||
# Объявляет функцию test_wrong_format_is_rejected и её входные параметры.
|
||||
def test_wrong_format_is_rejected(self):
|
||||
# Продолжает текущий вызов, список или выражение: self.check_image(bytes(100), False); порядок аргументов сохраняется.
|
||||
self.check_image(bytes(100), False)
|
||||
|
||||
|
||||
# Проверяет условие if __name__ == '__main__' перед выполнением следующего блока.
|
||||
if __name__ == '__main__':
|
||||
# Продолжает текущий вызов, список или выражение: unittest.main(); порядок аргументов сохраняется.
|
||||
unittest.main()
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
/* Проверка ump_logger на модели ПК. Русские пояснения сохранены в UTF-8. */
|
||||
/* Декларации TI-интринсиков только для проверки синтаксиса на компьютере. */
|
||||
/* Объявляет интерфейс функции __disable_interrupts; реализация вызывается через этот прототип. */
|
||||
unsigned int __disable_interrupts(void);
|
||||
/* Объявляет интерфейс функции __restore_interrupts; реализация вызывается через этот прототип. */
|
||||
void __restore_interrupts(unsigned int saved);
|
||||
|
||||
Reference in New Issue
Block a user