Сохранить русские комментарии и настройки проекта в UTF-8

Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
This commit is contained in:
2026-10-12 12:24:48 +03:00
parent 378e06a281
commit f741741cf8
137 changed files with 21576 additions and 2134 deletions
+53
View File
@@ -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;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
+152 -4
View File
@@ -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;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
+33 -2
View File
@@ -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')
+35
View File
@@ -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)
+2
View File
@@ -1 +1,3 @@
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
/* Объявляет ADC_table — АЦП table. Память определена в другом модуле. */
extern unsigned int ADC_table[4];
+2
View File
@@ -1 +1,3 @@
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
/* Объявляет IMPowse — данные IMPowse; WAKEpowse — данные WAKEpowse. Память определена в другом модуле. */
extern unsigned long IMPowse, WAKEpowse;
+10
View File
@@ -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
View File
@@ -1 +1,2 @@
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
/* Подмена зависимостей для проверки регистратора без платы. */
+1
View File
@@ -1 +1,2 @@
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
/* Подмена зависимостей для проверки регистратора без платы. */
+3
View File
@@ -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
View File
@@ -1 +1,2 @@
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
/* Подмена зависимостей для проверки регистратора без платы. */
+12
View File
@@ -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
View File
@@ -1 +1,2 @@
/* Проверка ump_logger/stubs на модели ПК. Русские пояснения сохранены в UTF-8. */
/* Подмена зависимостей для проверки регистратора без платы. */
+52
View File
@@ -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()
+3
View File
@@ -1,3 +1,6 @@
/* Проверка ump_logger на модели ПК. Русские пояснения сохранены в UTF-8. */
/* Декларации TI-интринсиков только для проверки синтаксиса на компьютере. */
/* Объявляет интерфейс функции __disable_interrupts; реализация вызывается через этот прототип. */
unsigned int __disable_interrupts(void);
/* Объявляет интерфейс функции __restore_interrupts; реализация вызывается через этот прототип. */
void __restore_interrupts(unsigned int saved);