Обеспечь единый процесс обновления для STM32F103/F407/G474 и TMS320F2812/F28335: discovery, служебные ответы, BUSY, тайм-аут сессии и подтверждение приложения. Добавь самостоятельные проекты CCS, аппаратные хранилища и Python-клиент. Совместимость: структуры конфигурации и порта расширены, поэтому потребители должны пересобраться и обнулить новые поля. Для C28x callbacks используют pcan_boot_byte_t; периодический pcan_boot_poll обслуживает discovery и настроенный тайм-аут.
77 lines
6.6 KiB
CMake
77 lines
6.6 KiB
CMake
# Общая C99-библиотека ProtoCAN Boot и аппаратно независимые host-тесты.
|
|
# Каждый контроллер сохраняет собственное состояние и отдельный аппаратный порт.
|
|
# Дополнительные проекты CCS находятся в projects/ccs и не требуют CMake для TI-сборки.
|
|
|
|
cmake_minimum_required(VERSION 3.13)
|
|
project(protocan_boot C)
|
|
|
|
set(CMAKE_C_STANDARD 99)
|
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
|
|
|
add_library(protocan_boot STATIC src/pcan_boot.c)
|
|
target_include_directories(protocan_boot PUBLIC include)
|
|
|
|
if(MSVC)
|
|
target_compile_options(protocan_boot PRIVATE /W4)
|
|
else()
|
|
target_compile_options(protocan_boot PRIVATE -Wall -Wextra -Wpedantic)
|
|
endif()
|
|
|
|
option(PCAN_BOOT_BUILD_TESTS "Собирать тесты ProtoCAN Boot" ON) # Не включает host-модели в код MCU.
|
|
if(PCAN_BOOT_BUILD_TESTS)
|
|
enable_testing()
|
|
add_executable(test_pcan_boot tests/test_pcan_boot.c)
|
|
target_link_libraries(test_pcan_boot PRIVATE protocan_boot)
|
|
add_test(NAME pcan_boot COMMAND test_pcan_boot)
|
|
endif()
|
|
|
|
if(PCAN_BOOT_BUILD_TESTS)
|
|
add_executable(test_f28335_can_boot tests/test_f28335_can_boot.c src/pcan_boot.c ports/tms320f28335/f28335_boot_store.c)
|
|
target_compile_definitions(test_f28335_can_boot PRIVATE PCAN_BOOT_WIDE_BYTES)
|
|
target_include_directories(test_f28335_can_boot PRIVATE tests/f28335_stubs)
|
|
add_test(NAME f28335_can_boot COMMAND test_f28335_can_boot)
|
|
endif()
|
|
|
|
if(PCAN_BOOT_BUILD_TESTS)
|
|
add_executable(test_f28335_application tests/test_f28335_can_boot.c src/pcan_boot.c ports/tms320f28335/f28335_boot_store.c)
|
|
target_compile_definitions(test_f28335_application PRIVATE PCAN_BOOT_WIDE_BYTES F28335_BOOT_LOADER=0)
|
|
target_include_directories(test_f28335_application PRIVATE tests/f28335_stubs)
|
|
add_test(NAME f28335_application COMMAND test_f28335_application)
|
|
foreach(width native wide)
|
|
add_executable(test_f28335_store_${width} tests/test_f28335_boot_store.c ports/tms320f28335/f28335_boot_store.c)
|
|
if(width STREQUAL "wide")
|
|
target_compile_definitions(test_f28335_store_${width} PRIVATE PCAN_BOOT_WIDE_BYTES)
|
|
endif()
|
|
add_test(NAME f28335_store_${width} COMMAND test_f28335_store_${width})
|
|
endforeach()
|
|
endif()
|
|
|
|
if(PCAN_BOOT_BUILD_TESTS) # Подключает настоящий аппаратно независимый драйвер NOR F2812 и регрессию длительного BUSY.
|
|
add_executable(test_f2812_nor tests/test_f2812_nor.c src/pcan_boot.c ports/tms320f2812/nor_flash.c ports/tms320f2812/boot_store.c) # Компилирует production-код вместе с x16 моделью чипа.
|
|
target_compile_definitions(test_f2812_nor PRIVATE PCAN_BOOT_WIDE_BYTES BOOT2812_HOST) # Октеты C28x широкие; подменяется только физическая шина памяти.
|
|
add_test(NAME f2812_nor COMMAND test_f2812_nor) # Регистрирует проверки CRC, SCI8, границ, manifest и отказов NOR.
|
|
add_executable(test_pcan_busy tests/test_pcan_busy.c src/pcan_boot.c) # Использует тот же codec, который обслуживает длинные аппаратные операции.
|
|
target_compile_definitions(test_pcan_busy PRIVATE PCAN_BOOT_WIDE_BYTES) # Проверяет wire-статус при 16-битном представлении октета C28x.
|
|
add_test(NAME pcan_busy COMMAND test_pcan_busy) # Регистрирует проверку продления session при живом прогрессе erase.
|
|
endif() # Включение библиотек без тестов не добавляет host-модель в прошивку.
|
|
|
|
if(PCAN_BOOT_BUILD_TESTS) # STM32-порты проверяются с моделью HAL и приватным отображением Flash, без доступа к плате.
|
|
foreach(family f103 f407 g474) # Каждый процесс компилирует настоящую реализацию bxCAN/FDCAN одного семейства.
|
|
add_executable(test_stm32${family} tests/test_stm32_ports.c ports/stm32${family}/pcan_boot_stm32${family}.c) # Подключает общий сценарий и семейный production-порт.
|
|
target_link_libraries(test_stm32${family} PRIVATE protocan_boot) # Использует тот же автомат и CRC, что библиотека устройства.
|
|
target_include_directories(test_stm32${family} PRIVATE tests/stm32_stubs) # Только host-цели видят подменённые семейные заголовки HAL.
|
|
if(family STREQUAL "f103") # Один сценарий выбирает адреса и аппаратную единицу записи F103.
|
|
target_compile_definitions(test_stm32${family} PRIVATE TEST_STM32F103) # F407 использует вторую ветку того же сценария.
|
|
endif() # Завершает выбор семейного профиля теста.
|
|
if(family STREQUAL "g474") # G474 использует FDCAN, doubleword и обе физические геометрии DBANK.
|
|
target_compile_definitions(test_stm32${family} PRIVATE TEST_STM32G474) # Включает G474-модель и проверку старого shifted-DLC HAL.
|
|
endif() # Завершает выбор аппаратного профиля G474.
|
|
if(MSVC) # Assertions должны исполняться и в Release-конфигурации host-тестов.
|
|
target_compile_options(test_stm32${family} PRIVATE /UNDEBUG) # Отменяет NDEBUG, чтобы аппаратные проверки и вызовы не исчезли.
|
|
else() # GCC и Clang используют стандартную форму отмены определения макроса.
|
|
target_compile_options(test_stm32${family} PRIVATE -UNDEBUG) # Сохраняет проверки границ памяти при любой конфигурации сборки.
|
|
endif() # Завершает настройку обязательных assertions.
|
|
add_test(NAME stm32${family} COMMAND test_stm32${family}) # Регистрирует регрессию полного обновления и аппаратных отказов.
|
|
endforeach() # Завершает регистрацию трёх независимых STM32-портов.
|
|
endif() # Без host-тестов CMake по-прежнему собирает только переносимое ядро.
|