Files
Andrey f17c124f0e docs: Согласуй документацию ProtoCAN и инструментов сборки
Обнови спецификацию GAS 0x3/0x4, реестр устройств и описание загрузочных сервисов одновременно в Markdown, HTML и XLSX.

Свяжи новые аппаратные порты, глобальное время и сборку C2000/ПЛИС с корневыми инструкциями, чтобы проекты подключались по одному актуальному контракту.
2026-10-23 14:16:22 +03:00

403 lines
33 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Подключение precompile и postcompile из templates
Для проектов ПЛИС используйте [шаблон Xilinx ISE, Vivado и Altera/Intel Quartus](fpga/README.md):
общий сохраняемый итератор, паспорт на Verilog/VHDL, полная сборка `.bit`/`.sof`,
manifest, SHA-256 и архив выпуска.
## Единая подготовка C2000 для 166/167 и Публикатора SETGUI
Общая точка входа — `c/firmware-info/tools/c2000_build.py` с командами
`prepare` и `build`. CCS и совместимые `ccs/precompile.bat --identity` /
`ccs/postcompile.bat --identity` вызывают один процесс подготовки.
`prepare` сохраняет JSON-счётчик старых проектов 166 либо читает ручную версию
из заголовка, заданного в `firmware_build_profile.json` проекта 167. Аппаратный
профиль содержит пути C-заголовков, имена макросов EEPROM и допустимые RAM-адреса
в 16-битных словах C28x. Ёмкость и размер SCI8 выражены в октетах.
`build` проверяет встроенный паспорт, границу EEPROM, MAP, SHA-256, полноту
SCI8, Flash LOAD/RUN и точное соответствие Flash OUT ↔ Flash RS BIN до сохранения
постоянного выпуска. Проектный `build_flash.py` остаётся аппаратным сборщиком;
общих проверок или сетевых операций в нём нет.
В текущей 167 каталог результата задан как `Debug/firmware/prepared` либо
`Release/firmware/prepared`; в остальных проектах он задаётся аргументом `--output`.
В этом каталоге создаётся папка
`HASH_дата_UTC+3` с RAM BIN, исходным RAM OUT, `*_flash.out` для JTAG,
`*_flash_rs.bin` для RS, картами, manifest и SHA-256. Flash-файлы создаются
только при наличии проектного `build_flash.py`. `latest_build.json` рядом
с папками указывает точную папку и основной manifest последнего успешного выпуска.
Дальнейшая публикация выполняется в SETGUI: **Сервис → Прошивка → Публикатор →
Из папки postbuild / manifest → Импорт папки postbuild**. Выбирайте папку одной
сборки, указанную в `latest_build.json`. Для Flash по RS выбирайте manifest
`*_flash_rs.bin.manifest.json`; для JTAG можно выбрать основной RAM BIN manifest,
поскольку полный комплект содержит подписанный Flash OUT. Публикатор выбирает
Flash OUT по `execution=FLASH` и `image_format=COFF`, сохраняя соседний RAM OUT.
Проверьте назначение загрузчика и предпросмотр, затем публикуйте через штатное
хранилище Публикатора. Команды подготовки сами не создают сетевой выпуск.
Ниже сохранены команды подключения старых проектов. Дополнительный аргумент
`export` остаётся совместимым локальным копированием; новые проекты могут
передавать готовый комплект прямо Публикатору без этого аргумента.
## Пути на этом компьютере
Самостоятельные постоянные CAN-загрузчики **F28335_CAN_AB** и **F2812_CAN_NOR**
имеют собственные prebuild/postbuild в Debug и Release. Они вызывают общий
`c/protocan-boot/projects/build.py`, проверяют Flash COFF через TI `ofd2000` и
автоматически копируют OUT/MAP, manifest, SHA-256 и метаданные в
`SETGUI/..periph_28335/firmware/periph28335/balzam167/canboot/28335/HASH_дата_UTC+3`
и `.../canboot/2812/HASH_дата_UTC+3` соответственно.
Команды, переопределение пути и структура результата описаны в
[инструкции CCS-проектов ProtoCAN Boot](../../c/protocan-boot/projects/README.md#prebuildpostbuild-и-копирование-в-setgui).
| Назначение | Полный путь |
|---|---|
| Корень общей библиотеки templates | `K:\git_project\newProject\templates` |
| Сценарии CCS | `K:\git_project\newProject\templates\tools\firmware-build\ccs` |
| Сценарии Keil | `K:\git_project\newProject\templates\tools\firmware-build\keil` |
| Проект Бальзам-166 / TMS320F28335 | `K:\git_project\28335_periph\UKSSTMS320F28335` |
| Каталог сборок Бальзам-166 в SETGUI | `K:\git_project\newProject\SETGUI\..periph_28335\firmware\periph28335\balzam166` |
Все команды ниже используют эту копию templates. При переносе библиотеки
замените её корень в командах и в include paths компилятора.
`${PROJECT_LOC}`, `${BuildDirectory}`, `${CG_TOOL_ROOT}` и
`${BuildArtifactFileBaseName}` раскрывает CCS; `$P` и `#H` раскрывает Keil.
Для ручного запуска замените макросы полными путями.
В пути SETGUI `..periph_28335` — существующее имя папки с двумя точками
в начале. Переход к родителю записывается отдельным компонентом `..\`.
## Текущий проект 28335_periph: вызов через firmware_build.bat
Для проекта `K:\git_project\28335_periph\UKSSTMS320F28335` используйте
локальную обвязку. Она вызывает общие BAT из templates; общий генератор
увеличивает версию в проектном JSON. Перед публикацией обвязка дополнительно
проверяет встроенный паспорт SCI8 и предел EEPROM.
В CCS → **Project Properties → Build → Steps** задайте для Debug и Release
следующие команды, каждую одной строкой.
**Pre-build:**
```bat
cmd /c call "${PROJECT_LOC}/firmware_build.bat" prepare --build-dir "${BuildDirectory}"
```
**Post-build:**
```bat
cmd /c call "${PROJECT_LOC}/firmware_build.bat" build --compiler "${CG_TOOL_ROOT}" --build-dir "${BuildDirectory}" --artifact "${BuildArtifactFileBaseName}"
```
Настройки находятся в
`K:\git_project\28335_periph\UKSSTMS320F28335\firmware_identity.json`:
| Поле | Рабочее значение и смысл |
|---|---|
| `templates` | `../../newProject/templates`; разрешается относительно папки JSON в `K:\git_project\newProject\templates`. Абсолютный эквивалент: `K:/git_project/newProject/templates`. |
| `copy_to` | `../Bin`; копирует проверенные BIN, manifest, SHA-256, HEX и карту в `K:\git_project\28335_periph\Bin`. |
| `increment_version` | `true`; каждый pre-build резервирует следующий номер в поле `version`. |
| `max_image_bytes` | `32508`; предельный размер SCI8 BIN в байтах для этой платы. |
В JSON используйте `/` либо удваивайте обратные слеши.
`copy_to` принимает также абсолютный путь, например
`K:/git_project/newProject/SETGUI/..periph_28335/firmware/periph28335/balzam166`.
Эта настройка копирует отдельные файлы комплекта. Архивные папки остаются
в `${BuildDirectory}/firmware`.
`firmware_build.bat build` принимает именованные параметры. Дописывание
каталога после `--artifact` вызывает `unrecognized arguments`; для этой
обвязки каталог копирования задаётся полем `copy_to`.
Include paths компилятора для текущего проекта:
| Запись в CCS | Реальный каталог для Debug |
|---|---|
| `${SRC_ROOT}/../newProject/templates/c/firmware-info/include` | `K:\git_project\newProject\templates\c\firmware-info\include` |
| `${SRC_ROOT}/../newProject/templates/c/set-protocol` | `K:\git_project\newProject\templates\c\set-protocol` |
| `${BuildDirectory}/generated` | `K:\git_project\28335_periph\UKSSTMS320F28335\Debug\generated` |
`${SRC_ROOT}` в этом проекте равен `K:\git_project\28335_periph`.
При переносе templates обновите и JSON, и include paths в CCS.
Подробная инструкция проекта:
[README Бальзам-166](../../../../28335_periph/UKSSTMS320F28335/README.md).
Готовый BIN ищите по строке `[firmware-build] Verified BIN: ...`.
Постоянный каталог Debug:
`K:\git_project\28335_periph\UKSSTMS320F28335\Debug\firmware`.
Папки `.identity-release-...` временные и удаляются после проверки.
## Прямое подключение общих BAT к новому CCS-проекту
Следующие разделы описывают прямые вызовы `ccs/precompile.bat` и
`ccs/postcompile.bat`. В этом варианте дополнительный последний аргумент
postcompile поддерживается и экспортирует целиком папку текущей сборки.
Общий генератор увеличивает версию прямо при вызове precompile, если в JSON задано `"increment_version": true`. Отсутствующий флаг или `false` сохраняет ручной режим.
Итератор общий для CCS, Keil и CLI; проектная обёртка не должна увеличивать номер повторно.
Каждый pre-build атомарно сохраняет следующий номер до генерации паспорта, включая попытки с последующей ошибкой. После patch 999 увеличивается minor, после minor 255 — major; младшие поля обнуляются. После 255.255.999 сборка останавливается. Clean не сбрасывает JSON; одновременные сборки с одним JSON не поддерживаются.
Выберите одну схему подключения: её pre-build и post-build должны
использовать один набор метаданных.
## Новый CCS-проект C2000: локальные версия и SCI8 BIN
Используйте обновлённую папку templates целиком. Режим `--identity` добавлен для нового проекта: Windows, Python 3.8+ в PATH и TI C2000 compiler с hex2000.exe. Git в PATH нужен для хеша коммита. Без Git либо без commit в проекте или templates используется `NOGIT000`; сборка и локальная конвертация разрешены. Это явно видно в manifest. SETGUI и доступ к серверу не требуются.
### 1. Создайте конфигурацию версии
При первом запуске pre-build автоматически копирует `ccs/firmware_identity.example.json` в путь конфигурации из команды (обычно `${PROJECT_LOC}/firmware_identity.json`, рядом с `.project`), если файла ещё нет. Существующий JSON не заменяется примером; при включённом итераторе в нём обновляется версия. После первого запуска откройте его, задайте свои product, target и version и пересоберите проект. Исходные значения примера перед первым запуском:
```json
{
"product": "MY_CONTROLLER",
"target": "TMS320F28335",
"version": [0, 1, 0],
"increment_version": true
}
```
Задайте своё изделие, настоящий контроллер и нужную версию. Для TMS320F2812 замените target. Начальный счётчик примера — 0.1.0; при включённом итераторе первый pre-build выдаёт 0.1.1. Этот JSON — единственное вручную редактируемое место версии в данной схеме.
### 2. Добавьте команды в CCS
Project Properties → Build → Steps, для нужной конфигурации. Пример предполагает templates в `K:\git_project\newProject\templates`. Замените только этот путь своим; макросы CCS оставьте как есть.
Pre-build steps → Command, одной строкой:
```bat
cmd /c call "K:\git_project\newProject\templates\tools\firmware-build\ccs\precompile.bat" --identity "${PROJECT_LOC}" "${PROJECT_LOC}\firmware_identity.json" "${BuildDirectory}\generated"
```
Post-build steps → Command, одной строкой:
```bat
cmd /c call "K:\git_project\newProject\templates\tools\firmware-build\ccs\postcompile.bat" --identity "${CG_TOOL_ROOT}" "${BuildDirectory}" "${BuildArtifactFileBaseName}" "${BuildDirectory}\generated\firmware_identity.json" "${BuildDirectory}\firmware"
```
Позиционные аргументы общего `ccs/postcompile.bat` после `--identity`:
| Позиция | Значение | Источник в CCS |
|---|---|---|
| 1 | Корень TI C2000 compiler, содержащий `bin/hex2000.exe` | `${CG_TOOL_ROOT}` |
| 2 | Каталог текущей конфигурации сборки | `${BuildDirectory}` |
| 3 | Имя или путь OUT без расширения `.out` | `${BuildArtifactFileBaseName}` |
| 4 | Метаданные, созданные pre-build | `${BuildDirectory}\generated\firmware_identity.json` |
| 5 | Постоянный каталог результатов | `${BuildDirectory}\firmware` |
| 6, необязательно | Каталог экспорта архивной папки текущей сборки | Полный путь назначения |
Здесь templates определяется расположением вызываемого общего BAT.
Для прямой схемы поле `templates` в JSON не заменяет путь в команде CCS.
Добавьте `${BuildDirectory}/generated` в include paths; при подключении
общего порта firmware-info добавьте
`K:/git_project/newProject/templates/c/firmware-info/include`.
Нужны оба шага. Precompile создаёт версию, UTC-время и Git-метаданные до компиляции. Postcompile преобразует OUT в SCI8 HEX/BIN, создаёт manifest и SHA-256 для точного BIN. Он не повторяет запрос Git после компиляции. В этом режиме `firmware-release.cmd` не нужен.
`BuildArtifactFileBaseName` передаётся без изменения и без расширения `.out`: допускается простое имя, абсолютный путь или путь относительно BuildDirectory. Postcompile находит OUT по этому пути, а для имён BIN/HEX использует только имя файла. Поэтому отдельная выходная папка проекта (например, `../bin`) не требует правки общей команды. Метаданные и результаты остаются в указанных каталогах generated и firmware.
### 3. Выполните полную сборку
Apply and Close → Clean → Build Project. Настройте шаги отдельно для Debug/Release; их generated и firmware находятся внутри своих BuildDirectory.
Результаты:
```text
Debug/
generated/
firmware_identity.h
firmware_identity.json
firmware/
MyFirmware.hex
MyFirmware_BUILDID.bin
MyFirmware_BUILDID.bin.manifest.json
MyFirmware_BUILDID.bin.sha256
HASH_YYYY-MM-DD_HH-MM-SS_UTC+3/
MyFirmware.hex
MyFirmware_BUILDID.bin
MyFirmware_BUILDID.bin.manifest.json
MyFirmware_BUILDID.bin.sha256
firmware_identity.json
```
Postcompile автоматически создаёт папку `HASH_YYYY-MM-DD_HH-MM-SS_UTC+3` для каждой сборки. HASH — первые 8 символов commit прошивки из pre-build JSON; при незакоммиченных изменениях добавляется `+`. Дата и время берутся из `built_at_utc` и переводятся в UTC+3 для имени папки. В JSON и заголовке сохраняется UTC. Если commit исходников неизвестен, используется build ID или NOGIT000. Например: `f5c3654e+_2026-10-08_15-30-00_UTC+3`. Сохраняются точные байты образа, manifest, SHA-256 и firmware_identity.json; в CCS также исходный OUT, HEX и map. Повтор postcompile с теми же метаданными обновляет ту же папку. Файлы непосредственно в firmware сохраняются, поэтому существующие команды копирования продолжают работать.
Добавьте generated и firmware в игнорируемые Git-каталоги. Обычно вся папка Debug уже игнорируется. Полный Rebuild обязателен для выпуска. BAT сами по себе не подтверждают, что OUT собран именно с этим заголовком.
### 4. Прямой postcompile: копирование папки текущей сборки в SETGUI
При прямом вызове общего ccs/postcompile.bat передайте каталог назначения последним аргументом после output-dir. Это правило относится к общему BAT; проектный firmware_build.bat использует copy_to из JSON. Скрипт скопирует целиком только папку HASH_DATE, созданную текущим запуском: исходный OUT (для CCS), BIN, HEX, map, manifest, SHA-256 и метаданные. OUT сохраняется с исходным именем для выбора и загрузки через JTAG в GUI. Скрипт использует папку из pre-build JSON, не выбирает её по времени изменения файлов и не копирует остальные архивы или отдельные файлы из корня firmware.
Полная команда Post-build для templates в `K:\git_project\newProject\templates`, одной строкой:
```bat
cmd /c call "K:\git_project\newProject\templates\tools\firmware-build\ccs\postcompile.bat" --identity "${CG_TOOL_ROOT}" "${BuildDirectory}" "${BuildArtifactFileBaseName}" "${BuildDirectory}\generated\firmware_identity.json" "${BuildDirectory}\firmware" "K:\git_project\newProject\SETGUI\..periph_28335\firmware\periph28335\balzam166"
```
Старые суффиксы `&& copy ...` и `&& xcopy ...` удалите. Папка назначения создаётся автоматически. В ней появится, например:
```text
K:\git_project\newProject\SETGUI\..periph_28335\firmware\periph28335\balzam166\
f5c3654e+_2026-10-08_15-30-00_UTC+3\
MyFirmware.hex
MyFirmware_BUILDID.bin
MyFirmware_BUILDID.bin.manifest.json
MyFirmware_BUILDID.bin.sha256
firmware_identity.json
```
Копирование выполняется после успешного архивирования; SHA-256 копии проверяется. Console покажет `[firmware-build] Exported folder: ...`. Повтор для той же папки обновляет её файлы; другие папки назначения сохраняются. Без последнего аргумента экспорт отключён. Это локальное копирование без сетевой публикации.
### Дополнительный Flash OUT из postbuild CCS
Если рядом с CCS-проектом, на уровень выше BuildDirectory, есть `build_flash.py`,
общий postbuild автоматически вызывает его с `--postbuild`, `--compiler`,
`--build-dir` и `--output`. Команда postcompile в настройках CCS остаётся прежней.
Сценарий проекта должен использовать уже готовые объекты, не запускать Make
и создать непустые `<имя>_flash.out` и `<имя>_flash.map` по переданному пути.
Адреса секций, отдельный linker-файл и необходимые определения препроцессора
задаёт проектный сборщик, а не общий templates.
Flash OUT и карта сохраняются рядом с обычным OUT. Копии, отдельный manifest
и SHA-256 попадают в firmware и ту же папку HASH_DATE, что и EEPROM BIN,
а затем копируются в GUI при настроенном export. Обычный BIN по-прежнему
создаётся из основного OUT; Flash OUT не преобразуется в EEPROM SCI8 BIN.
Ошибка сборщика или отсутствие любого результата завершает postcompile
с ненулевым кодом до архивирования и экспорта. Существующий Flash OUT
не считается результатом нового вызова: сборщик работает во временном каталоге.
Без `build_flash.py` дополнительные действия отключены.
Дополнительно hex2000 преобразует Flash OUT в отдельный `<имя>_flash_rs.bin`
с адресной таблицей SCI8, картой `.bin.map`, manifest и SHA-256.
Эти файлы сохраняются рядом с OUT, в firmware и в экспортируемой папке
HASH_DATE. Flash RS BIN содержит адреса внутренней Flash и предназначен
для совместимого проектного CMD_TFLASH; его нельзя выбирать как обычный
EEPROM BIN. Проект сам должен реализовать проверку адресов и алгоритм
программирования из RAM. Общий postbuild только формирует транспортный файл.
### Версия внутри устройства
Это подготовка метаданных сборки и файла. Чтобы версия присутствовала в программе и ответах устройства, подключите заголовок `firmware_identity.h` к модулю версии и обработчику запроса. Include path: `${BuildDirectory}/generated`. Для C2000 с 16-битным char нужна адаптация байтового контракта; обычный 8-битный порт нельзя считать готовым. Смотрите [PORTING.md](../../c/firmware-info/PORTING.md).
## Keil: тот же JSON, заголовок и SHA-256
Keil использует `firmware_identity.json` и режим `--identity`, как CCS. Дополнительный CMD-файл конфигурации и SETGUI для этой схемы не нужны. Требуется Python 3.8+ в PATH; Git нужен для commit. HEX создаётся штатным компилятором Keil, а BAT создаёт и проверяет manifest и SHA-256 точного HEX/BIN.
### 1. Создайте конфигурацию версии
Пример расположения:
```text
project/
firmware_identity.json
mdk/
Firmware.uvprojx
Generated/
```
Скопируйте `keil/firmware_identity.example.json` в корень project под именем `firmware_identity.json`. Исправьте product, target и version:
```json
{
"product": "MY_CONTROLLER",
"target": "STM32F407",
"version": [0, 1, 0],
"increment_version": true
}
```
### 2. Настройте Before/After Build
В Options for Target → Output включите Create HEX File. Затем откройте User и включите выполнение команд Before Build/Rebuild и After Build/Rebuild. Для обеих команд задайте Stop on Exit Code `>=1`, чтобы ошибка скрипта останавливала сборку. Пример предполагает templates в `K:\git_project\newProject\templates`; замените этот путь своим.
Before Build/Rebuild, одной строкой:
```bat
cmd /c call "K:\git_project\newProject\templates\tools\firmware-build\keil\precompile.bat" --identity "$P.." "$P..\firmware_identity.json" "$PGenerated"
```
After Build/Rebuild, одной строкой:
```bat
cmd /c call "K:\git_project\newProject\templates\tools\firmware-build\keil\postcompile.bat" --identity "#H" "$PGenerated\firmware_identity.json"
```
Для копирования только папки текущей сборки добавьте каталог назначения последним аргументом:
```bat
cmd /c call "K:\git_project\newProject\templates\tools\firmware-build\keil\postcompile.bat" --identity "#H" "$PGenerated\firmware_identity.json" "K:\git_project\newProject\SETGUI\..periph_28335\firmware\periph28335\balzam166"
```
Будет скопирована целиком новая папка HASH_DATE с HEX/BIN, manifest, SHA-256 и метаданными. Старые команды copy/xcopy в этой строке не нужны. В Console появится `[firmware-build] Exported folder`.
В Keil `$P` обозначает каталог проекта с завершающим разделителем, а `#H` — полный путь к выходному HEX. Официальное описание макросов: [Keil User commands](https://www.keil.com/support/man/docs/uv4cl/uv4cl_dg_user.htm). Макросы раскрываются в IDE; при ручном запуске BAT замените их реальными путями.
В примере файл uvprojx находится в mdk, поэтому `$P..` указывает на корень исходников. Если JSON и uvprojx находятся в одном каталоге, используйте `"$P."` для repository и `"$Pfirmware_identity.json"` для config; третий аргумент Generated сохраните.
Добавьте Generated в include path и подключите `firmware_identity.h` в модуле версии прошивки. Для параллельных или разных target задавайте отдельные Generated и согласуйте путь во второй команде. Перенос версии в ответ устройства требует подключения модуля и обработчика, как описано в [PORTING.md](../../c/firmware-info/PORTING.md).
### 3. Выполните Rebuild
Перед выпуском измените только исходный firmware_identity.json и выполните Rebuild. Precompile создаст заголовок и метаданные в Generated. Postcompile создаст рядом с HEX:
```text
Firmware.hex
Firmware.hex.manifest.json
Firmware.hex.sha256
firmware/
HASH_YYYY-MM-DD_HH-MM-SS_UTC+3/
Firmware.hex
Firmware.hex.manifest.json
Firmware.hex.sha256
firmware_identity.json
```
Папка HASH_DATE создаётся в firmware рядом с исходным HEX/BIN. Для неё используются commit и время precompile, переведённое в UTC+3, как в CCS. При успехе Console содержит строки `[firmware-build] Folder`, `Image`, `Manifest`, `SHA-256`. Для готового BIN вместо `#H` передайте его фактический путь; конвертацию AXF в BIN нужно выполнить до postcompile. Сгенерированные файлы исключите через .gitignore.
## Совместимость со старыми проектами
Вызовы BAT без `--identity` сохранены для уже настроенных проектов: прежний precompile генерирует только build ID, прежний postcompile запускает SETGUI preflight по release-конфигурации. Эта отдельная схема описана в [инструкции публикатора](../firmware-publish/README.md). Для новых CCS и Keil используйте приведённые выше команды с `--identity`.
## Автоматический CAN BIN вместе с Flash
Защищённый `c/firmware-info/tools/c2000_build.py build`, вызываемый из CCS
postbuild и `postcompile.bat --identity`, дополнительно создаёт CAN-вариант,
если проект явно задаёт `can_boot_profile` равным `f28335-m95m02-ab`
в `firmware_build_profile.json` и выбрана EEPROM M95M02.
Для AT25256B этот A/B-профиль отключён. Старые проекты без поля сохраняют
прежний состав выпуска. Изменение CAN-профиля требует нового prebuild и сборки.
В одном выпуске сохраняются:
| Файл | Назначение |
|---|---|
| `eeprom/<artifact>_<build_id>.bin` | Основной SCI8 RAM/EEPROM-образ |
| `can/<artifact>_<build_id>_can.bin` | ProtoCAN Boot, M95M02 A/B, RAM-приложение |
| `flash/<artifact>_flash.out` | Внутренняя Flash через JTAG, если проект имеет build_flash.py |
| `rs/<artifact>_flash_rs.bin` | Обновление внутренней Flash по RS из того же Flash OUT |
CAN BIN содержит точные байты проверенного RAM SCI8. Отдельно проверяются
предел 130560 октетов, максимум 64 секции, адреса RAM `[0x8000,0xE000)`,
entry, встроенный паспорт и экспортированные CAN hooks Init/Ready/Service/RxISR
в загружаемом payload. Flash-таблица не допускается как CAN BIN.
Каждый вариант получает собственные manifest и SHA-256. CAN-файл и оба
sidecar добавляются в тот же архив сборки и проходят штатный экспорт в GUI.
При отказе проверки CAN или обязательного Flash-варианта новая попытка
не копируется в постоянный output/export. Сетевая публикация и запись платы
этой командой не выполняются.
Защищённый C2000 postbuild располагает образы, их manifest, SHA-256 и карты
в папках `eeprom`, `flash`, `can`, `rs` как непосредственно в `--output`, так
и внутри архива `HASH_дата_UTC+3`. При `--export` весь архив переносится
в SETGUI с той же структурой. Общий `firmware_identity.json` остаётся
в корне архива; `latest_build.json` указывает manifest с относительным
путём `eeprom/<artifact>_<build_id>.bin.manifest.json`. Папка
неподдержанного варианта не создаётся. Низкоуровневые конверторы и другие
семейства MCU сохраняют прежний контракт своих результатов.
В SETGUI можно импортировать корень одной сборки или выбрать её папку
`eeprom`, `can`, `rs`. Основной BIN определяется выбранным паспортом,
а ZIP сохраняет все назначения этой компиляции. Для JTAG выберите
совместимый загрузчик полного комплекта: он возьмёт подписанный OUT
из `flash`. Старые плоские комплекты также поддерживаются.