Сохранить русские комментарии и настройки проекта в 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
+37 -1
View File
@@ -1,3 +1,5 @@
# Проверка firmware_identity на модели пк. Комментарии и исходный текст в UTF-8.
# Продолжает текущий вызов, список или выражение: """Independent test oracle: does this built SCI8 file contain its manifest identity?; порядок аргументов сохраняется.
"""Independent test oracle: does this built SCI8 file contain its manifest identity?
This is a build test, not a second production protocol codec. The 12-word vector
@@ -5,38 +7,72 @@ is deliberately constructed independently of the C implementation to detect a
stale compilation unit, incorrect byte order or a mismatched pre-build JSON.
Usage: python tests/firmware_identity/check_build.py path/to/firmware.bin
"""
# Импортирует необходимые имена: from datetime import datetime.
from datetime import datetime
# Подключает модуль hashlib для этой проверки или подготовки сборки.
import hashlib
# Подключает модуль json для этой проверки или подготовки сборки.
import json
# Импортирует необходимые имена: from pathlib import Path.
from pathlib import Path
# Подключает модуль struct для этой проверки или подготовки сборки.
import struct
# Подключает модуль sys для этой проверки или подготовки сборки.
import sys
# Задаёт image по выражению справа; значение используется последующими операциями.
image = Path(sys.argv[1])
# Читает исходный файл или образ для последующей проверки и разбора.
data = image.read_bytes()
meta = json.loads(image.with_suffix(image.suffix + '.manifest.json').read_text())
# Читает исходный файл или образ для последующей проверки и разбора.
meta = json.loads(image.with_suffix(image.suffix + '.manifest.json').read_text(encoding="utf-8"))
# Проверяет обязательное условие hashlib.sha256(data).hexdigest() == meta['sha256'], 'Wrong file hash'; нарушение делает тест неуспешным.
assert hashlib.sha256(data).hexdigest() == meta['sha256'], 'Wrong file hash'
# Проверяет обязательное условие len(data) == meta['size_bytes'], 'Wrong image size'; нарушение делает тест неуспешным.
assert len(data) == meta['size_bytes'], 'Wrong image size'
# Задаёт stamp по выражению справа; значение используется последующими операциями.
stamp = datetime.fromisoformat(meta['built_at_utc'])
# Задаёт build_id по выражению справа; значение используется последующими операциями.
build_id = meta['build_id']
# Задаёт words по выражению справа; значение используется последующими операциями.
words = [1, *meta['version'], stamp.year, stamp.month * 256 + stamp.day,
# Продолжает текущий вызов, список или выражение: stamp.hour * 256 + stamp.minute, stamp.second]; порядок аргументов сохраняется.
stamp.hour * 256 + stamp.minute, stamp.second]
# Задаёт words + по выражению справа; значение используется последующими операциями.
words += [ord(build_id[i]) * 256 + ord(build_id[i+1]) for i in range(0, 8, 2)]
# Задаёт expected по выражению справа; значение используется последующими операциями.
expected = struct.pack('<12H', *words)
# Проверяет обязательное условие data[:2] == b'\xaa\x08', 'Not SCI8'; нарушение делает тест неуспешным.
assert data[:2] == b'\xaa\x08', 'Not SCI8'
# Задаёт offset по выражению справа; значение используется последующими операциями.
offset = 22
# Задаёт found по выражению справа; значение используется последующими операциями.
found = 0
# Повторяет блок при выполнении True.
while True:
# Задаёт count, по выражению справа; значение используется последующими операциями.
count, = struct.unpack_from('<H', data, offset)
# Задаёт offset + по выражению справа; значение используется последующими операциями.
offset += 2
# Проверяет условие if not count перед выполнением следующего блока.
if not count:
# Продолжает текущий вызов, список или выражение: break; порядок аргументов сохраняется.
break
# Задаёт offset + по выражению справа; значение используется последующими операциями.
offset += 4 # destination address, not part of the loaded section payload
# Задаёт end по выражению справа; значение используется последующими операциями.
end = offset + count * 2
# Проверяет обязательное условие end <= len(data), 'Truncated boot block'; нарушение делает тест неуспешным.
assert end <= len(data), 'Truncated boot block'
# Задаёт block по выражению справа; значение используется последующими операциями.
block = data[offset:end]
# Задаёт found + по выражению справа; значение используется последующими операциями.
found += sum(block[i:i+24] == expected for i in range(0, len(block)-23, 2))
# Задаёт offset по выражению справа; значение используется последующими операциями.
offset = end
# Проверяет обязательное условие offset == len(data), 'Trailing data'; нарушение делает тест неуспешным.
assert offset == len(data), 'Trailing data'
# Проверяет обязательное условие found == 1, f'Expected one embedded identity, found {found}'; нарушение делает тест неуспешным.
assert found == 1, f'Expected one embedded identity, found {found}'
# Продолжает текущий вызов, список или выражение: print(f'PASS: SCI8 contains manifest identity {meta["version"]}, {build_id}, {stamp.isoformat()}'); порядок аргументов сохраняется.
print(f'PASS: SCI8 contains manifest identity {meta["version"]}, {build_id}, {stamp.isoformat()}')
+30
View File
@@ -1,33 +1,63 @@
/* Проверка firmware_identity на модели ПК. Русские пояснения сохранены в UTF-8. */
/* Test the actual 167 binding, not just a fake protocol backend. Build against
* the generated header from the firmware build under test. No MCU registers. */
/* Подключает "firmware_identity.h": настройки и интерфейс firmware_identity. */
#include "firmware_identity.h"
/* Подключает "firmware_info_static.h": настройки и интерфейс firmware_info_static. */
#include "firmware_info_static.h"
/* Подключает "ump_tms28335.h": настройки и интерфейс ump_tms28335. */
#include "ump_tms28335.h"
/* Подключает <assert.h>: настройки и интерфейс assert. */
#include <assert.h>
/* Продолжает список аргументов, полей или выражение static unsigned logger_reads, logger_writes;; порядок элементов сохраняется. */
static unsigned logger_reads, logger_writes;
/* Проверяет область чтения регистратора и возвращает слова состояния либо архивной записи. */
unsigned int ump_log_read(unsigned int address)
/* Изменяет счётчик в выражении { (void)address; ++logger_reads; return 0x554dU; } на один для следующего шага. */
{ (void)address; ++logger_reads; return 0x554dU; }
/* Применяет допустимые команды управления регистратором, сохраняя ограничения адресов. */
int ump_log_write(unsigned int address, unsigned int value)
/* Изменяет счётчик в выражении { (void)address; (void)value; ++logger_writes; return 1; } на один для следующего шага. */
{ (void)address; (void)value; ++logger_writes; return 1; }
/* Точка входа: настраивает периферию, загружает параметры и обслуживает команды в главном цикле. */
int main(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет words — слова. */
uint16_t words[UMP_MAX_WORDS];
/* Продолжает список аргументов, полей или выражение ump_octet wire[UMP_RTU_CAPACITY];; порядок элементов сохраняется. */
ump_octet wire[UMP_RTU_CAPACITY];
/* Продолжает список аргументов, полей или выражение unsigned error, i;; порядок элементов сохраняется. */
unsigned error, i;
/* Вызывает assert с аргументами (ump_tms28335_prepare(3, UMP_FIRMWARE_INFO, 12, words, &error) == 12 && !error) в текущей последовательности операций. */
assert(ump_tms28335_prepare(3, UMP_FIRMWARE_INFO, 12, words, &error) == 12 && !error);
/* Вызывает assert с аргументами (words[0] == 1 && words[1] == FIRMWARE_VERSION_MAJOR) в текущей последовательности операций. */
assert(words[0] == 1 && words[1] == FIRMWARE_VERSION_MAJOR);
/* Вызывает assert с аргументами (words[2] == FIRMWARE_VERSION_MINOR && words[3] == FIRMWARE_VERSION_PATCH) в текущей последовательности операций. */
assert(words[2] == FIRMWARE_VERSION_MINOR && words[3] == FIRMWARE_VERSION_PATCH);
/* Вызывает assert с аргументами (words[4] == FI_YEAR && words[5] == FI_PAIR(FI_MONTH, FI_DAY)) в текущей последовательности операций. */
assert(words[4] == FI_YEAR && words[5] == FI_PAIR(FI_MONTH, FI_DAY));
/* Вызывает assert с аргументами (words[8] == FI_PAIR(FI_ID_0, FI_ID_1)) в текущей последовательности операций. */
assert(words[8] == FI_PAIR(FI_ID_0, FI_ID_1));
/* Вызывает assert с аргументами (logger_reads == 0) в текущей последовательности операций. */
assert(logger_reads == 0);
/* Вызывает assert с аргументами (ump_tms28335_rtu(1,3,UMP_FIRMWARE_INFO,12,wire,UMP_RTU_CAPACITY) == 29) в текущей последовательности операций. */
assert(ump_tms28335_rtu(1,3,UMP_FIRMWARE_INFO,12,wire,UMP_RTU_CAPACITY) == 29);
/* Цикл for (i=0; i<12; ++i) assert(((wire[3+i*2]<<8) | wire[4+i*2]) == words[i]);; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i=0; i<12; ++i) assert(((wire[3+i*2]<<8) | wire[4+i*2]) == words[i]);
/* Вызывает assert с аргументами (ump_crc(wire,29) == 0) в текущей последовательности операций. */
assert(ump_crc(wire,29) == 0);
/* Вызывает ump_tms28335_prepare с аргументами (6,UMP_FIRMWARE_INFO,123,words,&error) в текущей последовательности операций. */
ump_tms28335_prepare(6,UMP_FIRMWARE_INFO,123,words,&error);
/* Вызывает assert с аргументами (error == 2 && logger_writes == 0) в текущей последовательности операций. */
assert(error == 2 && logger_writes == 0);
/* Firmware reads must not steal the existing logger window. */
/* Вызывает assert с аргументами (ump_tms28335_prepare(3,UMP_BASE,16,words,&error) == 16 && !error) в текущей последовательности операций. */
assert(ump_tms28335_prepare(3,UMP_BASE,16,words,&error) == 16 && !error);
/* Вызывает assert с аргументами (logger_reads == 16 && words[0] == 0x554dU) в текущей последовательности операций. */
assert(logger_reads == 16 && words[0] == 0x554dU);
/* Завершает main и возвращает 0. */
return 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}