Решил я попробовать перевести какой-нибудь из своих текущих проектов на RTOS и путем долгого сравнения выбрал RIOT OS, хотя изначально думал о ChibiOS, т.к. был уже опыт работы с ней. RIOT OS – операционная система реального времени для IoT – интернета вещей, полностью open source разработка для 32-х, 16-ти и 8-и битных микроконтроллеров. Для работы с этой ОС необходим Linux, либо MacOS на рабочей станции разработчика. Подробнее о преимуществах, функционале и сравнение с другими ОСРВ можно прочесть на официальном сайте.
Статья подразумевает, что у вас уже установлен на компьютере Linux или он установлен в качестве гостевой операционной системы на виртуальной машине. Я буду показывать все действия на примере Manjaro Linux и платы STM32F4-Discovery. Для тех, кто работает в Ubuntu, а таких я думаю большинство, я по возможности буду давать отдельные сноски с командами терминала.
Перед настройкой минимального рабочего окружения для работы с RIOT OS нам необходимо установить все рекомендованные для работы программы и утилиты. Начнем:
- Устанавливаем GIT:
1sudo pacman -S git - Устанавливаем пакет программ base-devel (make, gcc и т.д.):
1sudo pacman -S base-devel
В Ubuntu такой пакет называется build-essential, соответственно:
1sudo apt install build-essential - Устанавливаем некоторые зависимости
1sudo pacman -S valgrind bridge-utils
Если у вас 64-битная система на компьютере то необходимо установить multilib варианты программ:
1sudo pacman -S gcc-multilib valgrind-multilib
Соответственно, в Ubuntu:
1sudo apt install gcc-multilib - Устанавливаем OpenOCD:
1sudo pacman -S openocd
На текущий момент последняя версия OpenOCD 0.10.0. ST-LINK V2 программатор и отладчик JTAG, встроенный в платы Discovery и Nucleo. Настраиваем работу с программатором ST-LINK V2 в ОС.
В Linux настроить права на USB через UDEV. Для этого надо положить в /etc/udev/rules.d/ файл 99-openocd.rules следующего содержания:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116# Copy this file to /etc/udev/rules.d/ACTION!="add|change", GOTO="openocd_rules_end"SUBSYSTEM!="usb|tty|hidraw", GOTO="openocd_rules_end"# Please keep this list sorted by VID:PID# opendous and estickATTRS{idVendor}=="03eb", ATTRS{idProduct}=="204f", MODE="664", GROUP="plugdev"# Original FT232/FT245 VID:PIDATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="664", GROUP="plugdev"# Original FT2232 VID:PIDATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="664", GROUP="plugdev"# Original FT4232 VID:PIDATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", MODE="664", GROUP="plugdev"# Original FT232H VID:PIDATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", MODE="664", GROUP="plugdev"# DISTORTEC JTAG-lock-pick Tiny 2ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8220", MODE="664", GROUP="plugdev"# TUMPA, TUMPA LiteATTRS{idVendor}=="0403", ATTRS{idProduct}=="8a98", MODE="664", GROUP="plugdev"ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8a99", MODE="664", GROUP="plugdev"# XDS100v2ATTRS{idVendor}=="0403", ATTRS{idProduct}=="a6d0", MODE="664", GROUP="plugdev"# Xverve Signalyzer Tool (DT-USB-ST), Signalyzer LITE (DT-USB-SLITE)ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bca0", MODE="664", GROUP="plugdev"ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bca1", MODE="664", GROUP="plugdev"# TI/Luminary Stellaris Evaluation Board FTDI (several)ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcd9", MODE="664", GROUP="plugdev"# TI/Luminary Stellaris In-Circuit Debug Interface FTDI (ICDI) BoardATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcda", MODE="664", GROUP="plugdev"# egnite Turtelizer 2ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bdc8", MODE="664", GROUP="plugdev"# Section5 ICEbearATTRS{idVendor}=="0403", ATTRS{idProduct}=="c140", MODE="664", GROUP="plugdev"ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c141", MODE="664", GROUP="plugdev"# Amontec JTAGkey and JTAGkey-tinyATTRS{idVendor}=="0403", ATTRS{idProduct}=="cff8", MODE="664", GROUP="plugdev"# STLink v1ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3744", MODE="664", GROUP="plugdev"# STLink v2ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="664", GROUP="plugdev"# STLink v2-1ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", MODE="664", GROUP="plugdev"# Hilscher NXHX BoardsATTRS{idVendor}=="0640", ATTRS{idProduct}=="0028", MODE="664", GROUP="plugdev"# Hitex STR9-comStickATTRS{idVendor}=="0640", ATTRS{idProduct}=="002c", MODE="664", GROUP="plugdev"# Hitex STM32-PerformanceStickATTRS{idVendor}=="0640", ATTRS{idProduct}=="002d", MODE="664", GROUP="plugdev"# Amontec JTAGkey-HiSpeedATTRS{idVendor}=="0fbb", ATTRS{idProduct}=="1000", MODE="664", GROUP="plugdev"# IAR J-Link USBATTRS{idVendor}=="1366", ATTRS{idProduct}=="0101", MODE="664", GROUP="plugdev"ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0102", MODE="664", GROUP="plugdev"ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0103", MODE="664", GROUP="plugdev"ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0104", MODE="664", GROUP="plugdev"# J-Link-OB (onboard)ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0105", MODE="664", GROUP="plugdev"# Raisonance RLinkATTRS{idVendor}=="138e", ATTRS{idProduct}=="9000", MODE="664", GROUP="plugdev"# Debug Board for Neo1973ATTRS{idVendor}=="1457", ATTRS{idProduct}=="5118", MODE="664", GROUP="plugdev"# Olimex ARM-USB-OCDATTRS{idVendor}=="15ba", ATTRS{idProduct}=="0003", MODE="664", GROUP="plugdev"# Olimex ARM-USB-OCD-TINYATTRS{idVendor}=="15ba", ATTRS{idProduct}=="0004", MODE="664", GROUP="plugdev"# Olimex ARM-JTAG-EWATTRS{idVendor}=="15ba", ATTRS{idProduct}=="001e", MODE="664", GROUP="plugdev"# Olimex ARM-USB-OCD-TINY-HATTRS{idVendor}=="15ba", ATTRS{idProduct}=="002a", MODE="664", GROUP="plugdev"# Olimex ARM-USB-OCD-HATTRS{idVendor}=="15ba", ATTRS{idProduct}=="002b", MODE="664", GROUP="plugdev"# USBprog with OpenOCD firmwareATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c63", MODE="664", GROUP="plugdev"# TI/Luminary Stellaris In-Circuit Debug Interface (ICDI) BoardATTRS{idVendor}=="1cbe", ATTRS{idProduct}=="00fd", MODE="664", GROUP="plugdev"# Marvell SheevaplugATTRS{idVendor}=="9e88", ATTRS{idProduct}=="9e8f", MODE="664", GROUP="plugdev"# CMSIS-DAP compatible adaptersATTRS{product}=="*CMSIS-DAP*", MODE="664", GROUP="plugdev"LABEL="openocd_rules_end"
Перезагружаем правила UDEV:
1sudo udevadm control --reload-rules
Если все сделано правильно, то следующая команда должна соединяться с контроллером и выводить данные о нем:
1sudo openocd -f interface/stlink-v2.cfg -f board/stm32f4discovery.cfg - Устанавливаем GCC ARM Embedded Toolchain:
1sudo pacman -S arm-none-eabi-gcc arm-none-eabi-newlib - Этого вполне достаточно для начала работы и теперь можно скопировать репозиторий с туториалами в любую рабочую директорию:
1git clone --recursive https://github.com/RIOT-OS/Tutorials
Начнем сразу с первого туториала, переходим в директорию с первым заданием:
1cd /Tutorials/task-01
Компилируем программу для native платформы, это специальная платформа, которая позволяет запускать программу с RITO OS как Linux процесс. Для запуска достаточно в Makefile указать платформу BOARD как native, вызвать make и выполнить elf файл, который генерируется после компиляции:
1make all term
Запускаем команду help, чтобы увидеть список доступных команд:
123456> helphelpCommand Description---------------------------------------reboot Reboot the nodeps Prints information about running threads.
Например, посмотрим вывод ps:
1234567> pspspid | name | state Q | pri | stack ( used) | base | current- | isr_stack | - - | - | 8192 ( -1) | 0x8055520 | 0x80555201 | idle | pending Q | 15 | 8192 ( 6240) | 0x8053240 | 0x80539dd2 | main | running Q | 7 | 12288 ( 9312) | 0x8050240 | 0x8050ddd| SUM | | | 28672 (15552)
Ну ок, теперь можно и запуститься на реальном железе, для этого в Makefile меняем BOARD=native на BOARD=stm32f4discovery и запускаем команду:
1sudo make all flash term
Эта команда скомпилирует программу, прошьет микроконтроллер через подключенный программатор STLINK V2 и откроет соединение с командной оболочкой RIOT.Если получаем ошибку Error: libusb_open() failed with LIBUSB_ERROR_ACCESS то не забываем запускать команду make flash с sudo.
В следующий раз попробуем установить более продвинутое окружение для работы и создать свой демо проект для STM32. И обсуждение на форуме