Как стать автором
Обновить

Embox дает (RISC)-пять на платформе VOSTOK

Время на прочтение7 мин
Количество просмотров606

Всем привет.
В данной статье, мы, как и обещали, расскажем о работе свободной ОС РВ Embox на микроконтроллере К1921ВГ015 . Это микроконтроллер  от компании АО “НИИЭТ”, входящей в Группу компаний “Элемент”.

К1921ВГ015 основан на архитектуре RISC-V и имеет приличные ресурсы (1 Мб flash и 256 + 64 кБ RAM, развитую периферию). Это позволяет реализовывать на его основе богатую функциональность, необходимую для построения различного рода современных цифровых устройств.


Чем хорош микроконтроллер?

Для начала хочу сделать небольшое лирическое отступление и поговорить о том, чем же ценится микроконтроллер? Ответ очевиден: возможностью реализовывать конкурентоспособные цифровые устройства на его основе! Это и ценовые параметры устройства, и энергопотребление, и конечно, в современных условиях от цифровых устройств требуют быть все более умными, то есть уметь реализовывать сложный набор функций. А эта возможность зависит не только от технических характеристик самого МК (как я сказал, К1921ВГ015 отвечает современным требованиям и позволяют реализовывать богатую функциональность), но, в огромной степени, еще и от экосистемы ПО, в которую входят как средства разработки и отладки, так и готовые программные модули, которые можно использовать при разработке своего устройства.

Давайте рассмотрим экосистему К1921ВГ015. Поскольку этот МК имеет открытую процессорную архитектуру RISC-V, то сразу отпадает вопрос с кросс-компиляторами и отладчиками. Огромным сообществом RISC-V развиваются архитектурные части открытых проектов GCC и LLVM. Эти проекты являются являются стандартом де-факто для компиляторов. Сообществом также развивается и архитектурная часть проекта GDB, который является стандартом де-факто для отладчиков.

