vm5277, пример компиляции для AVR
О проекте: Пишем один код - собираем на разные 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).



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

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

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

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

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

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

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