цифровая электроника
вычислительная техника
встраиваемые системы

 


Реализация многозадачности в Arduino с помощью ОСРВ RT-Thread

Автор: Mike(admin) от 19-07-2021, 03:55

Сегодня все больше плат Arduino оснащаются микроконтроллерами с ядром Cortex-M, а не AVR. 32-битное ядро с «огромным» объемом памяти и гораздо более высокой тактовой частотой, несомненно, является мощным средством. Однако для полного использования мощности использования простой функции «loop» может быть недостаточно. Это проблема, которую хочет решить проект библиотеки Arduino RT-Thread.


Реализация многозадачности в Arduino с помощью ОСРВ RT-Thread

RT-Thread представляет собой бесплатную ОСРВ с открытым исходным кодом (Apache License 2.0). Некоторые уникальные функции, такие как оболочка (названная FinSH), модуль динамической загрузки и множество драйверов устройств, делают ее очень интересной.


Библиотека размещена на Github (github.com/onelife/Arduino_RT-Thread) и может быть установлена через «Диспетчер библиотек». В настоящее время доступны два примера, которые также перечислены в разделе «CODE» (дополнительные примеры будут доступны позже). В первом примере «Blink» показано, как создать и запустить поток с именем «Blink». Задача потока "Blink" – мигать встроенным светодиодом с интервалом в 1 секунду. Второй пример «FinSH» показывает, как добавить пользовательскую переменную и команду в оболочку. Реализованы две пользовательские переменные led_id, led_state и одна пользовательская команда led().


FinSH, крошечная оболочка, принимает ввод в стиле C (например, hello ()), поддерживает автозаполнение и историю. Она предоставляет следующие предопределенные команды:


  • hello(): выведет "Hello RT-Thread!"
  • version(): информация о версии
  • list(): выведет список доступных команд
  • list_mem(): выведет информацию о памяти
  • list_thread(): выведет информацию о потоке
  • list_sem(): выведет информацию о семафоре
  • list_mutex(): выведет информацию о мьютексе
  • list_event(): выведет информацию о событии
  • list_mb(): выведет информацию о почтовом ящике
  • list_mq(): выведет информацию об очереди сообщений
  • list_memp(): выведет информацию о пуле памяти
  • list_timer(): выведет информацию о таймере

Вы можете добавить свою команду в два этапа. Во-первых, определите функцию причины. Возвращаемое значение может быть «void» или любого типа. Рекомендуется возвращать значение с типом «char», «byte», «short», «unsigned short», «int» или «unsigned int», поскольку эти типы могут хорошо интерпретироваться FinSH. Ограничений по параметрам нет. Однако существует ограничение на длину команды FinSH, которое по умолчанию составляет 80 символов. Так что любое число и любой тип подойдут. Во-вторых, вставьте строку с макросом ADD_SHELL_CMD (имя_команды, описание команды, имя_функции, тип возврата, список параметров) в "shell_cmd.h".


Далее приведен пример добавления пользовательской команды. Определите функцию led():



unsigned int led(unsigned int id, byte state) {
    rt_kprintf("led%d=%d\n", id, state);
    if (id != 0) {
        return 1;
    }
    if (state) {
        digitalWrite(LED_BUILTIN, HIGH);
    } else {
        digitalWrite(LED_BUILTIN, LOW);
    }
    return 0;
}

Добавьте строку в "shell_cmd.h":


ADD_SHELL_CMD(led, Turn on/off builtin LED, led, unsigned int, unsigned int id, rt_int32_t val)

В приведенном выше примере имя команды и имя функции совпадают. Однако они могут быть разными. Тогда имя команды становится псевдонимом имени функции. При выдаче команды FinSH следует использовать имя команды.


Вы также можете добавить свою собственную переменную, выполнив аналогичные шаги. Во-первых, определите переменную. Доступные типы: char, byte, char*, short, unsigned short, short*, int, unsigned int, int* и void*. Во-вторых, добавьте строку с макросом ADD_SHELL_VAR (псевдоним_переменной, описание переменной, имя_переменной, тип_переменной) в "shell_var.h". Соответствующие типы переменных здесь: «finsh_type_char», «finsh_type_uchar», «finsh_type_charp», «finsh_type_short», «finsh_type_ushort», «finsh_type_shortp», «finsh_type_int», «finsh_type_uint», «finsh_type_intp» и «finsh_type_voidp».


Далее приведен пример добавления пользовательских переменных. Определите переменные:



unsigned int led_id = 0;
 byte led_state = 1;

Добавьте две строчки в "shell_var.h":



ADD_SHELL_VAR(id, LED ID, led_id, finsh_type_uint)
ADD_SHELL_VAR(state, LED state, led_state, finsh_type_uchar)

После загрузки примера скетча «FinSH» откройте последовательный монитор, и вы увидите оболочку.



\ | /
- RT -     Thread Operating System
/ | \     4.0.1 build Mar  8 2019
2006 - 2019 Copyright by rt-thread team
finsh >

Попробуйте несколько предопределенных команд, приведенных ранее, вроде list_mem, list_event и т.п. Вы можете заметить, что после выполнения каждой команды оболочка выводит строку с двумя значениями: «0, 0x00000000». Эти два значения фактически являются возвращаемым значением базовой функции в десятичном и шестнадцатеричном форматах. «hello()» и «list()» возвращают «void». При попытке ввести «led(1, 0)» вы получите другое значение (это код ошибки).



finsh >id
       0, 0x00000000
finsh >state
       1, 0x00000001
finsh >led(id, state)
led0=1
       0, 0x00000000
finsh >state=0
       536870912, 0x20000000
finsh >led(id, state)
led0=0
       0, 0x00000000
finsh >led(1, 1)
led1=1
       1, 0x00000001
finsh >led(0, 1)
led0=1
       0, 0x00000000

Попробуйте пользовательскую команду и переменные. Экспериментируйте.




© digitrode.ru


Теги: Arduino, RTOS




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий