О проекте: Пишем один код - собираем на разные 8 бит МК!

https://vm5277.ru - это универсальное решение для embedded-разработки, которое позволяет сократить время создания прошивки для 8 бит микроконтроллеров в разы.

Как это работает?

  • Пишешь код на Java подобном языке (чистое ООП, без головной боли с указателями и не читабельным кодом)
  • Компилятор автоматически генерирует оптимизированный ассемблерный код под выбранную платформу
  • Код работает поверх легковесной RTOS, написанной на ассемблере для максимальной производительности 
  • Ассемблер-сборщик финализирует проект в бинарный файл прошивки

Что входит в решение:

  • Высокоуровневый компилятор с Java подобным синтаксисом
  • Максимально оптимизированная RTOS, целиком на ассемблере для каждой платформы
  • Унифицированные драйвера - один API для UART, SPI, I2C, GPIO на всех МК
  • Стандартные библиотеки (Runtime): Базовые типы данных (Float, String), математические функции (Math), работа с памятью и другие абстракции, не зависящие от платформы.
  • Драйверы верхнего уровня (High-Level Drivers): Унифицированные API для работы с периферийными устройствами: датчиками (I2C/SPI), дисплеями, SD-картами, беспроводными модулями (ESP8266, Bluetooth).

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

  • Скорость разработки: Создавайте функционал на высокоуровневом  языке быстрее, чем на Си
  • Производительность: RTOS и драйверы оптимизированы до уровня чистого ассемблера, экономя каждый байт и такт
  • Переносимость: Переход с AVR на PIC или STM8 - дело нескольких правок, а не изучение и адаптация библиотек

Проект находится на ранней стадии, но я активно над ним работаю. Уже можно видеть, как высокоуровневый код на Java-подобном языке превращается в чистый и эффективный ассемблер! Это ещё не итоговый вариант, но прогресс уже есть.

Что уже работает в этом примере:

  • Наследование интерфейсов: Test implements Number
  • Динамическое выделение памяти: оператор new
  • Полиморфизм: вызов метода через переменную интерфейсного типа (Number.toByte())
  • Проверка типа во время выполнения: оператор is (аналог instanceof)
  • Полноценная работа с объектами: конструкторы, методы, поля.
  • Интеграция с RTOS: вызов системных функций (System.out).
Исходный код custom.j8b
Исходный код custom.j8b
Итоговый ассемблер код(стр. 1, черновой, могут быть ошибки)
Итоговый ассемблер код(стр. 1, черновой, могут быть ошибки)
Итоговый ассемблер код(стр. 2, черновой, могут быть ошибки)
Итоговый ассемблер код(стр. 2, черновой, могут быть ошибки)

Также приведу одну из функций RTOS(код сырой, может содержать ошибки)

vm5277, пример компиляции для AVR

Ключевые фрагменты сгенерированного ассемблерного кода:

1. Метаданные класса:
Компилятор автоматически формирует структуру для поддержки RTTI (Run-Time Type Information), необходимую для instanceof.

vm5277, пример компиляции для AVR

2. Динамическое создание объекта в куче:
Код конструктора new Byte(0x08) транслируется в вызов менеджера динамической памяти (os_dram_alloc) и инициализацию полей.

vm5277, пример компиляции для AVR

3. Проверка типа (is / instanceof):

Оператор if(b1 is Byte) компилируется в вызов процедуры j8bproc_instanceof_nr, которая проверяет метаданные объекта.

vm5277, пример компиляции для AVR

4. Полиморфный вызов метода:

Вызов b1.toByte() через интерфейс Number преобразуется в универсальный механизм поиска и диспетчеризации метода.

vm5277, пример компиляции для AVR

5. Интеграция с системными сервисами:

Вывод в "консоль" (System.out) — это вызов системного сервиса ОСРВ.

vm5277, пример компиляции для AVR


Что это значит?

Это доказывает, что подход vm5277 работоспособен. Мы можем писать на высокоуровневом ООП-языке, а под капотом получать код, который:

  • Эффективно использует память: объекты размещаются в куче, метаданные компактны.
  • Сохраняет производительность: ключевые операции (выделение памяти, проверка типов) вынесены в оптимизированные ассемблерные процедуры.
  • Является переносимым: этот же Java-код, после завершения работы над платформами, сможет работать на PIC и STM8 (ограничений почти нет).