amaora 24 16 декабря, 2022 Опубликовано 16 декабря, 2022 · Жалоба Использую make для задач сборки проекта для МК. По мере роста проекта требуются разные возможности, которые сам make напрямую не обеспечивает. 1) Конфигурирование сборки под разные платы. В большинстве случаев, все функции устройства сохраняются, а меняется только код HAL. Объем изменений может быть сильно разный, от самого простого, когда меняется назначение пинов МК, до переключения на другой МК с изменением списка компилируемых файлов и выбора другого компилятора. 2) Конфигурирование софтовых возможностей. Например, добавить/исключить поддержку поддержку какой-то периферии подключаемой к внешним интерфейсам устройства, разные типы датчиков, подключение которых не требует аппаратных изменений. Поддержка разных (и взаимоимключающих) протоколов взаимодействия. 3) Иногда выбор конкретной платы подразумевает наличие/отсутствие каких-то возможностей, в соответствии с этим включаются/отключаются софтовые блоки из п2. Сейчас у меня сделан какой-то свой велосипед. Записываю конфигурацию платы в BOARD.h файл такого вида. #define HW_MCU_STM32F405 #define HW_HAVE_ANALOG_KNOB #define HW_HAVE_NTC_ON_PCB #define HW_HAVE_NTC_MOTOR #define HW_HAVE_NETWORK_EPCAN #define HW_HAVE_STEP_DIR #define HW_CLOCK_CRYSTAL_HZ 12000000UL ... Где-то в проекте делаю "include _HW_INCLUDE", где этот параметр передаётся из ключей компилятора заданных через make, чтобы можно бы собрать проект под плату BOARD вызовом "make HWREV=BOARD". Дальше требуется делать условные блоки в Makefile. ifeq ($(HWMCU), STM32F405) CFLAGS += -mcpu=cortex-m4 -mthumb CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 endif ... ifeq ($(INCLUDE_HAL_USB), 1) OBJS += hal/usb.o endif ... Для этого я генерирую на каждый BOARD.h соответствующий ему BOARD.d, который включается в Makefile. Генерирую с помощью скрипта на питоне. def mkdefs(hw): f = open('hal/hw/' + hw + '.h', 'r') g = open('hal/mk/' + hw + '.d', 'w') for s in f: if 'HW_MCU_STM32F405' in s: g.write('HWMCU = STM32F405\n') elif 'HW_MCU_STM32F722' in s: g.write('HWMCU = STM32F722\n') elif 'HW_HAVE_USB_CDC_ACM' in s: g.write('INCLUDE_HAL_USB = 1\n'); g.write('INCLUDE_CHERRY = 1\n'); elif 'HW_HAVE_NETWORK_EPCAN' in s: g.write('INCLUDE_HAL_CAN = 1\n') g.write('INCLUDE_EPCAN = 1\n') ... Приходится постоянно дорабатывать этот велосипед под новые требования. Ваши варианты решения таких проблем? Что есть готового хорошего и не слишком тяжеловесного? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 16 декабря, 2022 Опубликовано 16 декабря, 2022 · Жалоба из того что попроще - перейти на cmake и собирать код под конкретную платформу из соответствующей папки HAL/build с использованием относительной адресации вида ../../src/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 58 16 декабря, 2022 Опубликовано 16 декабря, 2022 · Жалоба Если умеете Python, то SCons порулит все задачи. Правда, идеология там совсем не make, т.ч. тут некоторая ломка стереотипов. Но она (идеология) куда более прямая, чем в make. И вся мощь ЯП Python к вашим услугам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 75 16 декабря, 2022 Опубликовано 16 декабря, 2022 · Жалоба premake, только там lua вместо питона, и не полная замена make как scons, а легкая надстройка которая генерит мэйкфайлы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться