Если у вас есть универсальный HAL, в который вы включаете библиотеку, которая доступна только на некоторых MCU, то единственное решение - грязные условные переключатели компилятора: #ifndef SOMETHING #include "library.h" ...
.Это быстро делает код нечитаемым, поэтому они всегда являются последним средством.
Однако все это наводит на мысль о том, что у вас есть проблема разработки программы.Ваша программа должна работать следующим образом (порядок вызовов):
Код приложения -> HAL -> Драйвер, специфичный для MCU
Где каждый из этих трех уровней не знает ничего о содержимом внутри других,Естественно, что внутри HAL не должно быть ничего специфичного для MCU.Скорее, это должно быть внутри водителя.Даже в редком случае, когда код в драйвере идентичен (например, при использовании разных производных MCU одного семейства).
Таким образом, на практике вы получите, например, «spi_library.h», которыйэто HAL, и ряд драйверов, таких как "MCUX_SPI.c", "MCUY_SPI.c", где "MCUX" и "MCUY" - это разные номера деталей MCU.
В C ++ это обычно делаетсяреализация HAL как абстрактного базового класса, который наследует каждая реализация MCU.HAL предоставляет чисто виртуальные функции, которые должны быть реализованы драйвером.(Не обязательно public
единицы.)
При публикации HAL вы предоставляете все поддерживаемые драйверы.Но приложение должно ссылаться только на соответствующий драйвер.Приложению не нужно знать содержимое этого драйвера, но оно должно знать, какой MCU является целевой сборкой.