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

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


📦 Скачать последнюю версию

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

⚡ ТРОЛЛИМ ХОЛИВАРЩИКОВ — ЖИВОЙ ПРОЕКТ ГОВОРИТ ГРОМЧЕ ДОГМ ⚡

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

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

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

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

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

Цель работы

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

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

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

class Main {
    public static void main() {
		byte port = GPIO.PB5;
		GPIO.modeOut(port);
		while(true) {
		    Thread.sleep(50);
		    GPIO.invert(port);
		}
    }
}

Пример таймера:


class Main {
    static public class Blink implements Timer {
		public void run() {
		    GPIO.invert(GPIO.PB5);
		}
    }

    public static void main() {
		GPIO.modeOut(GPIO.PB5);
		Timer blink = new Blink();

		while(true) {
		    blink.start(100);
		    Thread.sleep(3000);
		    blink.start(30);
		    Thread.sleep(3000);
		}
    }
}

Пример многопоточности:


class Main {
    static public class Th1 implements Thread {
		private byte b;
		public Th1(byte b) {
		    this.b = b;
		}

		public void run() {
		    while(isAlive()) {
		        System.out(b);
		        Thread.sleep(100);
		        b++;
		        if(0==b) GPIO.invert(GPIO.PB5);
		    }
		}
    }

    public static void main() {
		GPIO.modeOut(GPIO.PB5);
		Thread th2 = new Th1(3);
		th2.start();

		while(true) {
		    Thread.sleep(1000);
		    ANSI.setCursor(0,0);
		    ANSI.setColor(2,0);
		    System.showDRAMMap();
		    ANSI.setColor(7,0);
		}
    }
}
📁 Больше примеров: github.com/w5277c/vm5277/tree/main/examples/j8b

Поддержка 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, char, cstr
  • Операторы ветвления (if-else, switch-case)
  • Циклы (for, while, do-while) с поддержкой break/continue и else для for
  • Полноценная система исключений (try-catch) с трассировкой стека
  • Многомерные массивы с автоматическим управлением памятью
  • Статический анализ и оптимизации на этапе компиляции
  • Многопоточность (потоки и таймеры), планируются synchronized, wait(), notify()
  • Методы чтения uptime и генерации псевдослучайных чисел

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

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

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

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

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

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

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

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

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

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

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

Сейчас лучше всего начать знакомство с тулкитом на 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

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

Живой пример: тест производительности в J8B

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

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

class Main {
    // Параметры теста
    static final short ITERATIONS = 1000;
    static final byte BUFFER_SIZE = 64;
    // Тестовый буфер
    static final byte[] TEST_DATA = new byte[BUFFER_SIZE];

    public static void main() {
        System.out("\n=== CRC8 Performance Benchmark ===\n");

        // Инициализация тестовых данных
        for(byte i=0; i<BUFFER_SIZE; i++) {
            TEST_DATA[i] = i;
        }

        // Основной тест с замером времени
        System.out("Running " + ITERATIONS + " iterations on " + BUFFER_SIZE + " bytes...\n");
        int startTime = System.uptimeMs();

        byte result = 0;
        for(short i=0; i<ITERATIONS; i++) {
        	result = Math.crc8(TEST_DATA, BUFFER_SIZE);
        }

        int elapsedMs = System.uptimeMs() - startTime;

        // Результаты
        System.out("\n=== Results ===\n");
        System.out("CRC8 result: " + result + "\n");
        System.out("Total time: " + elapsedMs + " ms\n");
        System.out("Time per iteration: ");

        // Вычисляем время на одну итерацию в микросекундах
        short usPerIter = (short)(elapsedMs * 1000 / ITERATIONS);
       	System.out(usPerIter + " us");

        System.out("\nThroughput: ");
        int kbps = ITERATIONS * BUFFER_SIZE * 1000 / 1024 / elapsedMs;
        System.out(kbps + " KB/sec");

       	System.out("\n=== Done ===\n");
    }
}

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

