Здравствуйте!
Сделана плата на основе микроконтроллера. Нужно одновременно поддерживать несколько версий встроенного ПО.
Помимо логики работы, версии отличаются инициализацией периферийных модулей.
Если с логикой работы более-менее приемлемо получается директивами условной компиляции, то с разными версиями инициализации периферийных модулей не знаю что делать.
Если модули обобщать, чтобы они были более гибкими, и в разных версиях просто настраивались по-разному, боюсь, модуль сильно разрастется.
И не всегда получается хорошо абстрагировать модуль, чтобы охватывались все варианты.
Пока остановился на такой реализации периферии: класс с минимально-необходимым интерфейсом.
Код
class Uart1
{
public:
enum Baudrate
{
...
};
Uart1();
void setBaudrate(Baudrate b);
void write(uint8_t * data, uint32_t size);
...
private:
DMA_HandleTypeDef mDmaTx;
UART_HandleTypeDef mUart;
...
};
Реализация по месту, без особых обобщений.
Код
void Uart1::write(uint8_t * data, uint32_t size)
{
__HAL_DMA_DISABLE(&mDmaTx);
mUart.Instance->CR3 &= ~USART_CR3_DMAT;
mDmaTx.Instance->CPAR = reinterpret_cast<uint32_t>(&mUart.Instance->TDR);
mDmaTx.Instance->CMAR = reinterpret_cast<uint32_t>(data);
const uint32_t dataLength = size;
mDmaTx.Instance->CNDTR = dataLength;
mUart.Instance->CR3 |= USART_CR3_DMAT;
__HAL_DMA_ENABLE(&mDmaTx);
}
Если нужна другая инициализация модуля - меняю *cpp файл модуля.
Пока думаю, что проект для всех вариантов ПО должен быть один и все версии файлов должны быть в нем.
Так вот, что делать с файлами периферии?
1. Можно раскинуть по папкам
version1/uart1.cpp
version2/uart1.cpp
Но не компилируется - объектные файлы с одинаковыми именами.
2. Можно менять им имена в зависимости от версии
uart1_ver1.cpp
uart1_ver2.cpp
И тогда придется еще вводить для каждой версии свое пространство имен, если хочу сохранить имя класса единое.
Не эстетично
3. Как-то организовать на уровне системы контроля версий. Пока не понимаю как, при условии, что все версии нужно вести параллельно.
4. Сделать header only файлы периферии. Не очень красиво, не рекомендуют.