在Arduino上用Java编程
序
继两个星期前成功实现了java版JVM bytecode解释器TotoroVM(见:http://edisonlovecola.iteye.com/blog/1860545)之后,边着手在arduino平台上实现它c++版,边更新博客(由于忙着实现功能,拖延了更新,以后补上这部分内容)。写完了解释器的代码解释部分,就遇到了从class文件从哪里读取的问题。
Arduino Uno存储分为2K的RAM,1K的EEPROM和32K的Flash,根据java版解释器的经验,一套基本的java框架,至少包含Object, Class, String类,再加上系统功能调用的System和Arduino类,怎么说都不可能压缩到2K内存以下。也考虑过用SD卡来当外存在保存,细想一下,又会有读取速度和通用性的瓶颈,就在我设法压缩ConstantPool大小的过程中。一个新的想法诞生-何不干脆就放弃保存ConstantPool,将它的信息固化到代码中,再进一步,就是直接把java的bytecode直接编译成c++代码,再用avr-gcc进行二次编译,这样还可以充分利用avr-gcc的优化功能。
考虑之后,觉得这个方法可行,经过两个星期的努力,今天TotoroVM Compile版正式诞生。
先试编译一个简单的Arduino程序,类似Blink程序,让13号led灯一秒闪一次:
Main程序代码
package console; import arduino.Arduino; import arduino.Serial; public class Main extends Arduino { public Main() { pinMode(13, OUTPUT); } private boolean v = false; public void loop() { digitalWrite(13, v = !v); delay(1000); } public static void main(String[] args) { new Main().start(); } }
Arduino基本类:
package arduino; public abstract class Arduino { public static final int HIGH = 1; public static final int LOW = 0; public static final int INPUT = 0; public static final int OUTPUT = 1; public static final int INPUT_PULLUP = 2; public static final int SS = 10; public static final int MOSI = 11; public static final int MISO = 12; public static final int SCK = 13; public static final int SDA = 18; public static final int SCL = 19; public static final int LED_BUILTIN = 13; public static final int A0 = 14; public static final int A1 = 15; public static final int A2 = 16; public static final int A3 = 17; public static final int A4 = 18; public static final int A5 = 19; public static final int A6 = 20; public static final int A7 = 21; public static native void init(); public static native void pinMode(int pin, int mode); public static native void digitalWrite(int pin, boolean val); public static native boolean digitalRead(int pin); public static native void analogReference(int mode); public static native int analogRead(int pin); public static native void analogWrite(int pin, int val); public static native long millis(); public static native long micros(); public static native void delay(long ms); public static native void delayMicroseconds(int ms); public static native long pulseIn(int pin, int state, long timeout); public static native void shiftOut(int dataPin, int clockPin, int bitOrder, byte val); public static native byte shiftIn(int dataPin, int clockPin, int bitOrder); public Arduino() { init(); } public void loop() {} public void start() { for(;;) loop(); } }
编译结果:
#include "console_Main.h" // console/Main.<implements>() jboolean console_Main__implements_(jreference clz) { return arduino_Arduino__implements_(clz); } // console/Main.<extends>() jboolean console_Main__extends_(jreference clz) { if (clz == 72) return 1; return arduino_Arduino__extends_(clz); } // console/Main.<functions>() vfunc console_Main__functions_(jint index) { if (index == 1) return console_Main_loop__V; return arduino_Arduino__functions_(index); } // console/Main.<interface functions>() vfunc console_Main__interface_functions_(jreference intf, jint index) { return arduino_Arduino__interface_functions_(intf, index); } // console/Main.<init>()V void console_Main__init___V() { jint vi = si - 1; si = vi + 1; _0: // ALOAD_0 apush(avalv(0)); _1: // INVOKESPECIAL arduino_Arduino__init___V(); _4: // ALOAD_0 apush(avalv(0)); _5: // ICONST_0 ipush(0); _6: // PUTFIELD tmp1.z = zpop(); tmp2.a = apop(); field_z_console_Main_v(tmp2.a) = tmp1.z; _9: // BIPUSH ipush(13); _11: // ICONST_1 ipush(1); _12: // INVOKESTATIC arduino_Arduino_pinMode_II_V(); _15: // RETURN si = vi; return; } // console/Main.loop()V void console_Main_loop__V() { jint vi = si - 1; si = vi + 1; _0: // BIPUSH ipush(13); _2: // ALOAD_0 apush(avalv(0)); _3: // ALOAD_0 apush(avalv(0)); _4: // GETFIELD tmp1.a = apop(); zpush(field_z_console_Main_v(tmp1.a)); _7: // IFEQ if (! (ipop() == 0) ) { _10: // ICONST_0 ipush(0); _11: // GOTO goto _15; } _14: // ICONST_1 ipush(1); _15: // DUP_X1 dups(0, 1); dups(1, 2); dups(2, 0); si++; _16: // PUTFIELD tmp1.z = zpop(); tmp2.a = apop(); field_z_console_Main_v(tmp2.a) = tmp1.z; _19: // INVOKESTATIC arduino_Arduino_digitalWrite_IZ_V(); _22: // LDC2_W lpush(1000); _25: // INVOKESTATIC arduino_Arduino_delay_J_V(); _28: // RETURN si = vi; return; } // console/Main.main([Ljava/lang/String;)V void console_Main_main__Ljava_lang_String__V() { jint vi = si - 1; si = vi + 1; _0: // NEW apush(allocateInstance(72, 1)); _3: // DUP dups(0, 1); si++; _4: // INVOKESPECIAL console_Main__init___V(); _7: // INVOKEVIRTUAL getVirtualFunction(avals(1), 2)(); _10: // RETURN si = vi; return; }
在电脑上Windows系统中以MinGW编译通过,回家后实战测试Arduino平台!
放上编译结果的C++项目,MinGW和cygwin的gcc应该都可以用。
打算再过一段时候和java版翻译器一起开源,sourceforge还是github呢?求推荐!
相关推荐
【标题】"BabyCARE-Arduino-Java-Source-Code:BabyCARE arduino + java项目-java project source code" 提供的是一个结合了Arduino硬件平台与Java软件开发的婴儿护理项目的源代码。这个项目旨在利用Arduino的实时...
5. **驱动程序**: `drivers`目录包含了安装在计算机上与Arduino板通信所需的USB驱动程序。这些驱动程序使得计算机能够识别并连接到Arduino板进行数据传输。 6. **示例代码**: `examples`目录通常包含了大量的示例...
Arduino IDE使得编写代码和将代码上传到板上变得容易。它运行在Windows、Mac OS...学习者在使用工具包和探索每个板的创造性能力时,以实际操作和建设性的方式探索程序。无论你是一个电子学的新老师,想把物理计算和计算
arduino开发工具(又叫arduino IDE),是一个用来编写arduino程序的软件...Arduino,是一个基于开放原始码的软硬体平台,构建于开放原始码simple I/O介面版,并且具有使用类似Java,c语言的Processing/Wiring开发环境。
Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。...你只要在IDE中编写程序代码,将程序上传到Arduino电路板后,程序便会告诉Arduino电路板要做些什么了。
##Intro## 在这个例子中,我将展示如何使用 Java 应用程序读取 Arduino 板发送的数据。 Arduino 板详细说明一个随机数并通过串行端口打印数据。 Java 应用程序旨在查找 Arduino 连接的 COM 端口,在 Arduino 和您的...
标题中的"RFID-ARDUINO-JAVA.rar_java RFID_rfid usefull75"表明这是一个关于使用Java编程与RFID(无线频率识别)技术相关的项目,可能涉及到将RFID读卡器与Arduino微控制器集成,并利用Java进行数据处理。...
实践项目可以包括:用Arduino读取光照强度并显示在Processing的图表上,或者通过Arduino控制的按钮来控制Processing中的游戏元素。 总之,Arduino 和 Processing 的结合为创新和实验提供了无限可能性,无论是对技术...
通过这个项目,用户可以学习到如何使用Arduino进行硬件控制,理解PID控制理论,以及如何用Java构建与硬件交互的GUI应用,同时掌握实时系统调试和参数优化的方法。对于电子工程、自动化或机器人技术的学习者来说,这...
摄像机安装在机器人上的伺服器上,可以使摄像机平移和倾斜。 几种图像处理技术用于检测图像中被跟踪对象的位置。 在我们的项目中,有两个Android应用程序。 其中一个使用基于颜色的跟踪方法,另一个使用基于模板的...
5. **编程流程**:在树莓派上,用户首先需要安装这个定制的Arduino IDE,然后选择合适的硬件板类型(如Wemos D1),导入所需的库,编写代码,最后通过USB连接将程序上传到Arduino或ESP8266设备。 通过这样的设置,...
标题 "java-arduino-serial" 指的是一项利用Java编程语言与Arduino硬件进行串行通信的项目。在Java世界中,与硬件交互通常需要特定的库或API,这个项目可能提供了一个这样的接口,使得开发者可以方便地用Java编写...
Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。...你只要在IDE中编写程序代码,将程序上传到Arduino电路板后,程序便会告诉Arduino电路板要做些什么了。
这是一个Java NetBeans项目,已使用Open JDK 1.8.0_151进行了编译,并已在Ubuntu Linux 16.04.5 LTS x64,在运行网关的计算机上插入Arduino Duemilanove以及在第三方计算机上运行的Mosquitto MQTT代理中进行了测试...
目前,我们在 PCB 上有一个工作原型,它使用 Arduino Nano 和可以直接插入 Arduino Uno 的 Arduino-shield。 Arduino 固件提供了一个带有简单命令的串行接口,用于在主机和 eeprom 之间传输数据。 对于主机,可以...
综上所述,这个项目涵盖了WebSocket协议的基础,Arduino编程,以及WebSocket在物联网中的应用,为开发者提供了一种在Arduino上实现实时双向通信的解决方案。通过学习和理解这些知识点,开发者可以创建出更加智能化和...
这个项目的核心是利用Java编程语言开发Android应用程序,以便控制配备蓝牙模块的Arduino硬件。 【描述】"btdroid-arduino"项目描述了如何使用Android设备(手机或平板电脑)作为控制器,通过蓝牙协议与Arduino板...