VM5277: Универсальная платформа для embedded-разработки

Язык c Java подобным синтаксисом + RTOS + кросс-платформенные драйверы для 8-битных МК


🚀 Черновая документация, в процессе написания, содержит ошибки!
Полное руководство по созданию первого проекта на J8B

Ключевые преимущества VM5277

Проект находится на ранней, но активной стадии разработки

Проблемы существующих решений

Существующие решения (Arduino, MicroPython) не обеспечивают:

Arduino и MicroPython, несмотря на популярность, имеют ограничения для кросс-платформенной разработки под 8-битные МК:

Цель работы

Создание ООП языка программирования с упрощенным синтаксисом Java

Особенности языка:

Пример класса для GPIO:

class Led {
    private byte pin;
    public Led(byte pin) { this.pin = pin; }
    public void on() { HAL.GPIO.write(pin, HIGH);}
}

Поддержка 8-бит микроконтроллеров различных производителей с единым кодом

Поддерживаемые архитектуры:

Реализация ядер RTOS (для каждого семейства микроконтроллеров) с унифицированным API

Функционал:

Реализация базовых драйверов HAL, PAL

Другие ключевые функции

Механизм отладки на базе half-duplex UART

Преимущества решения

Технологический задел

Использование накопленного опыта

В проекте будут применены(и частично улучшены) решения и архитектурные подходы, отработанные в предыдущих разработках:

JAVRA - Ассемблер для AVR

github.com/w5277c/javra

CORE5277 - RTOS на ассемблере

github.com/w5277c/core5277

5277 - комплексное решение по автоматизации

5277.ru

Текущий статус разработки

Репозиторий проекта: github.com/w5277c/vm5277

Проект находится на стадии активной альфа-разработки.

Что уже реализовано и находится на этапе тестирования:

Полноценный компилятор J8B с Java-подобным синтаксисом:

  • Классы, интерфейсы, методы, конструкторы
  • Поддержка примитивов bool, byte, short, int, fixed (Q7.8), enum
  • Операторы ветвления (if-else, switch-case)
  • Циклы (for, while, do-while) с поддержкой break/continue
  • Полноценная система исключений (try-catch) с трассировкой стека
  • Многомерные массивы с автоматическим управлением памятью
  • Статический анализ и оптимизации на этапе компиляции

AVR ассемблер и кодогенератор:

  • Свой AVR ассемблер с полной поддержкой инструкций ATmega
  • Интеллектуальный кодогенератор с базовой оптимизацией
  • Интеграция с RTOS — плавный переход между высокоуровневым кодом и нативными вызовами

AVR RTOS (ядро системы):

  • Динамическое выделение памяти (куча)
  • Поддержка ATmega168p/ATmega328p (Arduino Uno)
  • Подсистема ввода-вывода (STDIO) через UART с поддержкой одно/двухпроводного режима
  • Программный загрузчик для обновления прошивки
  • Система трассировки исключений
  • Множественные функции конвертации, математики и т.д.

Инструментальная экосистема:

  • j8bf — умная утилита прошивки через UART с поддержкой одно/двухпроводного режима
  • j8bmb — генератор защищённых загрузчиков с аппаратной привязкой
  • Maven-плагин для автоматизации сборки проектов
  • LSP-сервер (в разработке) для поддержки в IDE
  • NetBeans плагин (черновая версия)

Тестирование на реальном железе:

  • В работе тестирование на ATmega168p и ATmega328p (Arduino Uno)
  • Поддержка 1-wire и 2-wire режимов связи
  • Часть уже полноценно работающих примеров из папки examples/j8b/

Что сейчас в разработке:

  • Багфиксинг и оптимизация на основе тестов на реальных устройствах
  • Написание документации и руководств для разработчиков

Старт для экспериментов:

Сейчас лучше всего начать знакомство с тулкитом на ATmega168p или ATmega328p (например, на плате Arduino Uno).
Хотя все инструменты кроссплатформенные (Java), рекомендую начать под GNU Linux (Debian), так как на текущем этапе тулкит тестируется только под Debian.

Живой пример: работа с исключениями в J8B

Вот как выглядит код с обработкой исключений, его сборка и результат выполнения на реальном МК:

Исходный код (exception/Main.j8b):

// Пример работы с исключениями в J8B
class Main {

	exception TestException {
		FIRST,
		SECOND;
	}

	public static void main() {
		final byte b1 = 200;
		byte b2; b2 = 200;
		byte b3; b3=0;
		final byte b4=0;

		System.out("\nСложение с переполнением вне обработчика искючения(статика): "); System.out(b1+100);
		System.out("\nСложение с переполнением вне обработчика искючения(runtime): "); System.out(b2+100);
		try {
			System.out("\nСложение с переполнением в обработчике искючения(статика): "); System.out(b1+100);
		}
		catch(MathOverflowException ex) {
			System.out("MathOverflowException");
		}
		try {
			System.out("\nСложение с переполнением в обработчике искючения(runtime): "); System.out(b2+100);
		}
		catch(MathOverflowException ex) {
			System.out("MathOverflowException");
		}

		System.out("\nДеление на 0 вне обработчика искючения(runtime): "); System.out(b1/b3);

		try {
			System.out("\nДеление на 0 в обработчике искючения(runtime): "); System.out(b1/b3);
		}
		catch(DivByZeroException ex) {
			System.out("DivByZeroException");
		}


		try {
			System.out("\nIOException.throw(): ");
			IOException.throw();
		}
		catch(Exception ex) {
			System.out("IOException");
		}

		System.out("\nОбрабчик MathException для цикла for(byte f=5;;f--):");
		try {
			for(byte f=5;;f--) {
				System.out(f); System.outChar(' ');
			}
		}
		catch(MathException ex) {
			System.out("MathException, typeId:"); System.out(ex.typeId()); System.out(", code:"); System.out(ex.code());
		}

		System.out("\nВызов цепочки методов, последний сгенерирует TestException с кодом CODE_SECOND: ");
		try {
			method1();
		}
		catch(TestException ex) {
			System.out(ex);
		}

		System.out("\nБросаем Runtime исключение - выход из программы с трассировкой исключения: ");
		RuntimeException.throw();

		System.out("\ndone");
	}

