RIOT OS. Установка и настройка минимального рабочего окружения

Решил я попробовать перевести какой-нибудь из своих текущих проектов на RTOS и путем долгого сравнения выбрал RIOT OS, хотя изначально думал о ChibiOS, т.к. был уже опыт работы с ней. RIOT OS — операционная система реального времени для IoT — интернета вещей, полностью open source разработка для 32-х, 16-ти и 8-и битных микроконтроллеров. Для работы с этой ОС необходим Linux, либо MacOS на рабочей станции разработчика. Подробнее о преимуществах, функционале и сравнение с другими ОСРВ можно прочесть на официальном сайте.

Статья подразумевает, что у вас уже установлен на компьютере Linux или он установлен в качестве гостевой операционной системы на виртуальной машине. Я буду показывать все действия на примере Manjaro Linux и платы STM32F4-Discovery. Для тех, кто работает в Ubuntu, а таких я думаю большинство, я по возможности буду давать отдельные сноски с командами терминала.

Перед настройкой минимального рабочего окружения для работы с RIOT OS нам необходимо установить все рекомендованные для работы программы и утилиты. Начнем:

  1. Устанавливаем GIT:
    sudo pacman -S git
  2. Устанавливаем пакет программ base-devel (make, gcc и т.д.):
    sudo pacman -S base-devel

    В Ubuntu такой пакет называется build-essential, соответственно:

    sudo apt install build-essential
  3. Устанавливаем некоторые зависимости
    sudo pacman -S valgrind bridge-utils

    Если у вас 64-битная система на компьютере то необходимо установить multilib варианты программ:

    sudo pacman -S gcc-multilib valgrind-multilib

    Соответственно, в Ubuntu:

    sudo apt install gcc-multilib
  4. Устанавливаем OpenOCD:
    sudo 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 следующего содержания:

    # 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 estick
    ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="204f", MODE="664", GROUP="plugdev"
    
    # Original FT232/FT245 VID:PID
    ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="664", GROUP="plugdev"
    
    # Original FT2232 VID:PID
    ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="664", GROUP="plugdev"
    
    # Original FT4232 VID:PID
    ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", MODE="664", GROUP="plugdev"
    
    # Original FT232H VID:PID
    ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", MODE="664", GROUP="plugdev"
    
    # DISTORTEC JTAG-lock-pick Tiny 2
    ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8220", MODE="664", GROUP="plugdev"
    
    # TUMPA, TUMPA Lite
    ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8a98", MODE="664", GROUP="plugdev"
    ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8a99", MODE="664", GROUP="plugdev"
    
    # XDS100v2
    ATTRS{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) Board
    ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcda", MODE="664", GROUP="plugdev"
    
    # egnite Turtelizer 2
    ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bdc8", MODE="664", GROUP="plugdev"
    
    # Section5 ICEbear
    ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c140", MODE="664", GROUP="plugdev"
    ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c141", MODE="664", GROUP="plugdev"
    
    # Amontec JTAGkey and JTAGkey-tiny
    ATTRS{idVendor}=="0403", ATTRS{idProduct}=="cff8", MODE="664", GROUP="plugdev"
    
    # STLink v1
    ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3744", MODE="664", GROUP="plugdev"
    
    # STLink v2
    ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="664", GROUP="plugdev"
    
    # STLink v2-1
    ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", MODE="664", GROUP="plugdev"
    
    # Hilscher NXHX Boards
    ATTRS{idVendor}=="0640", ATTRS{idProduct}=="0028", MODE="664", GROUP="plugdev"
    
    # Hitex STR9-comStick
    ATTRS{idVendor}=="0640", ATTRS{idProduct}=="002c", MODE="664", GROUP="plugdev"
    
    # Hitex STM32-PerformanceStick
    ATTRS{idVendor}=="0640", ATTRS{idProduct}=="002d", MODE="664", GROUP="plugdev"
    
    # Amontec JTAGkey-HiSpeed
    ATTRS{idVendor}=="0fbb", ATTRS{idProduct}=="1000", MODE="664", GROUP="plugdev"
    
    # IAR J-Link USB
    ATTRS{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 RLink
    ATTRS{idVendor}=="138e", ATTRS{idProduct}=="9000", MODE="664", GROUP="plugdev"
    
    # Debug Board for Neo1973
    ATTRS{idVendor}=="1457", ATTRS{idProduct}=="5118", MODE="664", GROUP="plugdev"
    
    # Olimex ARM-USB-OCD
    ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="0003", MODE="664", GROUP="plugdev"
    
    # Olimex ARM-USB-OCD-TINY
    ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="0004", MODE="664", GROUP="plugdev"
    
    # Olimex ARM-JTAG-EW
    ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="001e", MODE="664", GROUP="plugdev"
    
    # Olimex ARM-USB-OCD-TINY-H
    ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="002a", MODE="664", GROUP="plugdev"
    
    # Olimex ARM-USB-OCD-H
    ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="002b", MODE="664", GROUP="plugdev"
    
    # USBprog with OpenOCD firmware
    ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c63", MODE="664", GROUP="plugdev"
    
    # TI/Luminary Stellaris In-Circuit Debug Interface (ICDI) Board
    ATTRS{idVendor}=="1cbe", ATTRS{idProduct}=="00fd", MODE="664", GROUP="plugdev"
    
    # Marvell Sheevaplug
    ATTRS{idVendor}=="9e88", ATTRS{idProduct}=="9e8f", MODE="664", GROUP="plugdev"
    
    # CMSIS-DAP compatible adapters
    ATTRS{product}=="*CMSIS-DAP*", MODE="664", GROUP="plugdev"
    
    LABEL="openocd_rules_end"

    Перезагружаем правила UDEV:

    sudo udevadm control --reload-rules

    Если все сделано правильно, то следующая команда должна соединяться с контроллером и выводить данные о нем:

    sudo openocd -f interface/stlink-v2.cfg -f board/stm32f4discovery.cfg
  5. Устанавливаем GCC ARM Embedded Toolchain:
    sudo pacman -S arm-none-eabi-gcc arm-none-eabi-newlib
  6. Этого вполне достаточно для начала работы и теперь можно скопировать репозиторий с туториалами в любую рабочую директорию:
    git clone --recursive https://github.com/RIOT-OS/Tutorials
    

    Начнем сразу с первого туториала, переходим в директорию с первым заданием:

    cd /Tutorials/task-01

    Компилируем программу для native платформы, это специальная платформа, которая позволяет запускать программу с RITO OS как Linux процесс. Для запуска достаточно в Makefile указать платформу BOARD как native, вызвать make и выполнить elf файл, который генерируется после компиляции:

    make all term

    Запускаем команду help, чтобы увидеть список доступных команд:

    > help
    help
    Command              Description
    ---------------------------------------
    reboot               Reboot the node
    ps                   Prints information about running threads.

    Например, посмотрим вывод ps:

    > ps
    ps
            pid | name                 | state    Q | pri | stack ( used) | base       | current
              - | isr_stack            | -        - |   - |  8192 (   -1) |  0x8055520 |  0x8055520
              1 | idle                 | pending  Q |  15 |  8192 ( 6240) |  0x8053240 |  0x80539dd
              2 | main                 | running  Q |   7 | 12288 ( 9312) |  0x8050240 |  0x8050ddd
                | SUM                  |            |     | 28672 (15552)

    Ну ок, теперь можно и запуститься на реальном железе, для этого в Makefile меняем BOARD=native на BOARD=stm32f4discovery и запускаем команду:

    sudo make all flash term

    Эта команда скомпилирует программу, прошьет микроконтроллер через подключенный программатор STLINK V2 и откроет соединение с командной оболочкой RIOT.

    Если получаем ошибку Error: libusb_open() failed with LIBUSB_ERROR_ACCESS то не забываем запускать команду make flash с sudo.

    В следующий раз попробуем установить более продвинутое окружение для работы и создать свой демо проект для STM32. И обсуждение на форуме

2 Ответов в “RIOT OS. Установка и настройка минимального рабочего окружения

  1. Добрый день!
    Эту статью нашел одну из оочень немногих про операционку RIOT для STM32.
    С програматором ST-LINK V2.
    Начал устанавливать Ubuntu на Win10. Не дополнительную а встроенную можно тут почитать. https://habr.com/post/280560/
    Сделал Git Clone.
    Разобрался как и где находятся файлы и как указывать название процессора.
    Но пока не могу сделать сборку командой make и не могу установить рекомендуемый GNU make.
    Но знаю точно что это возможно.
    Возможно вы знаете как установить?

    1. Добрый день. Для ubuntu все необходимые для сборки утилиты находятся в пакете build-essential, необходимо его инсталлировать как у меня в статье описано и далее уже запускать make. Если в процессе получаете ошибки, то опишите их здесь же в комментариях, лучше со скриншотами.

Комментарии отключены.