реклама на сайте
подробности

 
 
> Как организовать проект: одна плата - много версий embedded ПО?
Slash
сообщение Dec 19 2016, 22:55
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 202
Регистрация: 10-04-05
Из: Санкт-Петербург
Пользователь №: 4 011



Здравствуйте!

Сделана плата на основе микроконтроллера. Нужно одновременно поддерживать несколько версий встроенного ПО.
Помимо логики работы, версии отличаются инициализацией периферийных модулей.

Если с логикой работы более-менее приемлемо получается директивами условной компиляции, то с разными версиями инициализации периферийных модулей не знаю что делать.
Если модули обобщать, чтобы они были более гибкими, и в разных версиях просто настраивались по-разному, боюсь, модуль сильно разрастется.
И не всегда получается хорошо абстрагировать модуль, чтобы охватывались все варианты.

Пока остановился на такой реализации периферии: класс с минимально-необходимым интерфейсом.
Код
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
И тогда придется еще вводить для каждой версии свое пространство имен, если хочу сохранить имя класса единое.
Не эстетично rolleyes.gif

3. Как-то организовать на уровне системы контроля версий. Пока не понимаю как, при условии, что все версии нужно вести параллельно.

4. Сделать header only файлы периферии. Не очень красиво, не рекомендуют.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 2nd September 2025 - 19:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01356 секунд с 7
ELECTRONIX ©2004-2016