Язык c Java подобным синтаксисом + RTOS + кросс-платформенные драйверы для 8-битных МК
🚀 Черновая документация, в процессе написания, содержит ошибки!
Полное руководство по созданию первого проекта на J8B
Проект находится на ранней, но активной стадии разработки
Существующие решения (Arduino, MicroPython) не обеспечивают:
Arduino и MicroPython, несмотря на популярность, имеют ограничения для кросс-платформенной разработки под 8-битные МК:
Особенности языка:
Пример класса для 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
bool, byte, short, int, fixed (Q7.8), enum, char, cstrif-else, switch-case)for, while, do-while) с поддержкой break/continue и else для fortry-catch) с трассировкой стекаexamples/j8b/
Сейчас лучше всего начать знакомство с тулкитом на ATmega168p или ATmega328p (например, на плате Arduino Uno).
Хотя все инструменты кроссплатформенные (Java),
рекомендую начать под GNU Linux (Debian), так как на текущем этапе
тулкит тестируется только под Debian.
Вот как выглядит код с обработкой исключений, его сборка и результат выполнения на реальном МК:
// Пример работы с исключениями в 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.
Сложение с переполнением вне обработчика исключения(статика): 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
Что демонстрирует этот пример:
try-catchВот как выглядит код подсчета CRC8, его сборка и результат выполнения на реальном МК:
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.
=== 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 с плагином J8B: подсветка синтаксиса, дерево проекта, конфигурации запуска
Возможности плагина в релизе:
Плагин находится в черновой версии.
Скачать:
vm5277-idea-plugin-1.2.zip.nbm - требует vm5277 не ниже версии 0.3.0!
NetBeans IDE с плагином J8B: подсветка синтаксиса, дерево проекта
Возможности плагина в релизе:
Плагин находится в черновой версии и плохо оттестирован.
Скачать:
nb-plugin-0.1.nbm
| Этап | Задачи | Срок |
|---|---|---|
| Документация и публикация |
|
Q2 2026 |
| Кросс-платформенность |
|
Q3 2026 |
В виде фоновой задачи, для удобства разработки планируется реализация LSP-сервера с:
VS Code, Kate и вероятно IntelliJ
📋 FAQ — ответы на частые вопросы
Обсуждение проекта: Telegram | Контакты: konstantin@5277.ru, w5277c@gmail.com