Содержание
- MCU Java Source
- Основные возможности
- Чем программа является и не является
- MCU Java Source — это:
- MCU Java Source не является:
- Поддерживаемые платформы МК / устройства
- AVR
- Элементы исходного кода Java
- Поддерживаемые (уже реализованные)
- Ещё не реализованные
- Не известно, как сделать
- Системные требования
- Как это работает
MCU Java Source
Это кросс-компилятор из языка Java в С, который позволяет писать прошивку для микроконтроллера на Java.
Основные возможности
- Исходный код пишется на Java, а не C.
- Исходный код на Java переводится программой в исходный код на C, который компилируется и прошивается в контроллер. МК (микроконтроллер) ничего не интерпретирует.
- Не нужно вручную работать с регистрами! Пишите, например, timer.setMode(TimerMode.FAST); вместо неудобного TCCR1B |= (1 <
- Установка регистров МК при включении питания делается отдельно в функции init() и сильно оптимизирована.
- Внутренние устройства МК (например, таймеры) представлены как Java объекты.
- Прерывания представлены как слушатели объектов (listeners, например ExternalInterruptListener, TimerCompareListener). Естественно, методы addXxxListener() тоже работают.
- UART использует входящие и исходящие потоки (input and output streams), как привычно в Java.
- Пользовательские объекты
- Удобная документация (Javadoc) для всех доступных объектов и методов (функций).
- Перед переводом исходный код компилируется Java-компилятором. Это предотвращает множество ошибок.
- Для приложений, сильно оптимизированных под конкретный МК, возможно работать с регистрами напрямую, через класс Register , если невозможно сделать требуемое действие другим способом.
- Можно добавить новые МК и даже платформы, если для них существует С-компилятор.
Чем программа является и не является
MCU Java Source — это:
MCU Java Source не является:
- JVM (Java Virtual Machine, виртуальная Java машина) для МК. Весь Java код переводится в C на уровне исходников, потом компилируется в машинный код.
- Инструментом для AVR32 с аппаратной JVM. Эта программа предназначена для простых и дешевых МК.
Поддерживаемые платформы МК / устройства
AVR
Компилятор — avr-gcc (или пакет WinAVR)
Элементы исходного кода Java
Поддерживаемые (уже реализованные)
- final . Примитивные поля с атрибутом final превращаются в #define . Строки и примитивные массивы заносятся в память программ и достаются оттуда во время использования. Никакой ручной работы с памятью программ — всего лишь сделайте поле final!
- Слушатели. Только слушатели прерываний поддерживаются. Слушатели прерываний превращаются в обработчики прерываний.
- Переменные/поля. Только примитивные (и примитивные массивы) переменные переходят в исходный код С, работа с объектами MCU Java source интерпретируется программой, объекты пользователя пока не поддерживаются.
- volatile переходит в исходный код С. Используйте его, когда переменная используется и в фоновой нити (методы init(), start()), и в прерывании.
- byte и boolean типы поддерживаются через typedef unsigned char.
- Ввод/вывод. Классы InputStream и OutputStream используются в UART. Так как кодировщики/декодировщики кодовых страниц (charset, encoding) не вмещаются в МК, используется только кодировка по умолчанию. Поэтому нет классов BufferedReader, BufferedWriter , вместо них используются BufferedInputStream, BufferedOutputStream .
- Объекты пользователя.
- Библиотека внешних устройств (частично):
- Многоразрядный светодиодный индикатор (Multi digit LED display)
- Символьный ЖКИ (Character LCD)
- ЖКИ от Nokia 3310 (Nokia 3310 LCD)
Ещё не реализованные
- Библиотека внешних устройств (частично реализована), таких, как I 2 C EEPROM, датчик температуры.
- Анонимные классы и операторы типа method(new MyListener())
- Static initializers и instance initializers будут добавлены в функцию start()
- @Section аннотация. Будет обозначать, куда помещать константы — во Flash или EEPROM. Сейчас по умолчанию Flash. Например: @Section(Section.EEMEM)
private static final String MESSAGE = «Hello, EEPROM!»; - Двухнитевая модель: фоновая нить и нить прерываний (обработки событий). (Two-threaded model: background thread and interrupt (Event Dispatch) thread). Задачи (Task implements Runnable ) , как в TinyOS 2.0. Задачи будут выполнятся в фоновой нити, а запланировать можно из любого места.
- Симулятор: Java исходник можно скомпилировать и выполнить на компьютере. То есть, программа будет симулироваться.
Не известно, как сделать
- synchronized полнстью игнорируется. Используйте volatile вместо него.
- Исключения. Код на языке С их не поддерживает.
- static полностью игнорируется, поскольку в C это имеет совсем другой смысл.
Системные требования
Как это работает
Исходный код Java компилируется, а также преобразовывается в XML вид (java-ml) с помощью модифицированной версии Java2XML. Потом каждый XML элемент обрабатывается программой MCU Java Source Translator. Все примитивные переменные не изменяются, все объекты переводятся. Для перевода методов, которые работают с регистрами МК, есть отдельный переводчик для каждого МК. Все слушатели преобразовываются в обработчики прерываний. Классы объектов пользователя не обрабатываются через XML, они вызываются через reflection. Результат перевода — XML вид исходного кода на С. Потом исходный код С создается из XML.