Сохранить русские комментарии и настройки проекта в UTF-8
Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
This commit is contained in:
@@ -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
@@ -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;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user