mvn j8b:build j8b:iflash -Parduino-nano -Dj8b.targetFreq=16.0 -Dj8b.target=avr:atmega328p -Dj8b.targetStdio=PD0/PD1 -Dj8b.softReset=false -Dj8b.bldrApiReuse=true -Dj8b.optimization=size -Dj8b.strict=light -Dj8b.verbose=true
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------< ru.vm5277.j8b.examples:bench_crc8 >------------------
[INFO] Building bench_crc8 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ j8b ]---------------------------------
[INFO]
[INFO] --- j8b:0.2.0:build (default-cli) @ bench_crc8 ---
[INFO] Using toolkit at: /home/kostas/vm5277
[INFO] Main source file: /media/kostas/repos/w5277c/vm5277_local/examples/j8b/bench_crc8/src/Main.j8b
j8b compiler v.0.6.0: Java-like source code compiler for vm5277 Embedded Toolkit
Toolkit path: /home/kostas/vm5277
Parsing /media/kostas/repos/w5277c/vm5277_local/examples/j8b/bench_crc8/src/Main.j8b ...
Parsing done, time:0.076 s
Semantic...
Semantic done, time:0.031 s
Codegen...
Codegen done, time:0.031 s
Compile SUCCESS, warnings:0
Total time:0.234 s

[INFO] Main asm file: /media/kostas/repos/w5277c/vm5277_local/examples/j8b/bench_crc8/prebuild/Main.asm
AVR Assembler v.0.3.2 for vm5277 Embedded Toolkit
Toolkit path: /home/kostas/vm5277
Parsing /media/kostas/repos/w5277c/vm5277_local/examples/j8b/bench_crc8/prebuild/Main.asm

--CODE-----------------------------------
 Start	= 0000, End = 0494, Length = 0495
 -----
 Total	:  1173 words (2346 bytes) 7.2%

parsed: 3487 lines
Assemble SUCCESS, warnings:0
Generated /media/kostas/repos/w5277c/vm5277_local/examples/j8b/bench_crc8/target/arduino-nano/Main_cseg.hex
Total time: 0.195 s

[INFO]
[INFO] --- j8b:0.2.0:iflash (default-cli) @ bench_crc8 ---
[INFO] Using toolkit at: /home/kostas/vm5277
Flasher v.0.3: firmware flasher for vm5277 Embedded Toolkit
Toolkit path: /home/kostas/vm5277
Source: /media/kostas/repos/w5277c/vm5277_local/examples/j8b/bench_crc8/target/arduino-nano/Main_cseg.hex
 ----- Source segments -----
 Start	= 0x0000, Length = 0x092A bytes
 Start	= 0x7BFF, Length = 0x0001 bytes
 -----
 Total	:  2347 bytes 7.4%

Connecting to device: auto detect
Serial port: /dev/ttyUSB0
Connection mode:2 wire mode
Device info:BLDR NORMAL v.01: AVR, sig:001e950f, uid:d092325af5279c00, stdio port:PD0/PD1
Flashing(smart mode)...
 ______________________________________________________________
[wwwwwwwwwwwwwwwwwww-------------------------------------------]
[--------------------------------------------------------------]
[--------------------------------------------------------------]
[-------------------------------------------------------------i]
Success, time: 0.371 s

Rebooting...
Success, time: 0.005 s


Entering interactive mode. Press Esc to exit.

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

=== CRC8 Performance Benchmark ===
Running 1000 iterations on 64 bytes...

=== Results ===
CRC8 result: 142
Total time: 227 ms
Time per iteration: 227 us
Throughput: 275 KB/sec
=== Done ===

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

Поддержка в IntelliJ IDEA IDE

Скриншот IntelliJ IDEA с плагином J8B

IntelliJ IDEA IDE с плагином J8B: подсветка синтаксиса, дерево проекта, конфигурации запуска

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

Плагин находится в черновой версии.
Скачать: vm5277-idea-plugin-1.2.zip.nbm - требует vm5277 не ниже версии 0.3.0!

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

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

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

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

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

Ближайшие задачи

Этап Задачи Срок
Документация и публикация
  • Актуализация документации
  • Публикация на Habr
Q2 2026
Кросс-платформенность
  • Поддержка STM8
  • Игра в качестве демонстрации возможностей
  • Расширение функционала и багфиксинг
Q3 2026
Актуальные новости и последние изменения доступны в репозитории проекта GitHub

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

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

📋 FAQ — ответы на частые вопросы

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