Мысли о STM32 HAL или стоит ли стремиться в метапрограммирование на C++

Навеяно сообщением коллеги evsi
Что же до либ, то есть куда более перспективный путь, хотя он и не лежит в плоскости очередного HAL от конкретного производителя. Я имею в виду вот эту либу: github.com/andysworkshop/stm32plus
Кстати, сам Andy Brown (автор либы) ведет весьма интересный сайт andybrown.me.uk/
в недавнем обсуждении STM32 Peripheral Libs: FWLib -> SPL -> Middleware+HAL+CubeMX -> Middleware+Snippets -> CMSIS-Driver API? Куда это все ведет и есть ли истинный путь?

Шаблонное метапрограммирование.
По мере изучения С++, я вижу, что все пути ведут туда. Но пока я не способен (легко) понимать такой код, а уж тем более написать.
У меня к такой библиотеке вопросы:

1. Полностью ли абстрагирует эта конкретная библиотека железо, во всей его сложности? Вопрос шире. Пусть не эта конкретная, а в принципе, можно ли с помощью шаблонного метапрограммирования написать библиотеку, с помощью которой можно включить железо в любом описанном в datasheet режиме?
Не будем брать GPIO, возьмем АЦП. Какой-нибудь сложный режим совместного использования отдельных модулей АЦП, с пересылкой по DMA, запуском по таймеру. Повторюсь, простая периферия не интересует, интересует сложная в извращенных режимах.
Если кто-то из гуру положительно ответит на этот вопрос, буду расти в ту сторону.

2. Вот пишу я код в таком стиле, ухожу из конторы. Сколько будет стоить специалист, способный поддерживать такой код? Как легко его будет найти?

Хорошо, допустим можно написать на шаблонах вообще все, что угодно, во всей полноте. Что мы видим? С помощью достаточно сложного в применении языка шаблонов мы заставляем компилятор сгенерировать нужный нам код.

Почему бы не взять для генерации исходников более мощный язык, предназначенный для манипулирования текстом? Perl, Python, Javascript и так далее.
Описать в декларативном стиле (a-la QML) в JSON формате, что нам нужно от периферии. Парсим этот файл, генерируем C++ исходник, в котором классы периферии имеют простое АPI, минимально необходимое в конкретной задаче.

class AdcSigmaDelta
{
public:
    enum Gain
    {
        Gain05,
        Gain1,
        Gain2,
        Gain4,
        Gain8,
        Gain16,
        Gain32,
    };

    AdcSigmaDelta(const std::vector<Pin> & pins);

    bool start();
    int16_t code(size_t idx) const;
    float voltage(size_t idx) const;
    bool setGain(Gain gain);
...
}

Методы класса наш генератор реализует напрямую регистрами максимально эффективно.
Генератор должен не давать использовать одну периферию в разных местах, GPIO, задействованные в АЦП не задействовать для ШИМ.
Отсюда плавно приходит в голову использовать GUI для генерации JSON файла описателя.

Та-дам! Вот и он — STM32CubeMx.

Для меня, пока, круг замкнулся. Тот Cube, который сейчас есть, пускать в свой код нельзя, только для быстрого старта — сгенерил, посмотрел, взял в свой код, навел порядок.

Тот Cube, который я хотел бы видеть:
открытый исходный код — чтобы тысячи эмбеддеров совместно развивали проект (тысячи бесплатных тестировщиков!),
гибкий, настраиваемый — чтобы код генерился в моем стиле, раскиданный по мной описанному заголовочному файлу.

Счётчики итераций.

Немного препроцессорной магии.

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


Читать дальше
  • +3
  • 09 декабря 2015, 04:53
  • Mirmik
  • 1

Вектора прерываний в C++ стиле

Хочу представить на суд широкой общественности (да и самому не потерять) мою реализацию таблицы векторов прерываний для arm микроконтроллеров STM32. Данная реализация генерируется из asm-файлов SPL, написана на С++ и облегчает работу поддержкой автодополнений и корректной работой с таблицей векторов в памяти.


Читать дальше
  • +6
  • 11 ноября 2014, 17:25
  • dekar

Инициализация PWM конструктором класса ( C++ )

Долгое время писал код под МК на С. Друг пишет под МК на С++, посоветовал мне, вот я решил попробовать. Микроконтроллер у меня ATmega88А, IDE Atmel Studio 6.2. Буду использовать 6 апаратных PWM для управления сервоприводами, так как нужно писать 6 одинаковых кусков кода, решил сделать класс Servo:

class Servo
{
private:
        int* pulse_width;  

public:
        Servo(int* PWM_Channel);
        void write(int data);
}; //Servo

через конструктор передаем куда будем писать наше значение, тоесть регистр таймера для управления PWM:

// default constructor
Servo::Servo(int* PWM_Channel)
{
        pulse_width = PWM_Channel;
} //Servo


void Servo:: write(int data)
{
        *pulse_width = data;
}

Используем:

int main(void)
{ 
    Servo servo1(&OCR0A);
    Servo servo2(&OCR0B);
        
    servo1.write(10);
    servo2.write(50);
    
    while(1)
    {
    }
}


Вроде код получился читабельней.

Но вот как быть с инициализацией. Писать просто функцию где будут инициализироваться 3 апаратных таймера как то не по ООП. Добавить в конструктор весь код, будет инициализировать всё 6 раз, тоесть делать то же самое. Как можно сделать чтобы получить независимую инициализацию для каждого обьекта (канала) PWM — если регистры конфигурации разные для каждого таймера?
  • -1
  • 29 октября 2014, 12:18
  • Nemo

