Вадим Дерябкин @Vadimatorikda
Инженер-программист
Information
- Rating
- Does not participate
- Location
- Красноярск, Красноярский край, Россия
- Date of birth
- Registered
- Activity
Specialization
Software Developer, Embedded Software Engineer
Lead
From 250,000 ₽
C++
STM32
Linux
Circuitry
Python
Assembler
Programming microcontrollers
Embedded system
Software development
Object-oriented design
Запрет на предприятии? Если так, то да, больно. Если нет, то при использовании FreeRTOS все более чем шикарно. Работа с динамической памятью (при достаточном выделении ресурсов под ее дефрагментацию и прочее) очень удобна.
GCC адекватно может в C++14 (около года пишу так).
В самих ядрах косяков либо нет совсем, либо их не много. А вот периферия… Да.
С опытом такие вещи достаточно быстро раскрываются. Особенно если монтаж осуществлял не ты сам.
Лично мне нравится под МК программировать. Как только ты доходишь до понимания того, что твоего кода 5-10 кб, а остальное библиотеки и ты закидываешь их в отдельное место и больше почти не шьешь, то прошивка занимает не более 2-3 секунд. Очень удобно. А остальные 200 кб BSP лежат себе тихонько в конце flash и все. Как-нибудь напишу статью на эту тему. Как организовать это правильно. Есть подводные камни.
За статью спасибо. Приятно было почитать. Однако именно так я врят ли буду вопрос. Все же я когда-то давно написал универсальное средство вывода и отладки (да-да, на базе UART-а. Вернее USB-UART-а, но ни суть. Надо кстати задокументировать будет и описать...). Его мне хватает с головой.
Мое решение позволят просто в кратчайшие сроки решить задачу не потеряв в качестве.
Важно подчеркнуть: структура не должна иметь полей volatile! Иначе будет ошибка на подобии:
Причем ругаться будет на объект, объявленный так:
Как по мне, это достаточно не очевидно. Т.к. ошибка в структуре, от которой идет наследование (и затем обратный cast).
Второй момент. Если при объявлении объекта написать const класс< параметры шаблона > имя_объекта, а не const constexpr < параметры шаблона > имя_объекта, то со случайной вероятностью при разных компиляциях объект может попадать либо во flash, либо в RAM (причем в RAM с левыми адресами, заполнеными нулями, за пределами bss и data секций...). Над последним долго маял голову const constexpr перед объявлением объекта решает.
А статья понравилась. Если всю статью одним предложением, то «если чего-то будет не хватать — говори директору, пусть решение на его совести. Тебя в его (решении) исполнении никто не упрекнет») Хорошая позиция. Мне нравится.
Пример отсюда (не мой).
Просто, как говорилось в статье, все объекты библиотеки должны будут объявляться как const constexpr (помним, что в C++14 constexpr != const).
1.1 Рассчитана ли библиотека на монохромные экраны? Например, часто применяемые 128x64.
1.2 Имеется ли возможность рисования без буфера для монохромных экранов (в случае их поддержки)?
1.3 Имеется ли возможность выбора между отрисовкой с использование буфера и без него для монохромных экранов (в случае их поддержки)?
2.1 Какого рода требуется драйвер для цветного дисплея? Имеется ввиду, библиотеке рисования просто требуется поставить указатель на нужный пиксель строки/столбца LCD и после передать N пакетов, содержащих в себе цвета пикселей (массив цветов пикселей) из буфера, или будет требоваться по пиксельное обращение к буферу экрана?
2.2 В дополнение к предыдущему вопросу: отрисовка идет сразу готовой сформированной (или формирующийся динамически между передачами) картинки (драйвер просто копирует из буфера мк в буфер LCD) или же отрисовка идет по-элементно: сначала прямоугольник кнопки, потом внутри него текст и т.д.
2.3 Есть ли возможность создать const связанный список на этапе компиляции, а потом просто подставлять нужный список для отрисовки? Например, у меня 3 меню, все положения и т.д. заранее известны. Меняются только значения и такст. Я могу сделать const связанный список, который будет содержать указатели на изменяемые данные (которые будут динамически обновляться при каждой перерисовке)?
Чтобы было более понятно: очень много модулей мк в моих проектах (на CPP), работают на constexpr. Например. При условии, что GPIO никогда не меняют своих настроек в процессе работы (1 линия — 1 режим работы), я использую constexpr функции, которым скармливаю конфигурации каждого вывода, а на выходе получаю просто массив uint32_t переменных, которые в реальном времени (времени выполнения) копирую в выбранные GPIO.
Возможно ли нечто подобное в вашей библиотеке? Например, создаю объект (или структуру) описания одного окна, потом, если нужно, добавляю в него ссылки на другие окна, все это во время компиляции вычисляется и создается const структуры, которыми потом будет оперировать библиотека в реальном времени.
А насчет скорости… Компилирует ведь не Eclipse, а gcc. Так что… Но да, он довольно тяжелый. Я не упомянул, кстати говоря, что для тех, у кого много RAM, можно поправить настройки, чтобы Eclipse использовал хотя бы 1 Гб, вместо стандартных, кажется, 256 мб. Эо значительно ускоряет работу.
К тому же, хотелось показать, как на самом деле все это работает. Чтобы у человека было ясное представление обо всей подноготной этой сборки.