Кроме программы отладчика, для работы с МК требуется GDB сервер, который будет получать команды от  клиента и интерпретировать их на плате. Для отладки МК есть открытый проект OpenOCD (Open On-Chip Debugger), в который разработчики платформы Vostok добавили поддержку для работы с К1921ВГ015 (https://github.com/DCVostok/openocd-k1921vk ).

Таким образом, с точки зрения удобства сборки и отладки К1921ВГ015 не отличается от хорошо известных STM32. Но очевидно, что этого недостаточно для того чтобы быстро разрабатывать “умные” устройства. У тех же STM32, например, есть STM32Cube, который включает не только набор драйверов (так называемый HAL), но и множество готовых примеров и программных компонент (ОС FreeRTOS, TCP/IP стек LWIP и так далее). Кроме того, есть и поддержка других ОС ‘mbed’, ‘zephyr’ , а для некоторых плат даже есть ucLinux.

Но как было показано в статье “Перенос вашего проекта под Embox на новую плату STM32“, Embox предоставляет даже большие возможностей по сравнению с STM32Cube, поскольку еще больше облегчает создание, поддержку и сопровождение “умных” устройств!

Embox на К1921ВГ015

Теперь, после лирического отступления, вернемся к основной теме статьи -- рассказу о работе Embox на микроконтроллере К1921ВГ015 и рассмотрим пару популярных задач, которые были уже использованы в реальных проектах на основе Embox и К1921ВГ015.

Но прежде всего покажем, как  собрать, прошить и запустить образ Embox на отладочной плате.

Как я сказал ранее,  К1921ВГ015 имеет хорошую базовую экосистему ПО, включая доработанный On-Chip отладчик OpenOCD (https://github.com/DCVostok/openocd-k1921vk ). К сожалению, пока наработки не включены в основной проект и придется собрать его из исходников.

Сборка и запуск OpenOCD

Получаем исходники

git clone git@github.com:DCVostok/openocd-k1921vk.git

Переходим в папку с исходниками

cd openocd-k1921vk/

Конфигурируем и собираем.

./bootstrap
./configure
make

Переходим в папку tcl. (скрипт собранный openocd нужно запускать из этой папки чтобы не указывать полный путь к скрипту)

cd tcl

Подсоединяем плату по USB (разъем USB1)

Запускаем openocd для данной платы

sudo ../src/openocd  -f board/vostok_vg015_dev.cfg

Запускаем образ

Скачиваем Embox

git clone git@github.com:embox/embox.git

Переходим в корневую папку проекта

cd embox

Конфигурируем проект для работы с демо образом для отладочной платы на К1921ВГ015

make confload-platform/vostok/vostok_vg015_dev

Собираем образ

make

Подсоединяемся помощью gdb

gdb-multiarch build/base/bin/embox

в консоли gdb указываем, что хотим подключиться к запущенному openocd (порт 3333)

target extended-remote :3333

указываем, что хотим  сбросить МК и остановить его (для записи образа)

monitor reset halt

загружаем образ

load

Запускаем на выполнение

continue

Естественно, в консоли  gdb можно: отлаживать, ставить точки останова, смотреть значение регистров и переменных, ходить по шагам, все как в обычном gdb..
Кроме того, вы можете подключить любую удобную IDE, например, сейчас очень популярна VSCode (и ее открытая версия VSCodium). В ней все это можно сделать и ходить по исходному коду.

Открываем консоль

На отладочной плате через разъем USB1 кроме JTAG отладчика доступна еще и консоль, работающая через UART на микроконтроллере. Открываем программу терминала, например minicom. Порт в Linux /dev/USB0 Частота заданная в образе по умолчанию 115200

sudo minicom -b 115200 -D /dev/ttyUSB0

Для проверки работы можно выполнить команды в консоли embox, например команду ‘uname -a’ или ‘version’

Мигаем светодиодом

Первая задача - мигание светодиодом.  Можно сказать, классический “hello world” для микроконтроллеров.
Embox позволяет просто создавать драйвера для GPIO. Причем они достаточно функциональные: можно задавать различные режимы, можно подключать GPIO как источник внешних прерываний, ну и конечно можно настраивать GPIO как контакты для других устройств, например, UART.

После реализации драйвера можно использовать удобное прикладное API, и сразу из консоли поуправлять GPIO с помощью команды pin

На моей отладочной плате есть 4 светодиода, которые подключены к порту GPIOA выводы 12,13,14,15

Для того чтобы включить светодиод, нужно просто подать на вывод 1 (set) для того чтобы выключить 0 (reset)

Включить светодиод на выводе GPIOA 12

pin GPIOA 12 set

Выключить

pin GPIOA 12 reset

Файловая система на кристалле

Следующая задача, которая тоже часто встречается и применяется во многих конечных устройствах, - это простая файловая система, которая используется, например, для хранения настроек. Мы уже описывали ее в статье “Сохраняем настройки и лог файл во внутренней памяти микроконтроллера”. Поэтому просто продемонстрирую, как она работает.

Уже на предыдущих скриншотах видно, что в папку ‘/conf’ примонтирована  файловая система ‘DumbFS’ c устройстве ‘/dev/inchip_flash0’. Поэтому просто создадим и запишем в файл ‘ /conf/test.txt’ какую-нибудь строку с помощью команды 'echo'

echo "1234" > /conf/test.txt

Проверим, что файл появился и содержит правильные данные с помощью команд ‘ls’ и ‘cat’.

ls /conf
cat /conf/test.txt

И посмотрим содержимое нашего блочного устройства с помощью команды ‘dd’

dd if=/dev/inchip_flash0 count=1 bs=128 format=hex_c’

Мигаем светодиодами с помощью языка для ПЛК (МЭК 61131-3)

Одной из подходящих сфер применения для К1921ВГ015 является АСУ-ТП. В этой сфере есть свои особенности, одной из которых является то, что ПЛК (Программируемые Логические Контроллеры) строятся по стандарту МЭК 61131, который, в частности, задает правила на языки программирования подобных систем (МЭК 61131-3). Существуют несколько открытых проектов, которые позволяют использовать эти языки. Например, Beremiz и OpenPLC, а так же компилятор MatIEC. Кроме того, есть открытый проект 4Diaс,  который позволяет программировать ПЛК на следующем поколении стандарта МЭК 61499.

Но обсуждения на данную тему выходят за рамки данной статьи, надеюсь, мы в ближайшем будущем напишем отдельную статью или даже серию статей. В данной статье я просто покажу, как работает программа разработанная на языке LD в среде Beremiz и транслируемая в язык ST и запускаемая на Embox на К1921ВГ015.

Итак, идея у нас простая! В Embox описать модули которые понимают IDE, в частности, Beremiz, например, включение и выключение светодиода на Embox. Поскольку Embox модульная система, можно задать те функциональные блоки, которые позволяем использовать на данной платформе (в данной системе), и с этими блоками запустить IDE. Разрабатываем программу из представленных блоков. И  запускаем доработанный компилятор matIEC, который из ST файла делает программу для Embox

Вот короткая инструкция по установке доработанного Beremiz на нашем вики

Сконфигурируем embox для работы с PLC добавив туда работу с LED. Для этого добавим в файл mods.conf строчки

	include project.plc.cmd.plc_start
 	include project.plc.cmd.plc_stop

 	include embox.lib.leddrv_gpio
 	include project.plc.examples.blink

После установки нужно запустить скрипт из Embox './scripts/beremiz.sh', указав ему папку с установленным Beremiz

./scripts/beremiz.sh ~/git/beremiz/

Там мы разработали простую программу, которая меняет состояние двух светодиодов на плате через заданный промежуток времени.

В правом углу можно видеть модули embox ( LED_ON & LED_OFF), которые мы использовали для нашей программы

Теперь сгенерируем ST файл

Посмотрим наш ST-код в Embox

На скриншоте ST файл и Mybuild

В Mybuild файле видно, что модуль зависит от matIEC и модулей LED, которые мы экспортировали в Beremiz

Соберем наш образ Embox вместе с разработанной программой. Прошьем его как уже было описано. И запустим нашу программу на исполнение командой ‘plc_start’ Остановить программу можно с помощью команды ‘plc_stop’

Настройка под другие платы на базе К1921ВГ015

Еще один важный момент для создания конечных устройств на микроконтроллере - это адаптация периферии под конкретную плату. Я имею в виду, например, что условные светодиоды могут использовать различные выводы, или частота для устройства будет отличаться от той, которая используется на отладочной плате. В embedded Linux за это отвечает дерево устройств (device tree), меняя которое вы можете использовать один и тот же образ ядра для разных конфигураций платы.

В Embox есть аналогичная технология, позволяющая быстро адаптировать вашу периферию под вашу плату.

Начнем с задания частоты кварцевого генератора.

struct clk_conf clks[] = {
	[0] = {
    	.status = ENABLED,
    	.dev = {
        	.name = "RCU",
        	.regs = {
            	REGMAP("BASE", (RCU_BASE), 0x100),
        	},
        	.clocks = {
            	VAL("HSECLK_VAL", 16000000UL),
        	}
    	},
    	.type = VAL("SYSCLK_PLL", 1),
	},
};

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

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

struct uart_conf uarts[] = {
	[0] = {
    	.status = ENABLED,
    	.name = "UART0",
    	.dev = {
        	.name = "UART0",
        	.regs = {
            	REGMAP("BASE_ADDR", (UART0_BASE), 0x100),
        	},
        	.irqs = {
            	VAL("", PLIC_UART0_VECTNUM),
        	},
        	.pins = {
            	PIN("TX", GPIO_PORT_A, 1, 1),
            	PIN("RX", GPIO_PORT_A, 0, 1),
        	},
        	.clocks = {
            	VAL("", "CLK_UART0"),
        	}
    	},

Ну и наконец, чтобы задавать светодиоды (выводы GPIO настроенные на выход), которые мы использовали в программировании ПЛК описываются тоже очень просто

struct led_conf leds[] = {
	[0] = {
    	.name = "LED1",
    	.port = VAL("", GPIO_PORT_A),
    	.pin = VAL("", 12),
    	.level = VAL("", GPIO_PIN_HIGH),
	},

Демонстрация

На первом видео показано как:

  • Собирать проект;

  • Прошивать плату с помощью openocd и gdb;

  • Управлять светодиодом из консоли;

  • Работать с файловой системой;

На втором видео:

  • Запускаем Beremiz с модулями Embox

  • Загружаем демо программу в Beremiz

  • Генерируем ST-код

  • Собираем embox с нашей программой

  • Запускаем на плате

Заключение

Микроконтроллер  К1921ВГ015 имеет перспективную открытую архитектуру RISC-V, а также ресурсы, отвечающие современным требованиям для построения различного рода цифровых устройств: робототехника, АСУ-ТП, устройства интернета вещей и так далее.  А хорошая поддержка средств разработки, в том числе Embox, позволяют создавать и поддерживать эти устройства быстро и с минимальными трудозатратами.

P.S. Все приведенное в статье можно воспроизвести самостоятельно, все части открытые.

Теги:
Хабы:
+18
Комментарии16

Публикации

Истории

Ближайшие события

11 – 13 февраля
Epic Telegram Conference
Онлайн
27 марта
Deckhouse Conf 2025
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань