Всем привет!
При освоении очередной embedded платформы (
подробности тут) пришлось столкнуться с тем, что не всё необходимое для работы содержалось в самом тулчейне для этой платформы и кое-что оказалось неприемлемого качества. Поэтому в результате этой работы было скомплектовано несколько библиотек (на данный момент - три). Выделить этот код в библиотеки оказалось удобно и логично потому, что он используется вне зависимости от целевого проекта. При этом две библиотеки оказались кроссплатформенными, т. е. их можно использовать в любых embedded проектах.
Для того, чтобы результат проделанной работы был полезен ещё кому-то, упомянутые библиотеки опубликованы на github.com. Реализовано всё это в виде коллекции git репозиториев под общим названием emb-lib:
https://github.com/emb-libПроект этот открытый, если у кого-то есть наработки в виде библиотек для embedded применений и есть желание поделиться с коллегами, приглашаю к участию. Технически любая такая библиотека — просто отдельный git репозиторий в составе emb-lib. В рабочий проект можно подключить либо как подмодуль git, либо просто скачать файлы. Каждый репозиторий имеет свою Wiki страницу, на которой можно поместить краткую документацию по библиотеке (состав, использование и т.д.).
* * *
Собственно, библиотек на данный момент три:
- библиотека форматированного ввода/вывода (по факту пока только вывод);
- менеджер памяти;
- библиотека поддержки режима bare-metal C++ для ADI GNU Toolchain (bfin-elf).
Первые две библиотеки являются кроссплатформенными.
* * *
Библиотекой форматированного вывода поделился
Сергей Борщ. Мы с ним пытались найти авторов, но этого не удалось достичь, история появления этого кода уходит в прошлое и следы теряются. Удалось только найти несколько клонов с разным количеством изменений на открытых площадках (github.com, sourceforge.net) Надеюсь, авторы не будут в претензии, что их код предлагается к открытому использованию.
Библиотека поддерживает форматированный вывод целых, типов с плавающей точкой, строк. Для включения поддержки плавающей точки нужно определить макрос PRINTF_FLOAT (это удобно сделать через передачу макроса в командной строке - в большинстве компиляторов через опцию -D).
Библиотека не содержит функции printf, реализация которой предоставляется пользователю. И это правильно — конечная реализация этой функции зависит от требований целевого проекта (нужна ли потокобезопасность) и возможностей аппаратной платформы (порт для вывода). Пример такой функции приведён на странице библиотеки.
* * *
Менеджер памяти. Собственно сам менеджер heap_z был разработан и опубликован тут же на электрониксе
zltigo лет пять-шесть назад, и, насколько понимаю, немало народу с этим кодом знакомо и успешно использует. Поделился этим опять
Сергей Борщ в варианте C++-обёртки. Код претерпел некоторые изменения (настройка поддержки многопоточности, перевод комментариев, пользовательский интерфейс), но суть (идеология, алгоритм выделения/освобождения памяти) да и основой рабочий код остались без изменений. Добавления коснулись в основном интерфейса пользователя: С++ интерфейс (набор new/delete), параметризация с помощью шаблонов С++, простой и безопасный вариант объявления массива под heap. Добавлена краткая справка, она доступна на Wiki странице
https://github.com/emb-lib/heap_z/wiki репозитория библиотеки. Библиотека публикуется с согласия автора.
Все объявления и определения менеджера памяти помещены в пространство имён heap. Использование менеджера памяти достаточно простое и сводится к двум действиям:
- объявить массив памяти под пул;
- объявить объект менеджера памяти.
CODE
heap::pool<4096> HeapPool; // size in bytes
…
heap::manager<heap_guard> heap::Manager(HeapPool);
Поскольку библиотека может использоваться в многопоточных программах, там предусмотрено средство для защиты от одновременного доступа (heap_guard) — для RTOS это, как правило, mutex. Этот момент нуждается в конфигурации, но там всё достаточно просто. Подробнее — на
Wiki странице.
* * *
Библиотека для bfin-elf возникла из-за того, что упомянутый тулчейн штатно не включает в себя всё необходимое для bare-metal режима с поддержкой С++, а реализация некоторых стандартных модулей не на высоте (
подробности тут).
Библиотека содержит:
- функцию для регистрации обработчиков исключений;
- weak функцию _init, необходимую библиотечной функции, осуществляющей вызов конструкторов глобальных объектов;
- минимальный стартап (crt.S);
- несколько интринсиков;
- низкоуровневые функции настройки pll/clock;
«Отыщи всему начало, и ты многое поймёшь» К. Прутков