From 6bdc7a278b6e30a7f29d00140ff46c5b8b878870 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 13 Oct 2026 17:22:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82=D1=8C=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=80=D1=8B=D0=B5=20=D1=8D=D0=BA=D1=81=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B8=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Убрать сохранённые проверки EEPROM, UART, TESTLAMP, стартовой выдержки и таймингов индикации, а также прежний образ профиля M95M02 с сопроводительными файлами. --- Bin/EepromPublishFix/rebuild.py | 41 -- .../UKSSTMS320F28335_GAS_M95M02.bin | Bin 33174 -> 0 bytes ...STMS320F28335_GAS_M95M02.bin.manifest.json | 41 -- .../UKSSTMS320F28335_GAS_M95M02.bin.sha256 | 1 - Bin/GAS_M95M02/profile-comparison.json | 16 - .../A_delay_before_clock_fall/kanal.c | 358 ------------------ .../B_delay_after_clock_fall/kanal.c | 358 ------------------ Bin/IndicatorTimingCompare/README.txt | 37 -- Bin/StartupWait3s/rebuild.py | 41 -- Bin/TestLampFix/README.txt | 48 --- Bin/TestLampFix/rebuild.py | 54 --- Bin/UartBaudFix/rebuild.py | 41 -- Bin/UartColdStart/rebuild.py | 41 -- 13 files changed, 1077 deletions(-) delete mode 100644 Bin/EepromPublishFix/rebuild.py delete mode 100644 Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin delete mode 100644 Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin.manifest.json delete mode 100644 Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin.sha256 delete mode 100644 Bin/GAS_M95M02/profile-comparison.json delete mode 100644 Bin/IndicatorTimingCompare/A_delay_before_clock_fall/kanal.c delete mode 100644 Bin/IndicatorTimingCompare/B_delay_after_clock_fall/kanal.c delete mode 100644 Bin/IndicatorTimingCompare/README.txt delete mode 100644 Bin/StartupWait3s/rebuild.py delete mode 100644 Bin/TestLampFix/README.txt delete mode 100644 Bin/TestLampFix/rebuild.py delete mode 100644 Bin/UartBaudFix/rebuild.py delete mode 100644 Bin/UartColdStart/rebuild.py 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 b1299f69438446f383cab88513198264c16a2292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33174 zcmeFadwf*Yxi`Mn-jkilB$=6n5JG?uF+yOtgqt8B?1X@LsnUT)L^x+gx%z`MYJJB` zEtwFZX(%Sy2}2uDbDf!;2?c3utA%6|615m~P^dQoDJt-uW2^O8?M2zY@3Z#|1nZ%m zzVGM!{`uweS+nlfy)Mu5eV(<_W@dl)w^9ABfWQdTBJWUSSEQ^<=KM%R^a+LC{Kbgm zODueeC3N+c^~fgP7fJD@79L}^uGh+5m95Oub+qgiIhp?^lH@ZNzRcf>Wch{{zRgB- zy<7HiT`zhw?=Jek9L# zUEv38T-W)sbMja=rt56kd-ApXcadv+xrGC~A>#763me(JUCm`p@;z)_SD-8?ujj3i zwZ1ilEo@U)d)YpDGv6Qa`2MZ%r@Sq4pYQ)E46}`0YFS9$z#i%PRoV0Mqx{#A@A)1p ze1UgFw)jd5JK6WU4woI0ALl=hJmmXdg}-1Acm1;LIoZn|>^fNXGx@vx*~kOF`wI`S zrCrr!HS)K4ZDg6xS*UP-q{Me;;coVwu3cqy@^Zd6vdXu*@G17MUC)#~E&mH!*;QY* zN4}f?ByyK;Md6QmMP!NZ=E5JcTf26YRm!)p+q<4DtCH{FJ0sun-B$P`R^0VO**19* z|3Ty?-{QjUd~2l0x3I9B6?T=C`D8hw$!9K4k(c=Md{5Gfq7k^TrLa&UT3OtGTzXbm zC8jZ+@Mja1`ESCT`i!(BBqWgk%fv4eTP>{?O%wVV%V3%&!e+2dF*_k^JMbSP;7H(M~G$>;5$DpuP$;?PoFj=P~;iG5fig{mYpB ztC;WWYTY*K4*Zm{(@!$?lS7Qv!Dt#ApcqZ#x_wcz>NaB+ zHTxx3`XyIJ%=HH?3$9yIg!yC`^DQ8=Dd{hB2OA30G|QU|f0~vYvr}Sr8f+Tz4A`7~ ztbP0zV+)wX?q+web!;>HK1*b!%)?~Lj=x7?G|e%m5Wx42HNSmakj#bs)xT(xvSZRjbxC8t>7AMyj$$S7V9(he({0j^&gC*n zBkx=?P^^e0Dj#yThw+j|CS0hQk$iyy6?FR!^bbEU%qy(fSE7+WE_nR_4l=N32dHZ zbKNHKxj#CW�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: выбранный блок включается в текущий вариант прошивки. */ -#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) # Указывает пользователю точный готовый результат.