Автоматическая проверка стиля кодирования

Когда над одним проектом работает несколько человек, то использование каждым программистом своего стиля кодирования затрудняет чтение, поддержку и слияние кода. Хороший вариант — принудительное использование единого стиля кодирования, например: JSF Air Vehicle — C++ Coding Standards, Google C++ Style Guide, Стандарты программирования на C++" от Александреску.
Однако каждый программист ленив и старые привычки написания кода искоренить совсем непросто.

Читать дальше

Разработка для STM32F4Discovery с помощью mbed в QtCreator

В последнее время библиотека mbed набирает обороты. Одновременно с этим у замечательного C/C++ IDE от команды Qt средства работы с голым железом достигли нового уровня. Осторожно, много картинок (меньше 1Мб).


Читать дальше

Драйвер для tm1638 на STM32

Пока делал систему управления для своей печки, понадобилось выводить инфу и работать с кнопками. Решил использовать давно купленный дисплейчик типа такого:
Панелька на tm1638
Возникла необходимость рулить им. Свои изыски прилагаю, может кому пригодится.


Читать дальше

C++ с полного нуля спустя месяц

Примерно месяц назад я решил освоить программирование и выбрал для этого C++. Основные занятия продолжаю по книге Стауструпа «Программирование. Принципы и практика использования C++».

За это время я разобрался с типами данных, выражениями, функциями и почти две недели закрывал задачи по массивам, только сегодня разобравшись с реализацией решета Эратосфена (я заглянул в готовый алгоритм только после того, как собственная реализация не вызывала критики с моей стороны). На этой задаче был затык, т.к. идея вложенных циклов не разжевывается в книге.

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

Желания бросить не возникало, но убедился, что выбор основной книги верен для моего уровня подготовки на данный момент с позиции методологии (все же думаю, есть специальная литература, по которой надо шлифовать правильность архитектуры программ и позволяющая улучшить «красоту» кода). Я сравнил подачу изученного материала Страуструпом с подходом авторов в книгах:

Джесс Либерти «Освой Cpp самостоятельно за 21 день»
Харви М. Дейтел, Пол Дж. Дейтел — «Как программировать на C++»
Шилдт Г. — «Самоучитель C++»

Хотя, в поисках идеи вложенных массивов я запоем прочитал тематические главы из всех упомянутых книг и Страуструп Б. «Язык Программирования С++».

К Visual Studio 2013 я поставил Visual Assist, к которому быстро привык. Другие среды программирования буду щупать позже, т.к. Visual Studio устраивает полностью. Главное, освоившись с азами, я понимаю, что впереди море интересного: классы, шаблоны, наследование и прочее.

P. S. По поводу конкретно C++ и сетевых холиваров о перегруженности его «отвлекающим» функционалом, сказать пока ничего не могу, однако заметил, отличия в подаче материала Страуструпом и другими авторами в книгах по C++ для новичков. У Страуструпа какие-либо абстракции языка гармонично вытекают из предварительно поданной базы, остальные упомянутые книги я к данному моменту воспринимаю как гораздо менее связанный набор описаний аспектов языка.
  • +3
  • 09 февраля 2014, 22:32
  • habl

C++ Изучение программирования с нуля

В связи с обилием свободного времени в последние месяцы я решил поднять свой скилл программирования с нулевой отметки в каком-нибудь языке программирования. При этом стоит отметить, что программировал я всего четыре раза в жизни: в школе на бейсике, в экселе, разбирая входящие данные с битыми значениями, решив изменить дизайн блога, параллельно изучив html & CSS и решив пройти курс по javascript на codecademy.com.

Я помню кайф школьных времен, когда после размышлений, решение задачи приходит на ум и не терпится проверить, работает ли оно в реализации бейсика. Однако, освоив html, CSS, пройдя курсы javascript на codecademy.com и написав в экселе парсер битых данных, я понял, что нужно изучать что-то больше приближенное к сфере деятельности.

Врожденный перфекционизм не давал мне просто сесть и освоить assembler AVR (слишком узко), python и java (слишком аутентично), pascal (считал малоперспективным), C (зачем, если есть C++?). В итоге проведя пару вечеров за философскими рассуждениями на тему выбора первого языка для программирования, я остановился на C++, как универсальном современном языке программирования, решив, что потом при желании освою C#.

Потом я нашел книгу Б. Страуструпа «Принципы и практика использования C++» rutracker.org/forum/viewtopic.php?t=4123965 и определился, что учиться буду в Visual Studio 2013.

Скачал, установил, проверил, что SumatraPDF blog.kowalczyk.info/software/sumatrapdf/free-pdf-reader.html позволяет копировать текст из DJVU файла данной книги, прочитал вводную главу и начал разбираться с первой частью «Основы».

Книга оказалась, как раз для моего уровня, новичка, не владеющего синтаксисом языка программирования вообще. Сегодня я одолел все упражнения из конца первой главы, пару раз зайдя в тупик, из-за незнания конструкции else if и отсутствия объяснения со стороны автора, что в тело if можно добавлять несколько операторов через фигурные скобки. Я думал, что Страуструп будет объяснять все нюансы синтаксиса функций, которые позволяют выполнить упражнения после главы. Но мне так даже интереснее.

Я получаю удовольствие от процесса обучения по данной книге и мне интересно, кто как изучает программирование в случае, похожем на мой.
  • +1
  • 13 января 2014, 16:18
  • habl