Аппаратная библиотека в HAL - PullRequest
0 голосов
/ 04 октября 2018

Я делаю встроенный слой CAL (с cmake) HAL и пытаюсь добавить библиотеку, специфичную для некоторых MCU.Теперь проблема заключается в доступе к библиотечным функциям из верхнего уровня.

Мое решение для этого - использовать файл cmake для этой конкретной платы, чтобы определить макрос, на котором библиотека (и функция) будетлибо исключены, либо включены в верхние слои.Для этого необходимо отслеживать пары макросов -> библиотека и функции.

В смысле масштабируемости это не совсем хороший способ.Есть ли какой-нибудь более удобный способ (с точки зрения масштабируемости и унаследованности) реализовать аппаратные возможности?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Современный CMake работает с целями и свойствами.

Поэтому, когда вы создаете / экспортируете определенную библиотеку / цель, вы можете добавить target_compile_definitions с INTERFACE.

Это добавит определение любой цели, которая будет использовать эту библиотеку во время компиляции.

0 голосов
/ 04 октября 2018

Если у вас есть универсальный 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 является целевой сборкой.

...