Программирование STM3220G под eCos

в 12:29, , рубрики: c++, embedded software development, Программинг микроконтроллеров, метки: ,

Есть у нас один проект, идея которого — создание фреймворка для быстрого программирования интеллектуальных шлюзов и хабов. Это когда один, в общем-то недорогой контроллер обслуживает группу датчиков по определённому алгоритму и при этом имеет связь с сервером. Такой себе вариант реализации internet of things.

Понятное дело фреймворк кросс-платформенный и должен покрывать максимально возможное количество аппаратных и программных платформ. Так вот, одним из заданий проекта является порт фреймворка для eCos, а в качестве аппаратной платформы для этого был выбран Cortex-M3 (STM32F2), в реализации платы STM3220G Eval. Опытом освоения такого вот тандема и хочется поделиться.


Выбор операционной системы и аппаратной платформы был сделан до моего прихода на проект, т.е. можно считать это данностью.

Изучив требования к фреймворку был однозначно сделан выбор языка — C++. Есть много споров о применении C++ в embedded, но об этом лучше писать отдельную статью. В качестве основной системы разработки используется Debian GNU/Linux AMD64, для которой конечно же существует отдельный порт фреймворка.

1. eCos

eCos (я её называю eXotic OS) — конфигурируемая операционная система реального времени для встраиваемых приложений. Она достаточно давно разрабатывается, но не очень распространена (как-то видел один график со статистикой её использования — что-то около 3-5% опрошенных пользователей её используют). Есть и коммерческий вариант — eCosCentric, но с ним работать пока не доводилось. Разработчики последнего, кстати, передали порт для STM3220G Eval платы. Об этом много написано в интернет.

2. Конфигурация eCos для STM3220G

На сайте eCos можно найти ссылки на бинарные версии утилит и toolchain. Порт для STM3220G пока находится в CVS репозитории. Бинарные версии и toolchain загружаются при помощи скрипта ecos-install.tcl. В случае STM32F2 необходим порт GCC для arm-eabi.

Особенностью eCos является то, что в ней буквально всё отключается. Причём делается это define-ами и екзотической, писанной разработчиками eCos, системой конфигурации, которая представлена двумя утилитами: configtool и ecosconfig. Первая имеет графический интерфейс GTK+, вторая — консольная. В нашем случае применяется configtool.

Начинать конфигурацию нужно с указания в configtool каталога, в который сохранены файлы, полученные из репозитория CVS (меню Build/Repository). После этого в шаблонах конфигурации (меню Build/Templates) появится вариант Hardware ST STM 3220G EVAL board.

Далее есть особенность: необходимо указать базовый набор пакетов, который будет включён в сборку операционной системы. Сразу скажу, что не все варианты удастся собрать так, чтобы получился образ, готовый для прошивки во флеш-память контроллера. Нашему фреймворку необходимы потоки и планировщик, а потому выбираем вариант Kernel. Первый вариант готов — можно собирать систему (меню Build/Library). На самом деле вся система представляет собой набор заголовочных файлов, статическую библиотеку и инструкции компоновщику (linker). Всё это собирается в отдельный каталог утилитой configtool.

Поскольку фреймворк кросс-платформенный, то в сборку eCos необходимо добавить пакеты C library, все пакеты относящиеся к ISO C Library и POSIX Compartibility. Это несколько увеличит базовый образ системы, но зато позволит писать на привычном языке C/C++, а не придумывать колесо (т.е. стандартную библиотеку C) заново.

В eCos выполнение программы начинается не с функции main как в ISO C, а с функций cyg_start (), что вовсе неблагоприятно влияет на переносимость кода. Для исправления этого необходим добавить пакет ISO environment startup/termination.

Последний штрих. Для сборки образа, который можно записать в ROM контроллера, необходимо указать Startup type == ROM (Configuation/eCos HAL/Cortex-M Architecture/Cortex-M3/-M4 STM32 Variant/ST STM32x0G-EVAL .../Startup type). Это позволит собрать правильный файл с инструкциями компоновщику.

Выполняем ещё раз Build/Library, Build/Tests и всё, можно приступать к программированию.

3. Программирование под eCos

Как говорилось ранее, основной язык разработки фреймворка — C++. При этом применяется большинство конструкций языка, включая инкапсуляцию, наследование, полиморфизм (с применением виртуальных методов), шаблоны и даже динамическая информация о типах. Лишь три вещи сразу были исключены из применения: исключения (exceptions), динамическое выделение памяти и использование STL (хотя в комплекте eCos имеется аналог библиотеки). Всё это в результате существенно облегчает жизнь разработчикам, и при этом образ программы (включая саму операционную систему) не превышает по объёму 256К (ROM), а для нормальной работы вполне достаточно штатных 128K RAM.

Итак, eCos обеспечивает нас библиотекой C, которая почти соответствует ISO, а язык C++ позволяет писать код, который легко читать и поддерживать. Стоит отметить, что в eCos имеются незначительные несоответствия со стандартами ISO и POSIX.

Ещё одна особенность. Для корректной компиляции C++ кода без использования стандартных библиотек C++ необходимо использовать C-шный компилятор (в нашем случае gcc-arm-eabi).

4. Компиляция и сборка проекта

Для сборки и тестирования системы написаны autoconf/automake, а также cmake скрипты. Они дублируют друг друга насколько это возможно и сделаны для удовлетворения потребностей сторонников как autotools, так и cmake. Лично моё предпочтение — autotools, потому на этом примере и буду далее повествовать.

Для выбора правильной платформы сборки (toolchain + настройка компилятора) достаточно воспользоваться стандартными ключами для autoconf скрипта (файл configure.ac):

$ ../configure --host=arm-eabi --prefix=$ECOS_INSTALL_DIR CXX=gcc-arm-eabi

при этом переменная ECOS_INSTALL_DIR должна содержать путь каталога, куда собраны заголовочные файлы и библиотека eCos (как указанно выше — конфигурируется при помощи configtool).

Кроме этих ключей в autoconf скрипт стоит добавить ключи для компоновщика и компилятора, например, так:

CFLAGS="$CFLAGS -ffunction-sections -fdata-sections"
CXXFLAGS="$CXXFLAGS -ffunction-sections -fdata-sections"
CPPFLAGS="$CPPFLAGS -I$prefix/include -mcpu=cortex-m3 -mthumb"
LDFLAGS="$LDFLAGS -L$prefix/lib -Ttarget.ld -mcpu=cortex-m3 -mthumb -Wl,--gc-sections -Wl,-n -Wl,-static -nostartfiles -nostdlib"

Полными вариантами скриптов могу поделиться, если кому интересно.

Вот и вся конфигурация.

5. Подготовка образа для прошивки во флеш память

Сборочные скрипты autotools/cmake позволяют получить исполняемый файл в формате ELF. Он не пригоден для загрузки во флеш-память контроллера. Для того, чтобы получить образ, пригодный для прошивки, необходимо воспользоваться программой objcopy:

$ arm-eabi-objcopy -O binary <your-elf-file> <your-image>.bin

Эту команду можно поместить в automake-скрипт (файл Makefile.am), например, так:

install-exec-hook:
if PLATFORM_ECOS
$(host_alias)-objcopy -O binary $(bindir)/$(PROGRAM_NAME)$(EXEEXT) $(bindir)/$(PROGRAM_NAME)$(EXEEXT).bin
endif

Проделав всё это можно получить образ, готовый для прошивки во флеш-память контроллера, простой командой:

$ make install

Вот собственно и всё.

Автор: modb

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js