diff --git a/Bin/EepromPublishFix/rebuild.py b/Bin/EepromPublishFix/rebuild.py deleted file mode 100644 index c65f869..0000000 --- a/Bin/EepromPublishFix/rebuild.py +++ /dev/null @@ -1,41 +0,0 @@ -from pathlib import Path # Формирует абсолютные пути сборки и установленных инструментов TI. -import subprocess # Выполняет компиляцию и проверку без shell-подстановок. -import json # Читает фактический идентификатор текущей сборки из её паспорта. -import sys # Использует текущий Python для подготовки паспорта и образа. -root = Path.cwd().resolve() # Фиксирует разрешённый корень проекта. -out = root / 'Bin/EepromPublishFix' # Изолирует исправление публикации задания EEPROM от предыдущих образов. -obj = out / 'obj' # Хранит объекты полной текущей пересборки. -gen = out / 'generated' # Хранит паспорт текущих исходников. -for directory in (out, obj, gen): # Создаёт только подкаталоги этой сборки. - directory.mkdir(parents=True, exist_ok=True) # Не удаляет старые файлы проекта. -ti = Path('C:/ti/ccs1230/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS') # Повторяет установленный компилятор CCS. -templates = root.parent / 'newProject/templates' # Использует штатную общую библиотеку проекта. -protocol = templates / 'c/set-protocol' # Задаёт интерфейсы и карту памяти УМП. -name = 'UKSSTMS320F28335_eeprom_fix' # Обозначает исправление обмена заданием EEPROM между главным циклом и Timer2. -log = (out / 'build.log').open('w', encoding='utf-8') # Записывает диагностику в UTF-8. -def run(args): # Останавливает сборку при ошибке любого шага. - result = subprocess.run([str(arg) for arg in args], cwd=root, capture_output=True) # Передаёт параметры инструменту напрямую. - output = (result.stdout + result.stderr).decode('utf-8', errors='replace') # Декодирует диагностический вывод. - log.write(output); log.flush() # Сохраняет текущий результат до следующего шага. - if result.returncode: # Запрещает формирование готового BIN после ошибки. - print(output); raise SystemExit(result.returncode) # Показывает причину незавершённой сборки. - return output # Возвращает отчёт успешно выполненного шага. -run([sys.executable, root / 'UKSSTMS320F28335/prepare_identity.py', '--project', root / 'UKSSTMS320F28335', '--templates', templates, '--output', gen]) # Обновляет паспорт перед полной компиляцией. -includes = [root / 'UKSSTMS320F28335', root / 'Source/Internal/Include', root / 'Source/External/v120/DSP2833x_headers/include', root / 'Source/External/v120/DSP2833x_common/include', protocol, protocol / 'ports/tms320f28335', templates / 'c/firmware-info/include', gen, ti / 'include'] # Повторяет каталоги CCS с локальным паспортом сборки. -flags = ['-v28', '-ml', '-mt', '--float_support=fpu32', '-O3', '--opt_for_speed=0', '--define=EEPROM_M95M02=0', '--define=_DEBUG', '--define=LARGE_MODEL', '-g', '--diag_warning=225', '--display_error_number', '--gen_func_subsections=on', '--abi=coffabi'] # Проверяет исправление при оптимизации O3 проекта CCS; EEPROM_M95M02=0 явно выбирает AT25256B. -flags += ['--include_path=' + str(path) for path in includes] # Передаёт каждый каталог отдельным аргументом. -common = root / 'Source/External/v120/DSP2833x_common/source' # Задаёт уже используемый комплект TI. -external = ['DSP2833x_ADC_cal.asm', 'DSP2833x_Adc.c', 'DSP2833x_CpuTimers.c', 'DSP2833x_PieCtrl.c', 'DSP2833x_SWPrioritizedDefaultIsr.c', 'DSP2833x_SWPrioritizedPieVect.c', 'DSP2833x_SysCtrl.c', 'DSP2833x_Xintf.c', 'DSP2833x_usDelay.asm'] # Повторяет штатный список внешних исходников. -sources = [common / item for item in external] + [root / 'Source/External/v120/DSP2833x_headers/source/DSP2833x_GlobalVariableDefs.c'] + sorted((root / 'Source/Internal').glob('*.c')) # Пересобирает все модули после окончательной правки. -for source in sources: # Последовательно компилирует каждый модуль. - run([ti / 'bin/cl2000.exe', *flags, '--obj_directory=' + str(obj), source]) # Проверяет настоящий C28x-код и создаёт новый объект. -objects = [obj / (source.stem + '.obj') for source in sources] # Использует только объекты завершённой текущей компиляции. -run([ti / 'bin/cl2000.exe', '-v28', '-ml', '-mt', '--float_support=fpu32', '--abi=coffabi', '-z', '--map_file=' + str(out / (name + '.map')), '--stack_size=0x3f0', '--warn_sections', '-i' + str(ti / 'lib'), '-i' + str(root), '-i' + str(protocol), '-i' + str(ti / 'include'), '--reread_libs', '--display_error_number', '--entry_point=_c_int00', '--rom_model', '--output_file=' + str(out / (name + '.out')), root / 'F28335.cmd', root / 'Source/External/v120/DSP2833x_headers/cmd/DSP2833x_Headers_nonBIOS.cmd', *objects, root / 'Libraries/rts2800_fpu32.lib', '-lrts2800_fpu32.lib', '-llibc.a']) # Линкует со штатной картой памяти и библиотеками времени выполнения. -run([ti / 'bin/hex2000.exe', '--diag_wrap=off', '--boot', '--sci8', '--binary', '-o', out / (name + '.candidate'), out / (name + '.out')]) # Создаёт кандидат загрузочного образа для обязательной проверки размера. -print(run([sys.executable, root / 'tests/gas167/check_image.py', out / (name + '.candidate'), '--eeprom', 'AT25256B']).strip()) # Проверяет EEPROM, RAM-блоки и точку входа до выдачи прошивки. -print(run([sys.executable, templates / 'c/firmware-info/tools/c2000_postbuild.py', '--compiler', ti, '--build-dir', out, '--artifact', name, '--metadata', gen / 'firmware_identity.json', '--output', out]).strip()) # Создаёт штатный BIN, манифест и SHA-256 без экспорта в другие проекты. -bin_path = out / (name + '_' + json.loads((gen / 'firmware_identity.json').read_text(encoding='utf-8'))['build_id'] + '.bin') # Выбирает именно текущую сборку, даже если в каталоге остаются прежние BIN. -print(run([sys.executable, root / 'tests/gas167/check_image.py', bin_path, '--eeprom', 'AT25256B']).strip()) # Повторяет проверку на самом выдаваемом BIN после штатной упаковки. -assert bin_path.read_bytes() == (out / (name + '.candidate')).read_bytes() # Подтверждает совпадение проверенного кандидата и итоговой прошивки. -log.close() # Завершает полный лог успешно проверенной сборки. -print('READY:', bin_path) # Указывает пользователю точный готовый результат. diff --git a/Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin b/Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin deleted file mode 100644 index b1299f6..0000000 Binary files a/Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin and /dev/null differ diff --git a/Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin.manifest.json b/Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin.manifest.json deleted file mode 100644 index f79d04c..0000000 --- a/Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin.manifest.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "schema": 1, - "product": "Balsam-167-PM35", - "target": "TMS320F28335", - "version": [ - 1, - 1, - 2 - ], - "build_id": "c6c9128+", - "built_at_utc": "2026-10-09T13:10:25+00:00", - "source": { - "commit": "c6c91282387adc789a7ebbc6f7e763d02b549789", - "dirty": true - }, - "templates": { - "commit": "86ece3ea907cc92db73390eaae7551dd01b54e2c", - "dirty": true - }, - "identity_contract": 1, - "identity_register_count": 12, - "eeprom": "M95M02", - "eeprom_bytes": 262144, - "firmware_limit_bytes": 261884, - "gas": { - "enabled": true, - "version": 1, - "profile": 167, - "info_words": 8, - "register_count": 128, - "transports": [ - "modbus_rtu", - "ump_service_can" - ], - "info_base": 24320, - "register_base": 20480 - }, - "file": "UKSSTMS320F28335_GAS_M95M02.bin", - "size_bytes": 33174, - "sha256": "a1c186e5f114ea2f77ac5f18a60424c79f53b1e3a49e0343ac9bd96979f0347e" -} diff --git a/Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin.sha256 b/Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin.sha256 deleted file mode 100644 index 867b9dd..0000000 --- a/Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin.sha256 +++ /dev/null @@ -1 +0,0 @@ -a1c186e5f114ea2f77ac5f18a60424c79f53b1e3a49e0343ac9bd96979f0347e UKSSTMS320F28335_GAS_M95M02.bin diff --git a/Bin/GAS_M95M02/profile-comparison.json b/Bin/GAS_M95M02/profile-comparison.json deleted file mode 100644 index 64e855a..0000000 --- a/Bin/GAS_M95M02/profile-comparison.json +++ /dev/null @@ -1,16 +0,0 @@ -[ - { - "after_bytes": 32472, - "profile": 0, - "gas_added_bytes": 0, - "binary_identical": true, - "before_bytes": 32472 - }, - { - "after_bytes": 33174, - "profile": 1, - "gas_added_bytes": 410, - "binary_identical": false, - "before_bytes": 32764 - } -] \ No newline at end of file diff --git a/Bin/IndicatorTimingCompare/A_delay_before_clock_fall/kanal.c b/Bin/IndicatorTimingCompare/A_delay_before_clock_fall/kanal.c deleted file mode 100644 index 60e7201..0000000 --- a/Bin/IndicatorTimingCompare/A_delay_before_clock_fall/kanal.c +++ /dev/null @@ -1,358 +0,0 @@ -/* Последовательный вывод данных канала индикации. Русские пояснения сохранены в UTF-8. */ -/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */ -#include "DSP2833x_Device.h" // DSP281x Headerfile Include File -/* Подключает "DSP2833x_SWPrioritizedIsrLevels.h": поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. */ -#include "DSP2833x_SWPrioritizedIsrLevels.h" -/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */ -#include "filter_bat2.h" -/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */ -#include "measure.h" - -/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */ -#include "RS485.h" -/* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */ -#include "message.h" -/* Подключает "kanal.h": последовательный вывод данных канала индикации. */ -#include "kanal.h" -/* Подключает "pulto.h": обмен и индикация пульта. */ -#include "pulto.h" -/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */ -#include "package.h" -/* Подключает "tools.h": настройка внешней памяти и служебные задержки. */ -#include "tools.h" - -/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */ -#include "peripher.h" - -/* Объявляет digits — данные digits. Начальное значение задаётся справа от знака равенства. */ -int digits[16] = {63,6,91,79,102,109,125,7,127,111,64,0,0,0,121,0}; -/* Объявляет readr — данные readr. Начальное значение задаётся справа от знака равенства. */ -int readr[5] = {0x08,0x0C,0x10,0x00,0x04}; - -/* Ограничивает настройки таймингов компилятором TI C2000; модель на ПК не использует эти директивы. */ -#if defined(__TI_COMPILER_VERSION__) -/* Сохраняет отдельный вызов переключения CLOCK: встраивание при -O3 сокращало удержание DATA после фронта. */ -#pragma FUNC_CANNOT_INLINE(DCLK) -/* Возвращает генерацию DCLK как в образе от 06.10.2026: уровень 1 и приоритет скорости 3 сохраняют прежнюю последовательность инструкций GPIO. */ -#pragma FUNCTION_OPTIONS(DCLK, "--opt_level=1 --opt_for_speed=3") -/* Сохраняет отдельный вызов переключения DATA, чтобы длительность импульсов не зависела от встраивания в передатчик. */ -#pragma FUNC_CANNOT_INLINE(DOUT) -/* Возвращает генерацию DOUT с прежними параметрами -O1 и --opt_for_speed=3; значения взяты из старой конфигурации CCS. */ -#pragma FUNCTION_OPTIONS(DOUT, "--opt_level=1 --opt_for_speed=3") -/* Не позволяет встроить разделитель пакетов в цикл передачи и изменить интервалы между переключениями линий. */ -#pragma FUNC_CANNOT_INLINE(RESET) -/* Сохраняет прежнюю последовательность вызовов GPIO и задержек разделителя, используя настройки старого образа. */ -#pragma FUNCTION_OPTIONS(RESET, "--opt_level=1 --opt_for_speed=3") -/* Сохраняет отдельный вызов передачи бита; протокол использует порядок и интервалы фронтов CLOCK и DATA. */ -#pragma FUNC_CANNOT_INLINE(SENDBIT) -/* Возвращает передаче бита настройки старого образа -O1 и --opt_for_speed=3, оставляя остальной проект на -O3. */ -#pragma FUNCTION_OPTIONS(SENDBIT, "--opt_level=1 --opt_for_speed=3") -/* Завершает блок настроек TI, не изменяя формат пакетов и существующие счётчики задержек. */ -#endif - -/* Начинает функцию DCLK; назначение модуля — последовательный вывод данных канала индикации. */ -void DCLK(int x) -/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ -{ - /* Проверяет if(x) GpioDataRegs.GPASET.bit.GPIO6=1; последующий оператор выполняется только при истинном условии. */ - if(x) GpioDataRegs.GPASET.bit.GPIO6=1; - /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */ - else GpioDataRegs.GPACLEAR.bit.GPIO6=1; -/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ -} - -/* Начинает функцию DOUT; назначение модуля — последовательный вывод данных канала индикации. */ -void DOUT(int x) -/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ -{ - /* Проверяет if(x) GpioDataRegs.GPASET.bit.GPIO8=1; последующий оператор выполняется только при истинном условии. */ - if(x) GpioDataRegs.GPASET.bit.GPIO8=1; - /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */ - else GpioDataRegs.GPACLEAR.bit.GPIO8=1; -/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ -} - -/* Условие компиляции CLKMULT==1: выбранный блок включается в текущий вариант прошивки. */ -#if CLKMULT==1 -/* Задаёт POWS0 = 0L; данные POWS0. */ -#define POWS0 0L -/* Задаёт POWS1 = 10L; данные POWS1. */ -#define POWS1 10L -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif -/* Условие компиляции CLKMULT==2: выбранный блок включается в текущий вариант прошивки. */ -#if CLKMULT==2 -/* Задаёт POWS0 = 0L; данные POWS0. */ -#define POWS0 0L -/* Задаёт POWS1 = 30L; данные POWS1. */ -#define POWS1 30L -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif -/* Условие компиляции CLKMULT==3: выбранный блок включается в текущий вариант прошивки. */ -#if CLKMULT==3 -/* Задаёт POWS0 = 1L; данные POWS0. */ -#define POWS0 1L -/* Задаёт POWS1 = 50L; данные POWS1. */ -#define POWS1 50L -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif -/* Условие компиляции CLKMULT==4: выбранный блок включается в текущий вариант прошивки. */ -#if CLKMULT==4 -/* Задаёт POWS0 = 2L; данные POWS0. */ -#define POWS0 2L -/* Задаёт POWS1 = 60L; данные POWS1. */ -#define POWS1 60L -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif -/* Условие компиляции CLKMULT==5: выбранный блок включается в текущий вариант прошивки. */ -#if CLKMULT==5 -/* Задаёт POWS0 = 4L; данные POWS0. */ -#define POWS0 4L -/* Задаёт POWS1 = 80L; данные POWS1. */ -#define POWS1 80L -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif - -/* Начинает функцию RESET; назначение модуля — последовательный вывод данных канала индикации. */ -void RESET() -/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ -{ - /* Вызывает DCLK с аргументами (0) в текущей последовательности операций. */ - DCLK(0); -/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */ -#if POWS1>0 - /* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */ - DSP28x_usDelay(POWS1); -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif - /* Вызывает DOUT с аргументами (1) в текущей последовательности операций. */ - DOUT(1); -/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */ -#if POWS1>0 - /* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */ - DSP28x_usDelay(POWS1); -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif - /* Вызывает DOUT с аргументами (0) в текущей последовательности операций. */ - DOUT(0); -/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */ -#if POWS1>0 - /* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */ - DSP28x_usDelay(POWS1); -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif -/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ -} - -/* Начинает функцию SENDBIT; назначение модуля — последовательный вывод данных канала индикации. */ -void SENDBIT(int x) -/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ -{ - /* Выставляет передаваемый бит DATA до подъёма CLOCK, сохраняя его на протяжении высокого уровня такта. */ - DOUT(x); DCLK(1); -/* Условие компиляции POWS0>0: выбранный блок включается в текущий вариант прошивки. */ -#if POWS0>0 - /* Вызывает DSP28x_usDelay с аргументами (POWS0) в текущей последовательности операций. */ - DSP28x_usDelay(POWS0); -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif - /* Вариант A: задержка перед спадом CLOCK продлевает высокий уровень при действительном DATA; POWS0+1 — прежний счётчик циклов TI, не микросекунды. */ - DSP28x_usDelay(POWS0+1); - /* Опускает CLOCK при ещё действительном DATA, чтобы сохранить передаваемый бит на отрицательном фронте такта. */ - DCLK(0); - /* Сбрасывает DATA после спада CLOCK; в варианте A дополнительной задержки между спадом и сбросом нет. */ - DOUT(0); -/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */ -#if POWS1>0 - /* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */ - DSP28x_usDelay(POWS1); -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif -/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ -} - -/* Начинает функцию kanal_Send; назначение модуля — последовательный вывод данных канала индикации. */ -void kanal_Send(int adr, long dat, int dot) -/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ -{ - /* Объявляет Word — слово; data — данные; aliq_part — данные aliq_part; dg — данные dg. */ - long Word,data,aliq_part,dg[4]; - /* Объявляет i — данные i; j — данные j; bit — представление регистра отдельными битовыми полями; byt — данные byt; addr — данные addr. Начальное значение задаётся справа от знака равенства. */ - int i,j,bit,byt,addr,sgn=0,punkt=0,aliq_len=0,full_len, isdot=0; - - /* Проверяет if(adr>1); последующий оператор выполняется только при истинном условии. */ - if(adr>1) // Лампочки - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Записывает Word значением dat; слово. */ - Word =dat; - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - - /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */ - else - - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Проверяет if(dat<0) sgn=1; последующий оператор выполняется только при истинном условии. */ - if(dat<0) sgn=1; - /* Записывает data значением labs(dat); данные. */ - data = labs(dat); - - /* Проверяет if(dot>=0 и dot<4) isdot = 1; последующий оператор выполняется только при истинном условии. */ - if(dot>=0 && dot<4) isdot = 1; - /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */ - else dot=0; - - /* Записывает aliq_part значением data; данные aliq_part. */ - aliq_part = data; - /* Цикл for(i=0;i0). */ - while(dat>0) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Делит dat значением 10; данные dat. */ - aliq_len++; dat/=10; - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - - /* Записывает dat значением data; данные dat. */ - dat = data; - - /* Записывает full_len значением aliq_len+sgn; данные full_len. */ - full_len = aliq_len+sgn; - /* Проверяет if(full_len==0) full_len=1; последующий оператор выполняется только при истинном условии. */ - if(full_len==0) full_len=1; - /* Увеличивает full_len значением dot; данные full_len. */ - full_len += dot; - - /* Цикл for(i=0; i<(full_len-4);i++); задаёт начальное значение, условие продолжения и шаг перебора. */ - for(i=0; i<(full_len-4);i++) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Начинает цикл с проверкой условия после тела: первый проход выполняется всегда. */ - dot--; dat/=10; - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - /* Проверяет if(dot<0) dot=0; последующий оператор выполняется только при истинном условии. */ - if(dot<0) dot=0; - /* Записывает punkt значением 1<0;i--); задаёт начальное значение, условие продолжения и шаг перебора. */ - for(i=3;i>0;i--) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Проверяет if((dg[i]==0) и (i!=dot)); последующий оператор выполняется только при истинном условии. */ - if((dg[i]==0)&&(i!=dot)) - /* Записывает dg[i] значением 0xF; данные dg. */ - dg[i]=0xF; // Это значит пусто - /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */ - else break; - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - - /* Проверяет if(sgn); последующий оператор выполняется только при истинном условии. */ - if(sgn) - /* Цикл for(i=1;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */ - for(i=1;i<4;i++) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Проверяет if( (dg[i]==0xF) или (i==3)); последующий оператор выполняется только при истинном условии. */ - if( (dg[i]==0xF)||(i==3)) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Записывает dg[i] значением 0xA; данные dg. */ - dg[i]=0xA; // Это значит минус - /* Прерывает ближайший цикл или ветвь switch и продолжает после него. */ - break; - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } } - - /* Цикл for(i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */ - for(i=0;i<4;i++) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Записывает dg[i] значением digits[dg[i]]; данные dg. */ - dg[i] = digits[dg[i]]; - /* Проверяет if((punkt>>i)&1) dg[i]+= 128; последующий оператор выполняется только при истинном условии. */ - if((punkt>>i)&1) dg[i]+= 128; - - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - - /* Записывает Word значением ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) |; слово. */ - Word = ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) | - /* Продолжает список аргументов, полей или выражение ((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000);; порядок элементов сохраняется. */ - ((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000); - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - - /* Записывает addr значением readr[adr]; данные addr. */ - addr = readr[adr]; - - /* Цикл for (i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */ - for (i=0;i<4;i++) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Проверяет if(addr>0x10) break; последующий оператор выполняется только при истинном условии. */ - if(addr>0x10) break; - - /* Цикл for (j=0;j<8;j++); задаёт начальное значение, условие продолжения и шаг перебора. */ - for (j=0;j<8;j++) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Записывает bit значением Word & 1; Word >>= 1; представление регистра отдельными битовыми полями. */ - bit = Word & 1; Word >>= 1; - /* Вызывает SENDBIT с аргументами (bit) в текущей последовательности операций. */ - SENDBIT(bit); - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - - /* Записывает byt значением addr; данные byt. */ - byt = addr; - /* Цикл for (j=0;j<6;j++); задаёт начальное значение, условие продолжения и шаг перебора. */ - for (j=0;j<6;j++) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Записывает bit значением byt & 1; byt >>= 1; представление регистра отдельными битовыми полями. */ - bit = byt & 1; byt >>= 1; - /* Вызывает SENDBIT с аргументами (bit) в текущей последовательности операций. */ - SENDBIT(bit); - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - /* Изменяет счётчик в выражении addr++; на один для следующего шага. */ - addr++; - - /* Вызывает RESET с аргументами () в текущей последовательности операций. */ - RESET(); - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } -/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ -} diff --git a/Bin/IndicatorTimingCompare/B_delay_after_clock_fall/kanal.c b/Bin/IndicatorTimingCompare/B_delay_after_clock_fall/kanal.c deleted file mode 100644 index b89eedb..0000000 --- a/Bin/IndicatorTimingCompare/B_delay_after_clock_fall/kanal.c +++ /dev/null @@ -1,358 +0,0 @@ -/* Последовательный вывод данных канала индикации. Русские пояснения сохранены в UTF-8. */ -/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */ -#include "DSP2833x_Device.h" // DSP281x Headerfile Include File -/* Подключает "DSP2833x_SWPrioritizedIsrLevels.h": поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. */ -#include "DSP2833x_SWPrioritizedIsrLevels.h" -/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */ -#include "filter_bat2.h" -/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */ -#include "measure.h" - -/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */ -#include "RS485.h" -/* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */ -#include "message.h" -/* Подключает "kanal.h": последовательный вывод данных канала индикации. */ -#include "kanal.h" -/* Подключает "pulto.h": обмен и индикация пульта. */ -#include "pulto.h" -/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */ -#include "package.h" -/* Подключает "tools.h": настройка внешней памяти и служебные задержки. */ -#include "tools.h" - -/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */ -#include "peripher.h" - -/* Объявляет digits — данные digits. Начальное значение задаётся справа от знака равенства. */ -int digits[16] = {63,6,91,79,102,109,125,7,127,111,64,0,0,0,121,0}; -/* Объявляет readr — данные readr. Начальное значение задаётся справа от знака равенства. */ -int readr[5] = {0x08,0x0C,0x10,0x00,0x04}; - -/* Ограничивает настройки таймингов компилятором TI C2000; модель на ПК не использует эти директивы. */ -#if defined(__TI_COMPILER_VERSION__) -/* Сохраняет отдельный вызов переключения CLOCK: встраивание при -O3 сокращало удержание DATA после фронта. */ -#pragma FUNC_CANNOT_INLINE(DCLK) -/* Возвращает генерацию DCLK как в образе от 06.10.2026: уровень 1 и приоритет скорости 3 сохраняют прежнюю последовательность инструкций GPIO. */ -#pragma FUNCTION_OPTIONS(DCLK, "--opt_level=1 --opt_for_speed=3") -/* Сохраняет отдельный вызов переключения DATA, чтобы длительность импульсов не зависела от встраивания в передатчик. */ -#pragma FUNC_CANNOT_INLINE(DOUT) -/* Возвращает генерацию DOUT с прежними параметрами -O1 и --opt_for_speed=3; значения взяты из старой конфигурации CCS. */ -#pragma FUNCTION_OPTIONS(DOUT, "--opt_level=1 --opt_for_speed=3") -/* Не позволяет встроить разделитель пакетов в цикл передачи и изменить интервалы между переключениями линий. */ -#pragma FUNC_CANNOT_INLINE(RESET) -/* Сохраняет прежнюю последовательность вызовов GPIO и задержек разделителя, используя настройки старого образа. */ -#pragma FUNCTION_OPTIONS(RESET, "--opt_level=1 --opt_for_speed=3") -/* Сохраняет отдельный вызов передачи бита; протокол использует порядок и интервалы фронтов CLOCK и DATA. */ -#pragma FUNC_CANNOT_INLINE(SENDBIT) -/* Возвращает передаче бита настройки старого образа -O1 и --opt_for_speed=3, оставляя остальной проект на -O3. */ -#pragma FUNCTION_OPTIONS(SENDBIT, "--opt_level=1 --opt_for_speed=3") -/* Завершает блок настроек TI, не изменяя формат пакетов и существующие счётчики задержек. */ -#endif - -/* Начинает функцию DCLK; назначение модуля — последовательный вывод данных канала индикации. */ -void DCLK(int x) -/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ -{ - /* Проверяет if(x) GpioDataRegs.GPASET.bit.GPIO6=1; последующий оператор выполняется только при истинном условии. */ - if(x) GpioDataRegs.GPASET.bit.GPIO6=1; - /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */ - else GpioDataRegs.GPACLEAR.bit.GPIO6=1; -/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ -} - -/* Начинает функцию DOUT; назначение модуля — последовательный вывод данных канала индикации. */ -void DOUT(int x) -/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ -{ - /* Проверяет if(x) GpioDataRegs.GPASET.bit.GPIO8=1; последующий оператор выполняется только при истинном условии. */ - if(x) GpioDataRegs.GPASET.bit.GPIO8=1; - /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */ - else GpioDataRegs.GPACLEAR.bit.GPIO8=1; -/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ -} - -/* Условие компиляции CLKMULT==1: выбранный блок включается в текущий вариант прошивки. */ -#if CLKMULT==1 -/* Задаёт POWS0 = 0L; данные POWS0. */ -#define POWS0 0L -/* Задаёт POWS1 = 10L; данные POWS1. */ -#define POWS1 10L -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif -/* Условие компиляции CLKMULT==2: выбранный блок включается в текущий вариант прошивки. */ -#if CLKMULT==2 -/* Задаёт POWS0 = 0L; данные POWS0. */ -#define POWS0 0L -/* Задаёт POWS1 = 30L; данные POWS1. */ -#define POWS1 30L -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif -/* Условие компиляции CLKMULT==3: выбранный блок включается в текущий вариант прошивки. */ -#if CLKMULT==3 -/* Задаёт POWS0 = 1L; данные POWS0. */ -#define POWS0 1L -/* Задаёт POWS1 = 50L; данные POWS1. */ -#define POWS1 50L -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif -/* Условие компиляции CLKMULT==4: выбранный блок включается в текущий вариант прошивки. */ -#if CLKMULT==4 -/* Задаёт POWS0 = 2L; данные POWS0. */ -#define POWS0 2L -/* Задаёт POWS1 = 60L; данные POWS1. */ -#define POWS1 60L -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif -/* Условие компиляции CLKMULT==5: выбранный блок включается в текущий вариант прошивки. */ -#if CLKMULT==5 -/* Задаёт POWS0 = 4L; данные POWS0. */ -#define POWS0 4L -/* Задаёт POWS1 = 80L; данные POWS1. */ -#define POWS1 80L -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif - -/* Начинает функцию RESET; назначение модуля — последовательный вывод данных канала индикации. */ -void RESET() -/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ -{ - /* Вызывает DCLK с аргументами (0) в текущей последовательности операций. */ - DCLK(0); -/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */ -#if POWS1>0 - /* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */ - DSP28x_usDelay(POWS1); -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif - /* Вызывает DOUT с аргументами (1) в текущей последовательности операций. */ - DOUT(1); -/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */ -#if POWS1>0 - /* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */ - DSP28x_usDelay(POWS1); -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif - /* Вызывает DOUT с аргументами (0) в текущей последовательности операций. */ - DOUT(0); -/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */ -#if POWS1>0 - /* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */ - DSP28x_usDelay(POWS1); -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif -/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ -} - -/* Начинает функцию SENDBIT; назначение модуля — последовательный вывод данных канала индикации. */ -void SENDBIT(int x) -/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ -{ - /* Выставляет передаваемый бит DATA до подъёма CLOCK, сохраняя его на протяжении высокого уровня такта. */ - DOUT(x); DCLK(1); -/* Условие компиляции POWS0>0: выбранный блок включается в текущий вариант прошивки. */ -#if POWS0>0 - /* Вызывает DSP28x_usDelay с аргументами (POWS0) в текущей последовательности операций. */ - DSP28x_usDelay(POWS0); -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif - /* Опускает CLOCK при ещё действительном DATA, чтобы сохранить передаваемый бит на отрицательном фронте такта. */ - DCLK(0); - /* Вариант B: задержка между DCLK(0) и DOUT(0) удерживает DATA после спада CLOCK; POWS0+1 — прежний счётчик циклов TI, не микросекунды. */ - DSP28x_usDelay(POWS0+1); - /* Сбрасывает DATA после завершения паузы удержания, возвращая линию к нулю перед следующим битом. */ - DOUT(0); -/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */ -#if POWS1>0 - /* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */ - DSP28x_usDelay(POWS1); -/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ -#endif -/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ -} - -/* Начинает функцию kanal_Send; назначение модуля — последовательный вывод данных канала индикации. */ -void kanal_Send(int adr, long dat, int dot) -/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ -{ - /* Объявляет Word — слово; data — данные; aliq_part — данные aliq_part; dg — данные dg. */ - long Word,data,aliq_part,dg[4]; - /* Объявляет i — данные i; j — данные j; bit — представление регистра отдельными битовыми полями; byt — данные byt; addr — данные addr. Начальное значение задаётся справа от знака равенства. */ - int i,j,bit,byt,addr,sgn=0,punkt=0,aliq_len=0,full_len, isdot=0; - - /* Проверяет if(adr>1); последующий оператор выполняется только при истинном условии. */ - if(adr>1) // Лампочки - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Записывает Word значением dat; слово. */ - Word =dat; - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - - /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */ - else - - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Проверяет if(dat<0) sgn=1; последующий оператор выполняется только при истинном условии. */ - if(dat<0) sgn=1; - /* Записывает data значением labs(dat); данные. */ - data = labs(dat); - - /* Проверяет if(dot>=0 и dot<4) isdot = 1; последующий оператор выполняется только при истинном условии. */ - if(dot>=0 && dot<4) isdot = 1; - /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */ - else dot=0; - - /* Записывает aliq_part значением data; данные aliq_part. */ - aliq_part = data; - /* Цикл for(i=0;i0). */ - while(dat>0) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Делит dat значением 10; данные dat. */ - aliq_len++; dat/=10; - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - - /* Записывает dat значением data; данные dat. */ - dat = data; - - /* Записывает full_len значением aliq_len+sgn; данные full_len. */ - full_len = aliq_len+sgn; - /* Проверяет if(full_len==0) full_len=1; последующий оператор выполняется только при истинном условии. */ - if(full_len==0) full_len=1; - /* Увеличивает full_len значением dot; данные full_len. */ - full_len += dot; - - /* Цикл for(i=0; i<(full_len-4);i++); задаёт начальное значение, условие продолжения и шаг перебора. */ - for(i=0; i<(full_len-4);i++) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Начинает цикл с проверкой условия после тела: первый проход выполняется всегда. */ - dot--; dat/=10; - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - /* Проверяет if(dot<0) dot=0; последующий оператор выполняется только при истинном условии. */ - if(dot<0) dot=0; - /* Записывает punkt значением 1<0;i--); задаёт начальное значение, условие продолжения и шаг перебора. */ - for(i=3;i>0;i--) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Проверяет if((dg[i]==0) и (i!=dot)); последующий оператор выполняется только при истинном условии. */ - if((dg[i]==0)&&(i!=dot)) - /* Записывает dg[i] значением 0xF; данные dg. */ - dg[i]=0xF; // Это значит пусто - /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */ - else break; - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - - /* Проверяет if(sgn); последующий оператор выполняется только при истинном условии. */ - if(sgn) - /* Цикл for(i=1;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */ - for(i=1;i<4;i++) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Проверяет if( (dg[i]==0xF) или (i==3)); последующий оператор выполняется только при истинном условии. */ - if( (dg[i]==0xF)||(i==3)) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Записывает dg[i] значением 0xA; данные dg. */ - dg[i]=0xA; // Это значит минус - /* Прерывает ближайший цикл или ветвь switch и продолжает после него. */ - break; - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } } - - /* Цикл for(i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */ - for(i=0;i<4;i++) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Записывает dg[i] значением digits[dg[i]]; данные dg. */ - dg[i] = digits[dg[i]]; - /* Проверяет if((punkt>>i)&1) dg[i]+= 128; последующий оператор выполняется только при истинном условии. */ - if((punkt>>i)&1) dg[i]+= 128; - - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - - /* Записывает Word значением ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) |; слово. */ - Word = ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) | - /* Продолжает список аргументов, полей или выражение ((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000);; порядок элементов сохраняется. */ - ((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000); - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - - /* Записывает addr значением readr[adr]; данные addr. */ - addr = readr[adr]; - - /* Цикл for (i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */ - for (i=0;i<4;i++) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Проверяет if(addr>0x10) break; последующий оператор выполняется только при истинном условии. */ - if(addr>0x10) break; - - /* Цикл for (j=0;j<8;j++); задаёт начальное значение, условие продолжения и шаг перебора. */ - for (j=0;j<8;j++) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Записывает bit значением Word & 1; Word >>= 1; представление регистра отдельными битовыми полями. */ - bit = Word & 1; Word >>= 1; - /* Вызывает SENDBIT с аргументами (bit) в текущей последовательности операций. */ - SENDBIT(bit); - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - - /* Записывает byt значением addr; данные byt. */ - byt = addr; - /* Цикл for (j=0;j<6;j++); задаёт начальное значение, условие продолжения и шаг перебора. */ - for (j=0;j<6;j++) - /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ - { - /* Записывает bit значением byt & 1; byt >>= 1; представление регистра отдельными битовыми полями. */ - bit = byt & 1; byt >>= 1; - /* Вызывает SENDBIT с аргументами (bit) в текущей последовательности операций. */ - SENDBIT(bit); - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } - /* Изменяет счётчик в выражении addr++; на один для следующего шага. */ - addr++; - - /* Вызывает RESET с аргументами () в текущей последовательности операций. */ - RESET(); - /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ - } -/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ -} diff --git a/Bin/IndicatorTimingCompare/README.txt b/Bin/IndicatorTimingCompare/README.txt deleted file mode 100644 index a735ffc..0000000 --- a/Bin/IndicatorTimingCompare/README.txt +++ /dev/null @@ -1,37 +0,0 @@ -Бальзам-167: два проверочных варианта задержки индикации -Дата сборки: 12.10.2026. - -A_delay_before_clock_fall -BIN: UKSSTMS320F28335_A_delay_before_clock_fall_fa20ed0+.bin -Дополнительная задержка стоит ПЕРЕД спадом CLOCK. -Последовательность: DSP28x_usDelay(POWS0+1); DCLK(0); DOUT(0). -Назначение: продлить высокий уровень CLOCK при действительном DATA. -Размер: 32246 байт. Запас до области параметров AT25256B: 262 байта. -SHA-256: C28337E35996AED330E22BC014EF9D15D06C9A1F5CFCCCE27EAD75FB1AC565F9 - -B_delay_after_clock_fall -BIN: UKSSTMS320F28335_B_delay_after_clock_fall_fa20ed0+.bin -Дополнительная задержка стоит ПОСЛЕ спада CLOCK, МЕЖДУ DCLK(0) и DOUT(0). -Последовательность: DCLK(0); DSP28x_usDelay(POWS0+1); DOUT(0). -Назначение: удержать DATA после спада CLOCK перед сбросом линии данных. -Размер: 32248 байт. Запас до области параметров AT25256B: 260 байт. -SHA-256: 1ABA3835FFA39649E9922E107B6DBAAA2605F7C4ED80631D583973EFC2DEC215 - -В каждом варианте только одна дополнительная задержка POWS0+1. -В обоих вариантах DATA сохраняется до спада CLOCK и сбрасывается после него. -Общие условные задержки POWS0 и POWS1 и разделитель RESET сохранены. -При CLKMULT=2 значения POWS0+1=1 и POWS1=30 являются аргументами -цикловой функции TI DSP28x_usDelay, а не длительностями в микросекундах. - -Оба варианта полностью собраны TI C2000 22.6.0.LTS из текущего проекта. -Базовый коммит: fa20ed085bdca15fec47c79b72f50525653e103d; сборки помечены dirty. -Для каждого варианта при компиляции подставлен отдельный kanal.c, -сохранённый рядом с его BIN. Основной Source/Internal/kanal.c при подготовке -этой пары не изменялся. Общие параметры компиляции и прочие модули одинаковы; -паспорта также содержат собственное время сборки каждого варианта. - -Проверено: полный цикл компиляции и линковки, структура SCI8 и предел EEPROM, -соответствие итогового BIN кандидату hex2000, расположение задержек в машинном -коде SENDBIT, передача 0 и 1 на обоих фронтах в модели логических уровней, -одинаковый код DCLK/DOUT между вариантами и прежний код разделителя RESET. -Физические длительности сигналов и отсутствие строба требуют проверки на плате. diff --git a/Bin/StartupWait3s/rebuild.py b/Bin/StartupWait3s/rebuild.py deleted file mode 100644 index f356e7a..0000000 --- a/Bin/StartupWait3s/rebuild.py +++ /dev/null @@ -1,41 +0,0 @@ -from pathlib import Path # Формирует абсолютные пути сборки и установленных инструментов TI. -import subprocess # Выполняет компиляцию и проверку без shell-подстановок. -import json # Читает фактический идентификатор текущей сборки из её паспорта. -import sys # Использует текущий Python для подготовки паспорта и образа. -root = Path.cwd().resolve() # Фиксирует разрешённый корень проекта. -out = root / 'Bin/StartupWait3s' # Изолирует результаты исправленного пуска от прежних прошивок. -obj = out / 'obj' # Хранит объекты полной текущей пересборки. -gen = out / 'generated' # Хранит паспорт текущих исходников. -for directory in (out, obj, gen): # Создаёт только подкаталоги этой сборки. - directory.mkdir(parents=True, exist_ok=True) # Не удаляет старые файлы проекта. -ti = Path('C:/ti/ccs1230/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS') # Повторяет установленный компилятор CCS. -templates = root.parent / 'newProject/templates' # Использует штатную общую библиотеку проекта. -protocol = templates / 'c/set-protocol' # Задаёт интерфейсы и карту памяти УМП. -name = 'UKSSTMS320F28335_startup_3s' # Различает новую прошивку по смыслу исправления. -log = (out / 'build.log').open('w', encoding='utf-8') # Записывает диагностику в UTF-8. -def run(args): # Останавливает сборку при ошибке любого шага. - result = subprocess.run([str(arg) for arg in args], cwd=root, capture_output=True) # Передаёт параметры инструменту напрямую. - output = (result.stdout + result.stderr).decode('utf-8', errors='replace') # Декодирует диагностический вывод. - log.write(output); log.flush() # Сохраняет текущий результат до следующего шага. - if result.returncode: # Запрещает формирование готового BIN после ошибки. - print(output); raise SystemExit(result.returncode) # Показывает причину незавершённой сборки. - return output # Возвращает отчёт успешно выполненного шага. -run([sys.executable, root / 'UKSSTMS320F28335/prepare_identity.py', '--project', root / 'UKSSTMS320F28335', '--templates', templates, '--output', gen]) # Обновляет паспорт перед полной компиляцией. -includes = [root / 'UKSSTMS320F28335', root / 'Source/Internal/Include', root / 'Source/External/v120/DSP2833x_headers/include', root / 'Source/External/v120/DSP2833x_common/include', protocol, protocol / 'ports/tms320f28335', templates / 'c/firmware-info/include', gen, ti / 'include'] # Повторяет каталоги CCS с локальным паспортом сборки. -flags = ['-v28', '-ml', '-mt', '--float_support=fpu32', '-O2', '--opt_for_speed=0', '--define=_DEBUG', '--define=LARGE_MODEL', '-g', '--diag_warning=225', '--display_error_number', '--gen_func_subsections=on', '--abi=coffabi'] # Сохраняет ABI, FPU и существующую оптимизацию размера проекта. -flags += ['--include_path=' + str(path) for path in includes] # Передаёт каждый каталог отдельным аргументом. -common = root / 'Source/External/v120/DSP2833x_common/source' # Задаёт уже используемый комплект TI. -external = ['DSP2833x_ADC_cal.asm', 'DSP2833x_Adc.c', 'DSP2833x_CpuTimers.c', 'DSP2833x_PieCtrl.c', 'DSP2833x_SWPrioritizedDefaultIsr.c', 'DSP2833x_SWPrioritizedPieVect.c', 'DSP2833x_SysCtrl.c', 'DSP2833x_Xintf.c', 'DSP2833x_usDelay.asm'] # Повторяет штатный список внешних исходников. -sources = [common / item for item in external] + [root / 'Source/External/v120/DSP2833x_headers/source/DSP2833x_GlobalVariableDefs.c'] + sorted((root / 'Source/Internal').glob('*.c')) # Пересобирает все модули после окончательной правки. -for source in sources: # Последовательно компилирует каждый модуль. - run([ti / 'bin/cl2000.exe', *flags, '--obj_directory=' + str(obj), source]) # Проверяет настоящий C28x-код и создаёт новый объект. -objects = [obj / (source.stem + '.obj') for source in sources] # Использует только объекты завершённой текущей компиляции. -run([ti / 'bin/cl2000.exe', '-v28', '-ml', '-mt', '--float_support=fpu32', '--abi=coffabi', '-z', '--map_file=' + str(out / (name + '.map')), '--stack_size=0x3f0', '--warn_sections', '-i' + str(ti / 'lib'), '-i' + str(root), '-i' + str(protocol), '-i' + str(ti / 'include'), '--reread_libs', '--display_error_number', '--entry_point=_c_int00', '--rom_model', '--output_file=' + str(out / (name + '.out')), root / 'F28335.cmd', root / 'Source/External/v120/DSP2833x_headers/cmd/DSP2833x_Headers_nonBIOS.cmd', *objects, root / 'Libraries/rts2800_fpu32.lib', '-lrts2800_fpu32.lib', '-llibc.a']) # Линкует со штатной картой памяти и библиотеками времени выполнения. -run([ti / 'bin/hex2000.exe', '--diag_wrap=off', '--boot', '--sci8', '--binary', '-o', out / (name + '.candidate'), out / (name + '.out')]) # Создаёт кандидат загрузочного образа для обязательной проверки размера. -print(run([sys.executable, root / 'tests/gas167/check_image.py', out / (name + '.candidate'), '--eeprom', 'AT25256B']).strip()) # Проверяет EEPROM, RAM-блоки и точку входа до выдачи прошивки. -print(run([sys.executable, templates / 'c/firmware-info/tools/c2000_postbuild.py', '--compiler', ti, '--build-dir', out, '--artifact', name, '--metadata', gen / 'firmware_identity.json', '--output', out]).strip()) # Создаёт штатный BIN, манифест и SHA-256 без экспорта в другие проекты. -bin_path = out / (name + '_' + json.loads((gen / 'firmware_identity.json').read_text(encoding='utf-8'))['build_id'] + '.bin') # Выбирает именно текущую сборку, даже если в каталоге остаются прежние BIN. -print(run([sys.executable, root / 'tests/gas167/check_image.py', bin_path, '--eeprom', 'AT25256B']).strip()) # Повторяет проверку на самом выдаваемом BIN после штатной упаковки. -assert bin_path.read_bytes() == (out / (name + '.candidate')).read_bytes() # Подтверждает совпадение проверенного кандидата и итоговой прошивки. -log.close() # Завершает полный лог успешно проверенной сборки. -print('READY:', bin_path) # Указывает пользователю точный готовый результат. diff --git a/Bin/TestLampFix/README.txt b/Bin/TestLampFix/README.txt deleted file mode 100644 index 5878697..0000000 --- a/Bin/TestLampFix/README.txt +++ /dev/null @@ -1,48 +0,0 @@ -Бальзам-167: проверочная прошивка с исправлением TESTLAMP -Сборка: 13.10.2026, 11:00:35 (Москва, UTC+3). - -Готовый образ: -UKSSTMS320F28335_testlamp_fix_fa20ed0+.bin -Размер: 32272 байта. Запас до параметров AT25256B: 236 байт. -SHA-256: bfe4c3c9b55bb5022f38f254929f893e5eaab57ef3d3fa31771a6b6f97f877a4 -Паспорт: UKSSTMS320F28335_testlamp_fix_fa20ed0+.bin.manifest.json -Архив этой сборки: fa20ed08+_2026-10-13_11-00-35_UTC+3. - -Исправления: -1. В get_Buttons для dsk_EPLT накопительный фильтр получает предыдущее - значение bTestLamp вместо постоянного нуля. Раньше даже один низкий - отсчёт GPIO26 при удержании кнопки сразу отключал тест, а следующий - высокий отсчёт мог снова его включить. Это переключало пакеты ламп - и семисегментных индикаторов между рабочим и тестовым режимами. - Порог 1000 по-прежнему измеряется опросами главного цикла. -2. cpu_timer1_isr_PULT ограничивает IER маской MINT13 и исключает собственный - Timer1 (INT13). Прежнее IER |= MINT13 включало дополнительные источники - вместо ограничения приоритетов и могло разрешить повторный вход Timer1. - Вложенная передача больше не может перемешать DATA/CLK, счётчик каналов - и фазу яркости. В машинном коде перед EINT проверено AND IER, #0x0139. - -Штатная тестовая последовательность what_is сохранена: цифры меняются -и тестовая маска ламп переключается каждые 500 тактов Timer1 (0,5 секунды). -Это исправление относится к частому нерегулярному мерцанию поверх теста. -Порядок уровней и задержек SENDBIT/RESET взят из текущего kanal.c проекта; -для этой сборки он не изменялся. В образ вошли уже имевшиеся правки -ecan.c, measure.c и kanal.c. - -Проверено: -- настоящие get_Buttons, er_anal, what_is и обработчик пульта в хостовой - модели при O3; короткие провалы входа при удержании TESTLAMP; -- тестовые пакеты ламп и цифр при уже включённой рабочей лампе; -- отсутствие повторного входа ISR, отпускание и удалённая команда теста; -- сохранение обычного PWM: шесть включённых тактов из десяти; -- возвращение каждой старой ошибки отдельно вызывает провал теста; -- полная компиляция и линковка TI C2000 22.6.0.LTS, O3, COFF, FPU32; -- SCI8, четыре RAM-блока, границы AT25256B и совпадение BIN с кандидатом; -- UTF-8 и русские пояснения к изменённому и добавленному коду. - -Повторная проверка: python tests/testlamp/run_test.py -Повторная сборка: python Bin/TestLampFix/rebuild.py - -На физической плате эта прошивка пока не проверена. Для проверки повторить -сценарий пользователя: включённые рабочие лампы, нажатие и удержание TESTLAMP, -затем отпускание. Штатные изменения теста раз в 0,5 секунды сохраняются; -быстрых переключений между тестовыми и рабочими показаниями быть не должно. diff --git a/Bin/TestLampFix/rebuild.py b/Bin/TestLampFix/rebuild.py deleted file mode 100644 index fc919eb..0000000 --- a/Bin/TestLampFix/rebuild.py +++ /dev/null @@ -1,54 +0,0 @@ -"""Полностью собирает прошивку с исправлением TESTLAMP и проверяет загрузочный BIN.""" -from pathlib import Path # Разрешает исходники, общие библиотеки и выходные файлы относительно проекта. -import json # Читает идентификатор фактически подготовленной сборки из её паспорта. -import os # Передаёт Git локальное исключение владельца репозитория без изменения глобальных настроек. -import subprocess # Запускает инструменты TI и проверку образа напрямую, без shell-подстановок. -import sys # Использует тот же Python для подготовки паспорта и штатной упаковки прошивки. - -root = Path(__file__).resolve().parents[2] # Получает корень независимо от каталога запуска скрипта. -out = root / "Bin/TestLampFix" # Изолирует новые результаты от ранее собранных и проверяемых образов. -obj, gen = out / "obj", out / "generated" # Разделяет объекты полной сборки и генерируемый паспорт. -for directory in (out, obj, gen): # Создаёт только каталоги этой сборки, сохраняя остальные артефакты. - directory.mkdir(parents=True, exist_ok=True) # Поддерживает повторную сборку без удаления файлов проекта. -ti = Path("C:/ti/ccs1230/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS") # Повторяет установленную версию компилятора из настроек CCS. -templates = root.parent / "newProject/templates" # Использует общие библиотеки и инструменты штатного проекта. -protocol = templates / "c/set-protocol" # Задаёт общую реализацию протокола УМП и порт C28x. -name = "UKSSTMS320F28335_testlamp_fix" # Отличает образ с исправлением TESTLAMP от других вариантов прошивки. -environment = dict(os.environ) # Сохраняет все существующие настройки дочерних инструментов. -git_option = int(environment.get("GIT_CONFIG_COUNT", "0")) # Добавляет локальное исключение после уже переданных параметров Git. -environment["GIT_CONFIG_COUNT"] = str(git_option + 2) # Добавляет два временных исключения владельца только для дочерних процессов сборки. -for index, repository in enumerate((root, templates), start=git_option): # Ограничивает исключения исходным проектом и его штатным репозиторием общих библиотек. - environment["GIT_CONFIG_KEY_" + str(index)] = "safe.directory" # Разрешает генератору паспорта чтение одного известного пользовательского репозитория. - environment["GIT_CONFIG_VALUE_" + str(index)] = repository.as_posix() # Использует прямые слеши, необходимые Git для сравнения safe.directory на Windows. - -def run(args): # Останавливает сборку при сбое компиляции, линковки или проверки образа. - result = subprocess.run([str(arg) for arg in args], cwd=root, env=environment, capture_output=True) # Передаёт каждый параметр отдельно и собирает диагностику инструмента. - output = (result.stdout + result.stderr).decode("utf-8", errors="replace") # Сохраняет вывод в UTF-8 даже при другой кодировке установленного инструмента. - log.write(output) # Добавляет диагностику текущего шага в общий журнал сборки. - log.flush() # Делает промежуточные результаты доступными до завершения всей сборки. - if result.returncode: # Запрещает продолжать упаковку после неуспешного шага. - raise RuntimeError(output) # Возвращает причину сбоя вместе с диагностикой инструмента. - return output # Позволяет вывести итог успешно пройденной проверки образа. - -with (out / "build.log").open("w", encoding="utf-8") as log: # Создаёт журнал только этой сборки и закрывает его при любом результате. - run([sys.executable, root / "UKSSTMS320F28335/prepare_identity.py", "--project", root / "UKSSTMS320F28335", "--templates", templates, "--output", gen]) # Формирует паспорт текущего коммита, правок и времени до компиляции. - metadata = json.loads((gen / "firmware_identity.json").read_text(encoding="utf-8")) # Читает фактический результат получения состояния обоих репозиториев. - assert metadata["source"]["commit"] and metadata["templates"]["commit"], "Не удалось получить коммиты для паспорта прошивки" # Не выдаёт проверочный образ с неизвестным происхождением исходников. - includes = [root / "UKSSTMS320F28335", root / "Source/Internal/Include", root / "Source/External/v120/DSP2833x_headers/include", root / "Source/External/v120/DSP2833x_common/include", protocol, protocol / "ports/tms320f28335", templates / "c/firmware-info/include", gen, ti / "include"] # Повторяет каталоги штатной сборки, подставляя собственный паспорт. - flags = ["-v28", "-ml", "-mt", "--float_support=fpu32", "-O3", "--opt_for_speed=0", "--define=_DEBUG", "--define=LARGE_MODEL", "-g", "--diag_warning=225", "--display_error_number", "--gen_func_subsections=on", "--abi=coffabi"] # Сохраняет C28x, модель large, FPU32, COFF и оптимизацию размера O3 из текущей конфигурации CCS. - flags += ["--include_path=" + str(path) for path in includes] # Передаёт пути компилятору отдельными аргументами без shell-экранирования. - common = root / "Source/External/v120/DSP2833x_common/source" # Выбирает используемый проектом комплект TI v120. - external = ["DSP2833x_ADC_cal.asm", "DSP2833x_Adc.c", "DSP2833x_CpuTimers.c", "DSP2833x_PieCtrl.c", "DSP2833x_SWPrioritizedDefaultIsr.c", "DSP2833x_SWPrioritizedPieVect.c", "DSP2833x_SysCtrl.c", "DSP2833x_Xintf.c", "DSP2833x_usDelay.asm"] # Повторяет штатный набор внешних модулей и цикловую задержку TI. - sources = [common / item for item in external] + [root / "Source/External/v120/DSP2833x_headers/source/DSP2833x_GlobalVariableDefs.c"] + sorted((root / "Source/Internal").glob("*.c")) # Включает все текущие исходники, в том числе имеющиеся пользовательские изменения. - for source in sources: # Полностью компилирует проект, исключая использование старых объектов CCS. - run([ti / "bin/cl2000.exe", *flags, "--obj_directory=" + str(obj), source]) # Проверяет production-код настоящим компилятором C28x. - objects = [obj / (source.stem + ".obj") for source in sources] # Передаёт линкеру только объекты завершённой текущей компиляции. - run([ti / "bin/cl2000.exe", "-v28", "-ml", "-mt", "--float_support=fpu32", "--abi=coffabi", "-z", "--map_file=" + str(out / (name + ".map")), "--stack_size=0x3f0", "--warn_sections", "-i" + str(ti / "lib"), "-i" + str(root), "-i" + str(protocol), "-i" + str(ti / "include"), "--reread_libs", "--display_error_number", "--entry_point=_c_int00", "--rom_model", "--output_file=" + str(out / (name + ".out")), root / "F28335.cmd", root / "Source/External/v120/DSP2833x_headers/cmd/DSP2833x_Headers_nonBIOS.cmd", *objects, root / "Libraries/rts2800_fpu32.lib", "-lrts2800_fpu32.lib", "-llibc.a"]) # Линкует со штатной картой памяти; 0x3f0 слов стека повторяет существующие проверочные сборки. - run([ti / "bin/hex2000.exe", "--diag_wrap=off", "--boot", "--sci8", "--binary", "-o", out / (name + ".candidate"), out / (name + ".out")]) # Формирует кандидат загрузочного образа SCI8 перед проверкой границ EEPROM. - print(run([sys.executable, root / "tests/gas167/check_image.py", out / (name + ".candidate"), "--eeprom", "AT25256B"]).strip()) # Проверяет точку входа, RAM-блоки и отсутствие пересечения с параметрами AT25256B. - print(run([sys.executable, templates / "c/firmware-info/tools/c2000_postbuild.py", "--compiler", ti, "--build-dir", out, "--artifact", name, "--metadata", gen / "firmware_identity.json", "--output", out]).strip()) # Создаёт стандартный BIN, манифест и контрольную сумму без публикации в соседний проект. - build_id = json.loads((gen / "firmware_identity.json").read_text(encoding="utf-8"))["build_id"] # Получает идентификатор именно этой полной сборки. - bin_path = out / (name + "_" + build_id + ".bin") # Выбирает готовый образ по его фактическому паспорту. - print(run([sys.executable, root / "tests/gas167/check_image.py", bin_path, "--eeprom", "AT25256B"]).strip()) # Повторяет проверку загрузочной структуры на выдаваемом BIN. - assert bin_path.read_bytes() == (out / (name + ".candidate")).read_bytes(), "Итоговый BIN отличается от проверенного кандидата" # Исключает выдачу другого образа после штатной упаковки. -print("READY:", bin_path) # Указывает точный файл прошивки, успешно прошедший все этапы. diff --git a/Bin/UartBaudFix/rebuild.py b/Bin/UartBaudFix/rebuild.py deleted file mode 100644 index 62ceca0..0000000 --- a/Bin/UartBaudFix/rebuild.py +++ /dev/null @@ -1,41 +0,0 @@ -from pathlib import Path # Формирует абсолютные пути сборки и установленных инструментов TI. -import subprocess # Выполняет компиляцию и проверку без shell-подстановок. -import json # Читает фактический идентификатор текущей сборки из её паспорта. -import sys # Использует текущий Python для подготовки паспорта и образа. -root = Path.cwd().resolve() # Фиксирует разрешённый корень проекта. -out = root / 'Bin/UartBaudFix' # Изолирует образ с исправленным делителем SCI и диагностикой ошибок приёмника. -obj = out / 'obj' # Хранит объекты полной текущей пересборки. -gen = out / 'generated' # Хранит паспорт текущих исходников. -for directory in (out, obj, gen): # Создаёт только подкаталоги этой сборки. - directory.mkdir(parents=True, exist_ok=True) # Не удаляет старые файлы проекта. -ti = Path('C:/ti/ccs1230/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS') # Повторяет установленный компилятор CCS. -templates = root.parent / 'newProject/templates' # Использует штатную общую библиотеку проекта. -protocol = templates / 'c/set-protocol' # Задаёт интерфейсы и карту памяти УМП. -name = 'UKSSTMS320F28335_uart_rx_fix' # Различает прошивку с исправленной скоростью и сохранением ошибок SCI-A. -log = (out / 'build.log').open('w', encoding='utf-8') # Записывает диагностику в UTF-8. -def run(args): # Останавливает сборку при ошибке любого шага. - result = subprocess.run([str(arg) for arg in args], cwd=root, capture_output=True) # Передаёт параметры инструменту напрямую. - output = (result.stdout + result.stderr).decode('utf-8', errors='replace') # Декодирует диагностический вывод. - log.write(output); log.flush() # Сохраняет текущий результат до следующего шага. - if result.returncode: # Запрещает формирование готового BIN после ошибки. - print(output); raise SystemExit(result.returncode) # Показывает причину незавершённой сборки. - return output # Возвращает отчёт успешно выполненного шага. -run([sys.executable, root / 'UKSSTMS320F28335/prepare_identity.py', '--project', root / 'UKSSTMS320F28335', '--templates', templates, '--output', gen]) # Обновляет паспорт перед полной компиляцией. -includes = [root / 'UKSSTMS320F28335', root / 'Source/Internal/Include', root / 'Source/External/v120/DSP2833x_headers/include', root / 'Source/External/v120/DSP2833x_common/include', protocol, protocol / 'ports/tms320f28335', templates / 'c/firmware-info/include', gen, ti / 'include'] # Повторяет каталоги CCS с локальным паспортом сборки. -flags = ['-v28', '-ml', '-mt', '--float_support=fpu32', '-O3', '--opt_for_speed=0', '--define=_DEBUG', '--define=LARGE_MODEL', '-g', '--diag_warning=225', '--display_error_number', '--gen_func_subsections=on', '--abi=coffabi'] # Сохраняет ABI, FPU и существующую оптимизацию размера проекта. -flags += ['--include_path=' + str(path) for path in includes] # Передаёт каждый каталог отдельным аргументом. -common = root / 'Source/External/v120/DSP2833x_common/source' # Задаёт уже используемый комплект TI. -external = ['DSP2833x_ADC_cal.asm', 'DSP2833x_Adc.c', 'DSP2833x_CpuTimers.c', 'DSP2833x_PieCtrl.c', 'DSP2833x_SWPrioritizedDefaultIsr.c', 'DSP2833x_SWPrioritizedPieVect.c', 'DSP2833x_SysCtrl.c', 'DSP2833x_Xintf.c', 'DSP2833x_usDelay.asm'] # Повторяет штатный список внешних исходников. -sources = [common / item for item in external] + [root / 'Source/External/v120/DSP2833x_headers/source/DSP2833x_GlobalVariableDefs.c'] + sorted((root / 'Source/Internal').glob('*.c')) # Пересобирает все модули после окончательной правки. -for source in sources: # Последовательно компилирует каждый модуль. - run([ti / 'bin/cl2000.exe', *flags, '--obj_directory=' + str(obj), source]) # Проверяет настоящий C28x-код и создаёт новый объект. -objects = [obj / (source.stem + '.obj') for source in sources] # Использует только объекты завершённой текущей компиляции. -run([ti / 'bin/cl2000.exe', '-v28', '-ml', '-mt', '--float_support=fpu32', '--abi=coffabi', '-z', '--map_file=' + str(out / (name + '.map')), '--stack_size=0x3f0', '--warn_sections', '-i' + str(ti / 'lib'), '-i' + str(root), '-i' + str(protocol), '-i' + str(ti / 'include'), '--reread_libs', '--display_error_number', '--entry_point=_c_int00', '--rom_model', '--output_file=' + str(out / (name + '.out')), root / 'F28335.cmd', root / 'Source/External/v120/DSP2833x_headers/cmd/DSP2833x_Headers_nonBIOS.cmd', *objects, root / 'Libraries/rts2800_fpu32.lib', '-lrts2800_fpu32.lib', '-llibc.a']) # Линкует со штатной картой памяти и библиотеками времени выполнения. -run([ti / 'bin/hex2000.exe', '--diag_wrap=off', '--boot', '--sci8', '--binary', '-o', out / (name + '.candidate'), out / (name + '.out')]) # Создаёт кандидат загрузочного образа для обязательной проверки размера. -print(run([sys.executable, root / 'tests/gas167/check_image.py', out / (name + '.candidate'), '--eeprom', 'AT25256B']).strip()) # Проверяет EEPROM, RAM-блоки и точку входа до выдачи прошивки. -print(run([sys.executable, templates / 'c/firmware-info/tools/c2000_postbuild.py', '--compiler', ti, '--build-dir', out, '--artifact', name, '--metadata', gen / 'firmware_identity.json', '--output', out]).strip()) # Создаёт штатный BIN, манифест и SHA-256 без экспорта в другие проекты. -bin_path = out / (name + '_' + json.loads((gen / 'firmware_identity.json').read_text(encoding='utf-8'))['build_id'] + '.bin') # Выбирает именно текущую сборку, даже если в каталоге остаются прежние BIN. -print(run([sys.executable, root / 'tests/gas167/check_image.py', bin_path, '--eeprom', 'AT25256B']).strip()) # Повторяет проверку на самом выдаваемом BIN после штатной упаковки. -assert bin_path.read_bytes() == (out / (name + '.candidate')).read_bytes() # Подтверждает совпадение проверенного кандидата и итоговой прошивки. -log.close() # Завершает полный лог успешно проверенной сборки. -print('READY:', bin_path) # Указывает пользователю точный готовый результат. diff --git a/Bin/UartColdStart/rebuild.py b/Bin/UartColdStart/rebuild.py deleted file mode 100644 index 7398f9c..0000000 --- a/Bin/UartColdStart/rebuild.py +++ /dev/null @@ -1,41 +0,0 @@ -from pathlib import Path # Формирует абсолютные пути сборки и установленных инструментов TI. -import subprocess # Выполняет компиляцию и проверку без shell-подстановок. -import json # Читает фактический идентификатор текущей сборки из её паспорта. -import sys # Использует текущий Python для подготовки паспорта и образа. -root = Path.cwd().resolve() # Фиксирует разрешённый корень проекта. -out = root / 'Bin/UartColdStart' # Изолирует результаты исправления холодного запуска UART от прежней прошивки. -obj = out / 'obj' # Хранит объекты полной текущей пересборки. -gen = out / 'generated' # Хранит паспорт текущих исходников. -for directory in (out, obj, gen): # Создаёт только подкаталоги этой сборки. - directory.mkdir(parents=True, exist_ok=True) # Не удаляет старые файлы проекта. -ti = Path('C:/ti/ccs1230/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS') # Повторяет установленный компилятор CCS. -templates = root.parent / 'newProject/templates' # Использует штатную общую библиотеку проекта. -protocol = templates / 'c/set-protocol' # Задаёт интерфейсы и карту памяти УМП. -name = 'UKSSTMS320F28335_uart_init' # Различает прошивку с явной инициализацией UART при холодном запуске. -log = (out / 'build.log').open('w', encoding='utf-8') # Записывает диагностику в UTF-8. -def run(args): # Останавливает сборку при ошибке любого шага. - result = subprocess.run([str(arg) for arg in args], cwd=root, capture_output=True) # Передаёт параметры инструменту напрямую. - output = (result.stdout + result.stderr).decode('utf-8', errors='replace') # Декодирует диагностический вывод. - log.write(output); log.flush() # Сохраняет текущий результат до следующего шага. - if result.returncode: # Запрещает формирование готового BIN после ошибки. - print(output); raise SystemExit(result.returncode) # Показывает причину незавершённой сборки. - return output # Возвращает отчёт успешно выполненного шага. -run([sys.executable, root / 'UKSSTMS320F28335/prepare_identity.py', '--project', root / 'UKSSTMS320F28335', '--templates', templates, '--output', gen]) # Обновляет паспорт перед полной компиляцией. -includes = [root / 'UKSSTMS320F28335', root / 'Source/Internal/Include', root / 'Source/External/v120/DSP2833x_headers/include', root / 'Source/External/v120/DSP2833x_common/include', protocol, protocol / 'ports/tms320f28335', templates / 'c/firmware-info/include', gen, ti / 'include'] # Повторяет каталоги CCS с локальным паспортом сборки. -flags = ['-v28', '-ml', '-mt', '--float_support=fpu32', '-O2', '--opt_for_speed=0', '--define=_DEBUG', '--define=LARGE_MODEL', '-g', '--diag_warning=225', '--display_error_number', '--gen_func_subsections=on', '--abi=coffabi'] # Сохраняет ABI, FPU и существующую оптимизацию размера проекта. -flags += ['--include_path=' + str(path) for path in includes] # Передаёт каждый каталог отдельным аргументом. -common = root / 'Source/External/v120/DSP2833x_common/source' # Задаёт уже используемый комплект TI. -external = ['DSP2833x_ADC_cal.asm', 'DSP2833x_Adc.c', 'DSP2833x_CpuTimers.c', 'DSP2833x_PieCtrl.c', 'DSP2833x_SWPrioritizedDefaultIsr.c', 'DSP2833x_SWPrioritizedPieVect.c', 'DSP2833x_SysCtrl.c', 'DSP2833x_Xintf.c', 'DSP2833x_usDelay.asm'] # Повторяет штатный список внешних исходников. -sources = [common / item for item in external] + [root / 'Source/External/v120/DSP2833x_headers/source/DSP2833x_GlobalVariableDefs.c'] + sorted((root / 'Source/Internal').glob('*.c')) # Пересобирает все модули после окончательной правки. -for source in sources: # Последовательно компилирует каждый модуль. - run([ti / 'bin/cl2000.exe', *flags, '--obj_directory=' + str(obj), source]) # Проверяет настоящий C28x-код и создаёт новый объект. -objects = [obj / (source.stem + '.obj') for source in sources] # Использует только объекты завершённой текущей компиляции. -run([ti / 'bin/cl2000.exe', '-v28', '-ml', '-mt', '--float_support=fpu32', '--abi=coffabi', '-z', '--map_file=' + str(out / (name + '.map')), '--stack_size=0x3f0', '--warn_sections', '-i' + str(ti / 'lib'), '-i' + str(root), '-i' + str(protocol), '-i' + str(ti / 'include'), '--reread_libs', '--display_error_number', '--entry_point=_c_int00', '--rom_model', '--output_file=' + str(out / (name + '.out')), root / 'F28335.cmd', root / 'Source/External/v120/DSP2833x_headers/cmd/DSP2833x_Headers_nonBIOS.cmd', *objects, root / 'Libraries/rts2800_fpu32.lib', '-lrts2800_fpu32.lib', '-llibc.a']) # Линкует со штатной картой памяти и библиотеками времени выполнения. -run([ti / 'bin/hex2000.exe', '--diag_wrap=off', '--boot', '--sci8', '--binary', '-o', out / (name + '.candidate'), out / (name + '.out')]) # Создаёт кандидат загрузочного образа для обязательной проверки размера. -print(run([sys.executable, root / 'tests/gas167/check_image.py', out / (name + '.candidate'), '--eeprom', 'AT25256B']).strip()) # Проверяет EEPROM, RAM-блоки и точку входа до выдачи прошивки. -print(run([sys.executable, templates / 'c/firmware-info/tools/c2000_postbuild.py', '--compiler', ti, '--build-dir', out, '--artifact', name, '--metadata', gen / 'firmware_identity.json', '--output', out]).strip()) # Создаёт штатный BIN, манифест и SHA-256 без экспорта в другие проекты. -bin_path = out / (name + '_' + json.loads((gen / 'firmware_identity.json').read_text(encoding='utf-8'))['build_id'] + '.bin') # Выбирает именно текущую сборку, даже если в каталоге остаются прежние BIN. -print(run([sys.executable, root / 'tests/gas167/check_image.py', bin_path, '--eeprom', 'AT25256B']).strip()) # Повторяет проверку на самом выдаваемом BIN после штатной упаковки. -assert bin_path.read_bytes() == (out / (name + '.candidate')).read_bytes() # Подтверждает совпадение проверенного кандидата и итоговой прошивки. -log.close() # Завершает полный лог успешно проверенной сборки. -print('READY:', bin_path) # Указывает пользователю точный готовый результат.