Сохранить русские комментарии и настройки проекта в 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
+45
View File
@@ -1,48 +1,93 @@
# Проверка gas167 на модели пк. Комментарии и исходный текст в UTF-8.
# Продолжает текущий вызов, список или выражение: """Validate the PM35 RAM-load SCI8 image against the selected EEPROM profile."""; порядок аргументов сохраняется.
"""Validate the PM35 RAM-load SCI8 image against the selected EEPROM profile."""
# Подключает модуль argparse для этой проверки или подготовки сборки.
import argparse
# Импортирует необходимые имена: from pathlib import Path.
from pathlib import Path
# Подключает модуль struct для этой проверки или подготовки сборки.
import struct
# Объявляет функцию check_image и её входные параметры.
def check_image(path, eeprom):
# Читает исходный файл или образ для последующей проверки и разбора.
data = path.read_bytes()
# Задаёт limit по выражению справа; значение используется последующими операциями.
limit = {"AT25256B": 32508, "M95M02": 261884}[eeprom]
# Проверяет условие if not 24 <= len(data) <= limit перед выполнением следующего блока.
if not 24 <= len(data) <= limit:
# Останавливает текущую операцию с исключением ValueError(f"Image size {len(data)} outside 24..{limit}").
raise ValueError(f"Image size {len(data)} outside 24..{limit}")
# Проверяет условие if struct.unpack_from("<H", data)[0] != 0x08AA перед выполнением следующего блока.
if struct.unpack_from("<H", data)[0] != 0x08AA:
# Останавливает текущую операцию с исключением ValueError("Not a SCI8 boot image").
raise ValueError("Not a SCI8 boot image")
# Задаёт high, low по выражению справа; значение используется последующими операциями.
high, low = struct.unpack_from("<HH", data, 18)
# Задаёт entry по выражению справа; значение используется последующими операциями.
entry = (high << 16) | low
# Задаёт position, blocks по выражению справа; значение используется последующими операциями.
position, blocks = 22, []
# Повторяет блок при выполнении True.
while True:
# Проверяет условие if position + 2 > len(data) перед выполнением следующего блока.
if position + 2 > len(data):
# Останавливает текущую операцию с исключением ValueError("Missing boot terminator").
raise ValueError("Missing boot terminator")
# Задаёт words по выражению справа; значение используется последующими операциями.
words = struct.unpack_from("<H", data, position)[0]
# Задаёт position + по выражению справа; значение используется последующими операциями.
position += 2
# Проверяет условие if not words перед выполнением следующего блока.
if not words:
# Проверяет условие if position != len(data) перед выполнением следующего блока.
if position != len(data):
# Останавливает текущую операцию с исключением ValueError("Trailing bytes after boot terminator").
raise ValueError("Trailing bytes after boot terminator")
# Продолжает текущий вызов, список или выражение: break; порядок аргументов сохраняется.
break
# Проверяет условие if position + 4 + words * 2 > len(data) перед выполнением следующего блока.
if position + 4 + words * 2 > len(data):
# Останавливает текущую операцию с исключением ValueError("Truncated boot block").
raise ValueError("Truncated boot block")
# Задаёт high, low по выражению справа; значение используется последующими операциями.
high, low = struct.unpack_from("<HH", data, position)
# Задаёт address по выражению справа; значение используется последующими операциями.
address = (high << 16) | low
# Задаёт end по выражению справа; значение используется последующими операциями.
end = address + words
# Проверяет условие if not 0x8000 <= address < end <= 0xD000 перед выполнением следующего блока.
if not 0x8000 <= address < end <= 0xD000:
# Останавливает текущую операцию с исключением ValueError(f"Boot destination {address:#x}..{end:#x} outside code RAM").
raise ValueError(f"Boot destination {address:#x}..{end:#x} outside code RAM")
# Проверяет условие if any(address < old_end and old_start < end for old_start, old_end in blocks) перед выполнением следующего блока.
if any(address < old_end and old_start < end for old_start, old_end in blocks):
# Останавливает текущую операцию с исключением ValueError("Overlapping boot blocks").
raise ValueError("Overlapping boot blocks")
# Продолжает текущий вызов, список или выражение: blocks.append((address, end)); порядок аргументов сохраняется.
blocks.append((address, end))
# Задаёт position + по выражению справа; значение используется последующими операциями.
position += 4 + words * 2
# Проверяет условие if not any(start <= entry < end for start, end in blocks) перед выполнением следующего блока.
if not any(start <= entry < end for start, end in blocks):
# Останавливает текущую операцию с исключением ValueError("Entry point not loaded by the boot table").
raise ValueError("Entry point not loaded by the boot table")
# Возвращает len(data), len(blocks), limit - len(data) вызывающему коду и завершает функцию.
return len(data), len(blocks), limit - len(data)
# Проверяет условие if __name__ == "__main__" перед выполнением следующего блока.
if __name__ == "__main__":
# Задаёт parser по выражению справа; значение используется последующими операциями.
parser = argparse.ArgumentParser(description=__doc__)
# Задаёт parser.add_argument("image", type по выражению справа; значение используется последующими операциями.
parser.add_argument("image", type=Path)
# Задаёт parser.add_argument("--eeprom", choices по выражению справа; значение используется последующими операциями.
parser.add_argument("--eeprom", choices=("AT25256B", "M95M02"), required=True)
# Задаёт args по выражению справа; значение используется последующими операциями.
args = parser.parse_args()
# Задаёт size, blocks, free по выражению справа; значение используется последующими операциями.
size, blocks, free = check_image(args.image, args.eeprom)
# Продолжает текущий вызов, список или выражение: print(f"PASS SCI8 {args.eeprom}: {size} bytes, {blocks} RAM blocks, {free} bytes free"); порядок аргументов сохраняется.
print(f"PASS SCI8 {args.eeprom}: {size} bytes, {blocks} RAM blocks, {free} bytes free")
+192 -2
View File
@@ -1,196 +1,386 @@
/* Проверка gas167 на модели ПК. Русские пояснения сохранены в UTF-8. */
/* Подключает <assert.h>: настройки и интерфейс assert. */
#include <assert.h>
/* Подключает <stdbool.h>: настройки и интерфейс stdbool. */
#include <stdbool.h>
/* Подключает <stdint.h>: настройки и интерфейс stdint. */
#include <stdint.h>
/* Подключает <stdio.h>: настройки и интерфейс stdio. */
#include <stdio.h>
/* Подключает <string.h>: настройки и интерфейс string. */
#include <string.h>
/* Подключает "gas167.h": дополнительная карта GAS 167/v1 только для новой EEPROM M95M02. */
#include "gas167.h"
/* Подключает "ump_protocol.h": настройки и интерфейс ump_protocol. */
#include "ump_protocol.h"
/* Подключает "ump_tms28335.h": настройки и интерфейс ump_tms28335. */
#include "ump_tms28335.h"
/* Подключает "include/balsam167_eeprom_block.h": настройки и интерфейс balsam167_eeprom_block. */
#include "include/balsam167_eeprom_block.h"
/* Задаёт ANSWER_LEN = 128U; данные ANSWER_LEN. */
#define ANSWER_LEN 128U
/* Задаёт MAX_SEND_LENGTH = 400U; MAX SEND длина. */
#define MAX_SEND_LENGTH 400U
/* Задаёт CNTRL_ADDR = 16U; данные CNTRL_ADDR. */
#define CNTRL_ADDR 16U
/* Задаёт CMD_MODBUS_3 = 3U; данные CMD_MODBUS_3. */
#define CMD_MODBUS_3 3U
/* Задаёт CMD_MODBUS_6 = 6U; данные CMD_MODBUS_6. */
#define CMD_MODBUS_6 6U
/* Задаёт dsk_LOAD = 6; код платы нагрузки. */
#define dsk_LOAD 6
/* Задаёт LOBYTE = ((v) & 255U); данные LOBYTE. */
#define LOBYTE(v) ((v) & 255U)
/* Задаёт HIBYTE = (((v) >> 8) & 255U); данные HIBYTE. */
#define HIBYTE(v) (((v) >> 8) & 255U)
/* Задаёт UMP_CAN_MAX_WORDS = UMP_MAX_WORDS; UMP CAN MAX слова. */
#define UMP_CAN_MAX_WORDS UMP_MAX_WORDS
/* Задаёт ump_can_prepare = ump_tms28335_prepare; ump CAN prepare. */
#define ump_can_prepare ump_tms28335_prepare
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef struct { int all; } WORDE;
/* Задаёт Modbus = ((WORDE *)modbus); данные Modbus. */
#define Modbus ((WORDE *)modbus)
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef struct {
/* Объявляет RS_Header — данные RS_Header; buffer — буфер. */
uint16_t RS_Header[8], buffer[MAX_SEND_LENGTH];
/* Продолжает список аргументов, полей или выражение unsigned flag_TIMEOUT_to_Send;; порядок элементов сохраняется. */
unsigned flag_TIMEOUT_to_Send;
/* Продолжает список аргументов, полей или выражение } RS_DATA;; порядок элементов сохраняется. */
} RS_DATA;
/* Объявляет modbus — массив технологических регистров; слово int на C28x занимает 16 бит; Desk — аппаратно определённый тип платы; dsk_LOAD — код платы нагрузки. Начальное значение задаётся справа от знака равенства. */
int modbus[129], Desk = dsk_LOAD;
/* Продолжает список аргументов, полей или выражение static unsigned captures, spi_reads, sent, irq_depth, legacy_reads;; порядок элементов сохраняется. */
static unsigned captures, spi_reads, sent, irq_depth, legacy_reads;
/* Начинает функцию __disable_interrupts; назначение модуля — проверка gas167 на модели ПК. */
static unsigned __disable_interrupts(void) {
/* Записывает saved значением irq_depth; данные saved. */
unsigned saved = irq_depth;
/* Изменяет счётчик в выражении ++irq_depth; на один для следующего шага. */
++irq_depth;
/* Завершает __disable_interrupts и возвращает saved. */
return saved;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию __restore_interrupts; назначение модуля — проверка gas167 на модели ПК. */
static void __restore_interrupts(unsigned saved) { irq_depth = saved; }
/* Регистрирует изменение слова команд после записи по последовательному интерфейсу. */
void ump_log_rs(void) { ++captures; }
/* Проверяет область чтения регистратора и возвращает слова состояния либо архивной записи. */
unsigned int ump_log_read(unsigned int address) { ++legacy_reads; return address; }
/* Применяет допустимые команды управления регистратором, сохраняя ограничения адресов. */
int ump_log_write(unsigned int address, unsigned int value) { return 1; }
/* Начинает функцию get_crc_16; назначение модуля — проверка gas167 на модели ПК. */
static unsigned get_crc_16(unsigned seed, const uint16_t *data, unsigned size) {
/* Вызывает assert с аргументами (seed == 0xFFFFU) в текущей последовательности операций. */
assert(seed == 0xFFFFU);
/* Завершает get_crc_16 и возвращает ump_crc(data, size). */
return ump_crc(data, size);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Передаёт массив слов через SCI в выбранном режиме упаковки. */
static void RS_Send(RS_DATA *rs, uint16_t *data, unsigned size) {
/* Вызывает assert с аргументами (irq_depth == 0) в текущей последовательности операций. */
assert(irq_depth == 0);
/* Записывает sent значением size; данные sent. */
sent = size;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Читает EEPROM порциями; адрес задаётся словами C28x, размер переводится в число передаваемых слов. */
static void Seeprom_read(unsigned long word, uint16_t *data, unsigned bytes) {
/* Продолжает список аргументов, полей или выражение unsigned i;; порядок элементов сохраняется. */
unsigned i;
assert(irq_depth == 0); /* The Timer2 SPI driver must retain interrupts. */
assert(irq_depth == 0); /* The Timer2 SPI driver must retain interrupts. */ /* Вызывает assert с аргументами (irq_depth == 0) в текущей последовательности операций. */
/* Изменяет счётчик в выражении ++spi_reads; на один для следующего шага. */
++spi_reads;
/* Цикл for (i = 0; i < bytes/2; ++i) data[i] = (uint16_t)(0xBEEFU+i);; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < bytes/2; ++i) data[i] = (uint16_t)(0xBEEFU+i);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Фиксирует управляющие входы перед выполнением автомата защиты нагрузки. */
static unsigned Load_protection_prepare(unsigned fn, unsigned a, unsigned n,
/* Объявляет out — данные out. Хранит указатель на данные. */
uint16_t *out, unsigned *error) {
/* Записывает out[0] значением (uint16_t)a; out[1] = (uint16_t)n; *error = 0; данные out. */
out[0] = (uint16_t)a; out[1] = (uint16_t)n; *error = 0;
/* Завершает Load_protection_prepare и возвращает 2. */
return 2;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Описывает структуру mock_reg; порядок полей определяет расположение данных. */
struct mock_reg { uint32_t all; };
/* Продолжает список аргументов, полей или выражение static struct {; порядок элементов сохраняется. */
static struct {
/* Описывает структуру mock_reg CANTA, CANAA, CANTRR, CANTRS;; порядок полей определяет расположение данных. */
struct mock_reg CANTA, CANAA, CANTRR, CANTRS;
/* Продолжает список аргументов, полей или выражение } ECanaRegs;; порядок элементов сохраняется. */
} ECanaRegs;
/* Продолжает список аргументов, полей или выражение static struct {; порядок элементов сохраняется. */
static struct {
/* Описывает структуру ; порядок полей определяет расположение данных. */
struct { struct mock_reg MDH, MDL; } MBOX2;
/* Продолжает список аргументов, полей или выражение } ECanaMboxes;; порядок элементов сохраняется. */
} ECanaMboxes;
/* Продолжает список аргументов, полей или выражение static struct { unsigned long InterruptCount; } CpuTimer1;; порядок элементов сохраняется. */
static struct { unsigned long InterruptCount; } CpuTimer1;
/* Подключает "production_routes.inc": настройки и интерфейс production_routes. */
#include "production_routes.inc"
/* Начинает функцию request; назначение модуля — проверка gas167 на модели ПК. */
static void request(RS_DATA *rs, unsigned fn, unsigned a, unsigned n) {
/* Продолжает список аргументов, полей или выражение unsigned crc;; порядок элементов сохраняется. */
unsigned crc;
/* Вызывает memset с аргументами (rs, 0, sizeof(*rs)) в текущей последовательности операций. */
memset(rs, 0, sizeof(*rs));
/* Записывает rs->RS_Header[0] значением CNTRL_ADDR; rs->RS_Header[1] = fn; данные rs->RS_Header. */
rs->RS_Header[0] = CNTRL_ADDR; rs->RS_Header[1] = fn;
/* Записывает rs->RS_Header[2] значением a >> 8; rs->RS_Header[3] = a & 255U; данные rs->RS_Header. */
rs->RS_Header[2] = a >> 8; rs->RS_Header[3] = a & 255U;
/* Записывает rs->RS_Header[4] значением n >> 8; rs->RS_Header[5] = n & 255U; данные rs->RS_Header. */
rs->RS_Header[4] = n >> 8; rs->RS_Header[5] = n & 255U;
/* Записывает crc значением ump_crc(rs->RS_Header, 6); данные crc. */
crc = ump_crc(rs->RS_Header, 6);
/* Записывает rs->RS_Header[6] значением crc & 255U; rs->RS_Header[7] = crc >> 8; данные rs->RS_Header. */
rs->RS_Header[6] = crc & 255U; rs->RS_Header[7] = crc >> 8;
/* Записывает sent значением 0; данные sent. */
sent = 0;
/* Проверяет if (fn == 3) ReceiveCommandModbus3(rs); последующий оператор выполняется только при истинном условии. */
if (fn == 3) ReceiveCommandModbus3(rs);
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else ReceiveCommandModbus6(rs);
/* Вызывает assert с аргументами (irq_depth == 0 && rs->flag_TIMEOUT_to_Send) в текущей последовательности операций. */
assert(irq_depth == 0 && rs->flag_TIMEOUT_to_Send);
/* Вызывает assert с аргументами (ump_crc(rs->buffer, rs->buffer[1] & 128U ? 5 : в текущей последовательности операций. */
assert(ump_crc(rs->buffer, rs->buffer[1] & 128U ? 5 :
/* Продолжает список аргументов, полей или выражение (fn == 6 ? 8 : 5+rs->buffer[2])) == 0);; порядок элементов сохраняется. */
(fn == 6 ? 8 : 5+rs->buffer[2])) == 0);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию can_request; назначение модуля — проверка gas167 на модели ПК. */
static void can_request(unsigned fn, unsigned a, unsigned n) {
/* Вызывает memset с аргументами (&ECanaRegs, 0, sizeof(ECanaRegs)) в текущей последовательности операций. */
memset(&ECanaRegs, 0, sizeof(ECanaRegs));
/* Вызывает memset с аргументами (&ECanaMboxes, 0, sizeof(ECanaMboxes)) в текущей последовательности операций. */
memset(&ECanaMboxes, 0, sizeof(ECanaMboxes));
/* Записывает ump_can_waiting значением 0; ump_can_length = 0; ump_can_index = 0; ump CAN waiting. */
ump_can_waiting = 0; ump_can_length = 0; ump_can_index = 0;
/* Записывает ump_can_pending значением 1; ump_can_tag = 0x0100U | fn; флаг ожидающего запроса служебного CAN между ISR и главным циклом. */
ump_can_pending = 1; ump_can_tag = 0x0100U | fn;
/* Записывает ump_can_address значением a; ump_can_value = n; ump CAN адрес. */
ump_can_address = a; ump_can_value = n;
/* Вызывает UMP_CAN_service. В главном цикле готовит замороженный ответ служебного CAN и отправляет его двухсловными фрагментами. */
UMP_CAN_service();
/* Вызывает assert с аргументами (irq_depth == 0 && !ump_can_pending) в текущей последовательности операций. */
assert(irq_depth == 0 && !ump_can_pending);
/* Вызывает assert с аргументами (ECanaRegs.CANTRS.all == 4U) в текущей последовательности операций. */
assert(ECanaRegs.CANTRS.all == 4U);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Точка входа: настраивает периферию, загружает параметры и обслуживает команды в главном цикле. */
int main(void) {
/* Объявляет rs — данные rs. */
RS_DATA rs;
/* Продолжает список аргументов, полей или выражение unsigned i;; порядок элементов сохраняется. */
unsigned i;
/* Цикл for (i = 0; i < 129; ++i) modbus[i] = (int)i;; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 129; ++i) modbus[i] = (int)i;
/* Записывает modbus[128] значением 0xD00D; массив технологических регистров; слово int на C28x занимает 16 бит. */
modbus[128] = 0xD00D;
/* Exercise the real native handlers in both builds. */
/* Вызывает request с аргументами (&rs, 6, 1, 0xFEDC) в текущей последовательности операций. */
request(&rs, 6, 1, 0xFEDC);
/* Вызывает assert с аргументами (modbus[1] == 0xFEDC && sent == 10) в текущей последовательности операций. */
assert(modbus[1] == 0xFEDC && sent == 10);
/* Вызывает request с аргументами (&rs, 3, 0, 2) в текущей последовательности операций. */
request(&rs, 3, 0, 2);
/* Вызывает assert с аргументами (rs.buffer[2] == 4 && rs.buffer[5] == 0xFE && rs.buffer[6] == 0xDC) в текущей последовательности операций. */
assert(rs.buffer[2] == 4 && rs.buffer[5] == 0xFE && rs.buffer[6] == 0xDC);
/* Вызывает request с аргументами (&rs, 6, 0x52, 0) в текущей последовательности операций. */
request(&rs, 6, 0x52, 0);
/* Вызывает assert с аргументами (rs.buffer[1] == 0x86 && rs.buffer[2] == 3 && modbus[0x52] == 0x52) в текущей последовательности операций. */
assert(rs.buffer[1] == 0x86 && rs.buffer[2] == 3 && modbus[0x52] == 0x52);
/* Вызывает request с аргументами (&rs, 6, 0x7C, 9) в текущей последовательности операций. */
request(&rs, 6, 0x7C, 9);
/* Вызывает assert с аргументами (rs.buffer[2] == 2 && modbus[0x7C] == 0x7C) в текущей последовательности операций. */
assert(rs.buffer[2] == 2 && modbus[0x7C] == 0x7C);
/* Existing UMP and protection routing must still work. */
/* Вызывает request с аргументами (&rs, 3, 0x1000, 2) в текущей последовательности операций. */
request(&rs, 3, 0x1000, 2);
/* Вызывает assert с аргументами (rs.buffer[1] == 3 && rs.buffer[3] == 0x10 && legacy_reads == 2) в текущей последовательности операций. */
assert(rs.buffer[1] == 3 && rs.buffer[3] == 0x10 && legacy_reads == 2);
/* Вызывает request с аргументами (&rs, 3, 0x1300, 2) в текущей последовательности операций. */
request(&rs, 3, 0x1300, 2);
/* Вызывает assert с аргументами (rs.buffer[1] == 3 && rs.buffer[3] == 0x13) в текущей последовательности операций. */
assert(rs.buffer[1] == 3 && rs.buffer[3] == 0x13);
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет out — данные out. */
uint16_t out[124];
/* Продолжает список аргументов, полей или выражение unsigned error, count;; порядок элементов сохраняется. */
unsigned error, count;
/* Цикл for (i = 0; i < 65536U; ++i); задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 65536U; ++i)
/* Вызывает assert с аргументами (gas167_contains((uint16_t)i) == в текущей последовательности операций. */
assert(gas167_contains((uint16_t)i) ==
/* Продолжает список аргументов, полей или выражение ((i >= 0x5000U && i <= 0x507FU) || (i >= 0x5F00U && i <= 0x5F07U)));; порядок элементов сохраняется. */
((i >= 0x5000U && i <= 0x507FU) || (i >= 0x5F00U && i <= 0x5F07U)));
/* Вызывает assert с аргументами (gas167_prepare(3, 0x5000, 124, 0, out, &error) == 124 && !error) в текущей последовательности операций. */
assert(gas167_prepare(3, 0x5000, 124, 0, out, &error) == 124 && !error);
/* Вызывает assert с аргументами (out[1] == 0xFEDC && out[123] == 123) в текущей последовательности операций. */
assert(out[1] == 0xFEDC && out[123] == 123);
/* Записывает count значением gas167_prepare(3, 0x507F, 2, 0, out, &error); число. */
count = gas167_prepare(3, 0x507F, 2, 0, out, &error);
/* Вызывает assert с аргументами (count == 2 && error == 2 && modbus[128] == 0xD00D) в текущей последовательности операций. */
assert(count == 2 && error == 2 && modbus[128] == 0xD00D);
/* Вызывает assert с аргументами (gas167_prepare(3, 0x5000, 0, 0, out, &error) == 2 && error == 3) в текущей последовательности операций. */
assert(gas167_prepare(3, 0x5000, 0, 0, out, &error) == 2 && error == 3);
/* Вызывает assert с аргументами (gas167_prepare(3, 0x5000, 125, 0, out, &error) == 2 && error == 3) в текущей последовательности операций. */
assert(gas167_prepare(3, 0x5000, 125, 0, out, &error) == 2 && error == 3);
/* Вызывает assert с аргументами (gas167_prepare(3, 0x5000, 1, 1, out, &error) == 2 && error == 3) в текущей последовательности операций. */
assert(gas167_prepare(3, 0x5000, 1, 1, out, &error) == 2 && error == 3);
/* Вызывает assert с аргументами (gas167_prepare(3, 0xFFFF, 2, 0, out, &error) == 2 && error == 2) в текущей последовательности операций. */
assert(gas167_prepare(3, 0xFFFF, 2, 0, out, &error) == 2 && error == 2);
/* Вызывает assert с аргументами (gas167_prepare(16, 0x5000, 1, 0, out, &error) == 2 && error == 1) в текущей последовательности операций. */
assert(gas167_prepare(16, 0x5000, 1, 0, out, &error) == 2 && error == 1);
/* Вызывает assert с аргументами (gas167_prepare(6, 0x5080, 7, 0, out, &error) == 2 && error == 2) в текущей последовательности операций. */
assert(gas167_prepare(6, 0x5080, 7, 0, out, &error) == 2 && error == 2);
/* Вызывает assert с аргументами (gas167_prepare(6, 0x5052, 60001, 0, out, &error) == 2 && error == 3) в текущей последовательности операций. */
assert(gas167_prepare(6, 0x5052, 60001, 0, out, &error) == 2 && error == 3);
/* Вызывает assert с аргументами (gas167_prepare(6, 0x5052, 60000, 0, out, &error) == 2 && !error) в текущей последовательности операций. */
assert(gas167_prepare(6, 0x5052, 60000, 0, out, &error) == 2 && !error);
/* Вызывает assert с аргументами (modbus[0x52] == 60000) в текущей последовательности операций. */
assert(modbus[0x52] == 60000);
/* Вызывает assert с аргументами (gas167_prepare(3, 0x5000, 1, 0, 0, &error) == 0) в текущей последовательности операций. */
assert(gas167_prepare(3, 0x5000, 1, 0, 0, &error) == 0);
/* Вызывает assert с аргументами (gas167_prepare(6, 0x5000, 1, 0, out, 0) == 0 && modbus[0] == 0) в текущей последовательности операций. */
assert(gas167_prepare(6, 0x5000, 1, 0, out, 0) == 0 && modbus[0] == 0);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывает request с аргументами (&rs, 3, 0x5000, 2) в текущей последовательности операций. */
request(&rs, 3, 0x5000, 2);
/* Вызывает assert с аргументами (sent == 9 && rs.buffer[5] == 0xFE && rs.buffer[6] == 0xDC) в текущей последовательности операций. */
assert(sent == 9 && rs.buffer[5] == 0xFE && rs.buffer[6] == 0xDC);
/* Вызывает request с аргументами (&rs, 3, 0x5000, 124) в текущей последовательности операций. */
request(&rs, 3, 0x5000, 124);
/* Вызывает assert с аргументами (sent == 253 && rs.buffer[2] == 248) в текущей последовательности операций. */
assert(sent == 253 && rs.buffer[2] == 248);
/* Вызывает request с аргументами (&rs, 3, 0x5F00, 8) в текущей последовательности операций. */
request(&rs, 3, 0x5F00, 8);
/* Вызывает assert с аргументами (sent == 21 && rs.buffer[3] == 0x47 && rs.buffer[4] == 0x41) в текущей последовательности операций. */
assert(sent == 21 && rs.buffer[3] == 0x47 && rs.buffer[4] == 0x41);
/* Вызывает assert с аргументами (rs.buffer[5] == 0x53 && rs.buffer[6] == 0x31) в текущей последовательности операций. */
assert(rs.buffer[5] == 0x53 && rs.buffer[6] == 0x31);
/* Вызывает assert с аргументами (rs.buffer[10] == 167 && rs.buffer[18] == 1) в текущей последовательности операций. */
assert(rs.buffer[10] == 167 && rs.buffer[18] == 1);
/* Вызывает request с аргументами (&rs, 6, 0x5F00, 0) в текущей последовательности операций. */
request(&rs, 6, 0x5F00, 0);
/* Вызывает assert с аргументами (sent == 5 && rs.buffer[2] == 2) в текущей последовательности операций. */
assert(sent == 5 && rs.buffer[2] == 2);
/* Вызывает request с аргументами (&rs, 3, 0x5F07, 2) в текущей последовательности операций. */
request(&rs, 3, 0x5F07, 2);
/* Вызывает assert с аргументами (rs.buffer[2] == 2) в текущей последовательности операций. */
assert(rs.buffer[2] == 2);
/* Вызывает request с аргументами (&rs, 6, 0x5052, 0) в текущей последовательности операций. */
request(&rs, 6, 0x5052, 0);
/* Вызывает assert с аргументами (rs.buffer[2] == 3 && modbus[0x52] == 60000) в текущей последовательности операций. */
assert(rs.buffer[2] == 3 && modbus[0x52] == 60000);
/* Вызывает request с аргументами (&rs, 6, 0x507D, 9) в текущей последовательности операций. */
request(&rs, 6, 0x507D, 9);
/* Вызывает assert с аргументами (rs.buffer[2] == 2 && modbus[0x7D] == 0x7D) в текущей последовательности операций. */
assert(rs.buffer[2] == 2 && modbus[0x7D] == 0x7D);
/* Вызывает request с аргументами (&rs, 6, 0x507F, 0x80) в текущей последовательности операций. */
request(&rs, 6, 0x507F, 0x80);
/* Вызывает assert с аргументами (sent == 8 && rs.buffer[2] == 0x50 && rs.buffer[3] == 0x7F) в текущей последовательности операций. */
assert(sent == 8 && rs.buffer[2] == 0x50 && rs.buffer[3] == 0x7F);
/* Вызывает assert с аргументами (captures == 1 && modbus[127] == 0x80) в текущей последовательности операций. */
assert(captures == 1 && modbus[127] == 0x80);
/* Вызывает can_request с аргументами (6, 0x5001, 0xFEDC) в текущей последовательности операций. */
can_request(6, 0x5001, 0xFEDC);
/* Вызывает assert с аргументами (modbus[1] == 0xFEDC && ECanaMboxes.MBOX2.MDL.all == 0x5001FEDCUL) в текущей последовательности операций. */
assert(modbus[1] == 0xFEDC && ECanaMboxes.MBOX2.MDL.all == 0x5001FEDCUL);
/* Вызывает assert с аргументами (ECanaMboxes.MBOX2.MDH.all == 0x1F000100UL) в текущей последовательности операций. */
assert(ECanaMboxes.MBOX2.MDH.all == 0x1F000100UL);
/* Вызывает can_request с аргументами (3, 0x5001, 2) в текущей последовательности операций. */
can_request(3, 0x5001, 2);
/* Вызывает assert с аргументами (ECanaMboxes.MBOX2.MDL.all == 0xFEDC0002UL) в текущей последовательности операций. */
assert(ECanaMboxes.MBOX2.MDL.all == 0xFEDC0002UL);
/* Вызывает can_request с аргументами (3, 0x5000, 124) в текущей последовательности операций. */
can_request(3, 0x5000, 124);
/* Вызывает assert с аргументами (ump_can_length == 124 && ump_can_index == 2) в текущей последовательности операций. */
assert(ump_can_length == 124 && ump_can_index == 2);
modbus[2] = 777; /* All fragments must retain the original snapshot. */
modbus[2] = 777; /* All fragments must retain the original snapshot. */ /* Записывает modbus[2] значением 777; массив технологических регистров; слово int на C28x занимает 16 бит. */
/* Цикл for (i = 1; i < 62; ++i) ; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 1; i < 62; ++i) {
/* Записывает ECanaRegs.CANTA.all значением 4; представление регистра целым словом без разбиения на битовые поля. */
ECanaRegs.CANTA.all = 4;
/* Вызывает UMP_CAN_service. В главном цикле готовит замороженный ответ служебного CAN и отправляет его двухсловными фрагментами. */
UMP_CAN_service();
/* Вызывает assert с аргументами (ump_can_index == 2*(i+1)) в текущей последовательности операций. */
assert(ump_can_index == 2*(i+1));
/* Проверяет if (i == 1) assert(ECanaMboxes.MBOX2.MDL.all == 0x00020003UL); последующий оператор выполняется только при истинном условии. */
if (i == 1) assert(ECanaMboxes.MBOX2.MDL.all == 0x00020003UL);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает modbus[2] значением 2; массив технологических регистров; слово int на C28x занимает 16 бит. */
modbus[2] = 2;
/* Вызывает can_request с аргументами (3, 0x5000, 3) в текущей последовательности операций. */
can_request(3, 0x5000, 3);
/* Вызывает assert с аргументами (ECanaMboxes.MBOX2.MDH.all == 0x1F000103UL) в текущей последовательности операций. */
assert(ECanaMboxes.MBOX2.MDH.all == 0x1F000103UL);
/* Вызывает can_request с аргументами (6, 0x507C, 9) в текущей последовательности операций. */
can_request(6, 0x507C, 9);
/* Вызывает assert с аргументами ((ECanaMboxes.MBOX2.MDH.all & 255U) == 2 && modbus[0x7C] == 0x7C) в текущей последовательности операций. */
assert((ECanaMboxes.MBOX2.MDH.all & 255U) == 2 && modbus[0x7C] == 0x7C);
/* Вызывает can_request с аргументами (6, 0x507F, 0x40) в текущей последовательности операций. */
can_request(6, 0x507F, 0x40);
/* Вызывает assert с аргументами (captures == 2 && modbus[127] == 0x40) в текущей последовательности операций. */
assert(captures == 2 && modbus[127] == 0x40);
/* Вызывает can_request с аргументами (6, 0x5F00, 9) в текущей последовательности операций. */
can_request(6, 0x5F00, 9);
/* Вызывает assert с аргументами ((ECanaMboxes.MBOX2.MDH.all & 255U) == 2) в текущей последовательности операций. */
assert((ECanaMboxes.MBOX2.MDH.all & 255U) == 2);
/* Вызывает request с аргументами (&rs, 3, 0x8000, 0x8001) в текущей последовательности операций. */
request(&rs, 3, 0x8000, 0x8001);
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Вызывает request с аргументами (&rs, 3, 0x5000, 2) в текущей последовательности операций. */
request(&rs, 3, 0x5000, 2);
/* Вызывает assert с аргументами (sent == 5 && rs.buffer[2] == 2) в текущей последовательности операций. */
assert(sent == 5 && rs.buffer[2] == 2);
/* Вызывает request с аргументами (&rs, 6, 0x5001, 9) в текущей последовательности операций. */
request(&rs, 6, 0x5001, 9);
/* Вызывает assert с аргументами (rs.buffer[2] == 2 && modbus[1] == 0xFEDC) в текущей последовательности операций. */
assert(rs.buffer[2] == 2 && modbus[1] == 0xFEDC);
/* Вызывает request с аргументами (&rs, 3, 0x5000, 124) в текущей последовательности операций. */
request(&rs, 3, 0x5000, 124);
/* Вызывает assert с аргументами (sent == 5 && rs.buffer[2] == 2) в текущей последовательности операций. */
assert(sent == 5 && rs.buffer[2] == 2);
/* Вызывает request с аргументами (&rs, 3, 0x5F00, 8) в текущей последовательности операций. */
request(&rs, 3, 0x5F00, 8);
/* Вызывает assert с аргументами (rs.buffer[2] == 2) в текущей последовательности операций. */
assert(rs.buffer[2] == 2);
/* Вызывает can_request с аргументами (6, 0x5001, 9) в текущей последовательности операций. */
can_request(6, 0x5001, 9);
/* Вызывает assert с аргументами ((ECanaMboxes.MBOX2.MDH.all & 255U) == 2 && modbus[1] == 0xFEDC) в текущей последовательности операций. */
assert((ECanaMboxes.MBOX2.MDH.all & 255U) == 2 && modbus[1] == 0xFEDC);
/* Вызывает assert с аргументами (captures == 0) в текущей последовательности операций. */
assert(captures == 0);
/* Вызывает request с аргументами (&rs, 3, 0x8000, 1) в текущей последовательности операций. */
request(&rs, 3, 0x8000, 1);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Вызывает assert с аргументами (spi_reads == 1 && rs.buffer[3] == 0xBE && rs.buffer[4] == 0xEF) в текущей последовательности операций. */
assert(spi_reads == 1 && rs.buffer[3] == 0xBE && rs.buffer[4] == 0xEF);
/* Вызывает assert с аргументами (modbus[128] == 0xD00D) в текущей последовательности операций. */
assert(modbus[128] == 0xD00D);
/* Вызывает printf с аргументами ("PASS GAS167 profile %d: production RTU/CAN routes, guards, CRC and legacy services\n", EEPROM_M95M02) в текущей последовательности операций. */
printf("PASS GAS167 profile %d: production RTU/CAN routes, guards, CRC and legacy services\n", EEPROM_M95M02);
/* Завершает main и возвращает 0. */
return 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
+48 -2
View File
@@ -1,51 +1,97 @@
# Проверка gas167 на модели пк. Комментарии и исходный текст в UTF-8.
# Продолжает текущий вызов, список или выражение: """Exercise the production GAS provider and extracted production RTU/CAN routes."""; порядок аргументов сохраняется.
"""Exercise the production GAS provider and extracted production RTU/CAN routes."""
# Подключает модуль os для этой проверки или подготовки сборки.
import os
# Импортирует необходимые имена: from pathlib import Path.
from pathlib import Path
# Подключает модуль re для этой проверки или подготовки сборки.
import re
# Подключает модуль shutil для этой проверки или подготовки сборки.
import shutil
# Подключает модуль subprocess для этой проверки или подготовки сборки.
import subprocess
# Подключает модуль 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("gcc") or "C:/msys64/mingw64/bin/gcc.exe"
# Задаёт os.environ["PATH"] по выражению справа; значение используется последующими операциями.
os.environ["PATH"] = str(Path(compiler).resolve().parent) + os.pathsep + os.environ["PATH"]
# Объявляет функцию function и её входные параметры.
def function(text, name):
# Задаёт match по выражению справа; значение используется последующими операциями.
match = re.search(r"^(?:static )?(?:void|int) " + name + r"\(", text, re.M)
# Проверяет условие if not match перед выполнением следующего блока.
if not match:
# Останавливает текущую операцию с исключением ValueError(f"Production function {name} missing").
raise ValueError(f"Production function {name} missing")
# Задаёт end по выражению справа; значение используется последующими операциями.
end = re.search(r"^}", text[match.start():], re.M)
# Проверяет условие if not end перед выполнением следующего блока.
if not end:
# Останавливает текущую операцию с исключением ValueError(f"Production function {name} incomplete").
raise ValueError(f"Production function {name} incomplete")
# Возвращает text[match.start():match.start() + end.end()] + "\n" вызывающему коду и завершает функцию.
return text[match.start():match.start() + end.end()] + "\n"
message = (root / "Source/Internal/message.c").read_text(encoding="cp1251")
ecan = (root / "Source/Internal/ecan.c").read_text(encoding="cp1251")
# Читает исходный файл или образ для последующей проверки и разбора.
message = (root / "Source/Internal/message.c").read_text(encoding="utf-8")
# Читает исходный файл или образ для последующей проверки и разбора.
ecan = (root / "Source/Internal/ecan.c").read_text(encoding="utf-8")
# Задаёт can_globals по выражению справа; значение используется последующими операциями.
can_globals = ecan[ecan.index("static volatile unsigned int ump_can_pending;"):
# Продолжает текущий вызов, список или выражение: ecan.index("static unsigned long ump_can_sent_at;") + len("static unsigned long ump_can_sent_at;")]; порядок аргументов сохраняется.
ecan.index("static unsigned long ump_can_sent_at;") + len("static unsigned long ump_can_sent_at;")]
# On C28x unsigned int is uint16_t. Preserve that target word layout on GCC.
# Задаёт can_globals по выражению справа; значение используется последующими операциями.
can_globals = can_globals.replace("static unsigned int ump_can_reply[",
# Продолжает текущий вызов, список или выражение: "static uint16_t ump_can_reply["); порядок аргументов сохраняется.
"static uint16_t ump_can_reply[")
# Задаёт routes по выражению справа; значение используется последующими операциями.
routes = can_globals + "\n" + "".join(function(message, name) for name in
# Продолжает текущий вызов, список или выражение: ("modbus_exception", "receive_ump", "ReceiveCommandModbus3", "ReceiveCommandModbus6")); порядок аргументов сохраняется.
("modbus_exception", "receive_ump", "ReceiveCommandModbus3", "ReceiveCommandModbus6"))
# Задаёт routes + по выражению справа; значение используется последующими операциями.
routes += function(ecan, "UMP_CAN_service")
# Открывает управляемый ресурс tempfile.TemporaryDirectory(prefix="gas167-test-") as tmp с автоматическим освобождением.
with tempfile.TemporaryDirectory(prefix="gas167-test-") as tmp:
# Задаёт directory по выражению справа; значение используется последующими операциями.
directory = Path(tmp)
# Сохраняет подготовленный файл в указанном формате для следующего шага.
(directory / "production_routes.inc").write_text(routes, encoding="utf-8")
# Перебирает profile in (0, 1) в указанном порядке.
for profile in (0, 1):
# Задаёт exe по выражению справа; значение используется последующими операциями.
exe = directory / f"gas167_{profile}.exe"
# Запускает внешний компилятор, генератор или тест; ненулевой результат проверяется параметрами вызова.
subprocess.run([compiler, "-std=c99", "-Wall", "-Wextra",
# Продолжает текущий вызов, список или выражение: "-Wno-unused-function", "-Wno-unused-parameter",; порядок аргументов сохраняется.
"-Wno-unused-function", "-Wno-unused-parameter",
# Задаёт f"-DEEPROM_M95M02 по выражению справа; значение используется последующими операциями.
f"-DEEPROM_M95M02={profile}", "-I" + str(directory),
# Продолжает текущий вызов, список или выражение: "-ISource/Internal/Include", "-I" + str(protocol),; порядок аргументов сохраняется.
"-ISource/Internal/Include", "-I" + str(protocol),
# Продолжает текущий вызов, список или выражение: "-I" + str(protocol / "include"),; порядок аргументов сохраняется.
"-I" + str(protocol / "include"),
# Продолжает текущий вызов, список или выражение: "-I" + str(protocol / "ports/tms320f28335"),; порядок аргументов сохраняется.
"-I" + str(protocol / "ports/tms320f28335"),
# Продолжает текущий вызов, список или выражение: "tests/gas167/gas167_test.c", "Source/Internal/gas167.c",; порядок аргументов сохраняется.
"tests/gas167/gas167_test.c", "Source/Internal/gas167.c",
# Продолжает текущий вызов, список или выражение: str(protocol / "src/ump_protocol.c"),; порядок аргументов сохраняется.
str(protocol / "src/ump_protocol.c"),
# Продолжает текущий вызов, список или выражение: str(protocol / "ports/tms320f28335/ump_tms28335.c"),; порядок аргументов сохраняется.
str(protocol / "ports/tms320f28335/ump_tms28335.c"),
# Задаёт "-o", str(exe)], cwd по выражению справа; значение используется последующими операциями.
"-o", str(exe)], cwd=root, check=True)
# Запускает внешний компилятор, генератор или тест; ненулевой результат проверяется параметрами вызова.
subprocess.run([str(exe)], check=True, timeout=10)