	public static void method1() throws TestException  {
		method2();
	}
	public static void method2() throws TestException {
		method3();
	}
	public static void method3() throws TestException {
		method4();
	}
	public static void method4() throws TestException {
		method5();
	}
	public static void method5() throws TestException {
		method6();
	}
	public static void method6() throws TestException {
		method7();
	}
	public static void method7() throws TestException {
		method8();
	}
	public static void method8() throws TestException {
		TestException.throw(TestException.SECOND);
	}
}

Процесс сборки:

kostas@work:~/repos/w5277c/vm5277_local/examples/j8b/exception$ mvn j8b:run -Parduino-uno
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< ru.vm5277.j8b.examples:exception >------------------
[INFO] Building exception 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ j8b ]---------------------------------
[INFO]
[INFO] --- j8b:0.1.0:run (default-cli) @ exception ---
[INFO] === J8B Maven plugin  - RUN ===
[INFO] Using toolkit at: /home/kostas/vm5277
[INFO] Main source file: /media/kostas/repos/w5277c/vm5277_local/examples/j8b/exception/src/Main.j8b
Compile SUCCESS, warnings:0
Assemble SUCCESS, warnings:0
;j8b flasher: firmware flasher for vm5277 Embedded Toolkit
;Version: 0.2 | License: Apache-2.0
;================================================================
;WARNING: This project is under active development.
;The primary focus is on functionality; testing is currently limited.
;Please report any bugs found to: konstantin@5277.ru
;================================================================
Toolkit path: /home/kostas/vm5277
Source: /media/kostas/repos/w5277c/vm5277_local/examples/j8b/exception/target/arduino-uno/Main_cseg.hex
 ----- Source segments -----
 Start	= 0x0000, Length = 0x0954 bytes
 Start	= 0x7BFF, Length = 0x0001 bytes
 -----
 Total	:  2389 bytes 7.5%

Connecting to device: auto detect
Serial port: /dev/ttyUSB0
Connection mode:2 wire mode
Device info:BLDR NORMAL v.00: AVR, sig:001e950f, uid:6e19fb01efa9fda1
Flashing(smart mode)...
 ______________________________________________________________
[wiiwwwwwwwwwwwwwwww-------------------------------------------]
[--------------------------------------------------------------]
[--------------------------------------------------------------]
[-------------------------------------------------------------i]
Success, time: 0.351 s

Rebooting...
Success, time: 0.005 s

Entering interactive mode. Press Ctrl+C to exit.

Выполнение на ATmega328p (Arduino Uno):

Сложение с переполнением вне обработчика искючения(статика): 44
Сложение с переполнением вне обработчика искючения(runtime): 44
Сложение с переполнением в обработчике искючения(статика): MathOverflowException
Сложение с переполнением в обработчике искючения(runtime): MathOverflowException
Деление на 0 вне обработчика искючения(runtime): 255
Деление на 0 в обработчике искючения(runtime): DivByZeroException
IOException.throw(): IOException
Обрабчик MathException для цикла for(byte f=5;;f--):5 4 3 2 1 0 MathException, typeId:6, code:0
Вызов цепочки методов, последний сгенерирует TestException с кодом CODE_SECOND:
Stacktrace for TestException, code:SECOND
Main.j8b:118 TestException.throw(byte)
Main.j8b:115 Main.method8()
Main.j8b:112 Main.method7()
Main.j8b:109 Main.method6()
Main.j8b:106 Main.method5()
Main.j8b:103 Main.method4()
Main.j8b:100 Main.method3()
Main.j8b:97 Main.method2()
Main.j8b:84 Main.method1()
End stacktrace

Бросаем Runtime исключение - выход из программы с трассировкой исключения:
Stacktrace for RuntimeException, code:0
Main.j8b:91 RuntimeException.throw()
End stacktrace

Что демонстрирует этот пример:

Поддержка в NetBeans IDE

Скриншот NetBeans IDE с плагином J8B

NetBeans IDE с плагином J8B: подсветка синтаксиса, дерево проекта

Возможности плагина в релизе:

Плагин находится в черновой версии и плохо оттестирован.
Скачать: nb-lsp-plugin-0.1.nbm

Ближайшие задачи (будет актуализировано позже)

Этап Задачи Срок
Бета компилятора и RTOS Core
  • Реализация недостающих языковых конструкций
  • Добавление runtime проверок безопасности
  • Планировщик задач для AVR
  • Базовые драйверы HAL
  • Документация
Q1 2026
Кросс-платформенность
  • Поддержка PIC/STM8
  • Унифицированные API
Q2 2026
Актуальные новости и последние изменения доступны в репозитории проекта GitHub

Инструментальная поддержка

В виде фоновой задачи, для удобства разработки планируется реализация LSP-сервера с:

Обсуждение проекта: Telegram | Контакты: konstantin@5277.ru