`
爱迪生的小屋
  • 浏览: 36367 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在Arduino上用Java编程-序

阅读更多

在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呢?求推荐!

分享到:
评论
2 楼 jianwwpro 2013-09-28  

希望继续研究
1 楼 303931362 2013-09-23  
为什么我测试不行呢?

相关推荐

    BabyCARE-Arduino-Java-Source-Code:BabyCARE arduino + java项目-java project source code

    【标题】"BabyCARE-Arduino-Java-Source-Code:BabyCARE arduino + java项目-java project source code" 提供的是一个结合了Arduino硬件平台与Java软件开发的婴儿护理项目的源代码。这个项目旨在利用Arduino的实时...

    arduino-1.8.9版本

    5. **驱动程序**: `drivers`目录包含了安装在计算机上与Arduino板通信所需的USB驱动程序。这些驱动程序使得计算机能够识别并连接到Arduino板进行数据传输。 6. **示例代码**: `examples`目录通常包含了大量的示例...

    arduino-1.8.13-windows.zip

    Arduino IDE使得编写代码和将代码上传到板上变得容易。它运行在Windows、Mac OS...学习者在使用工具包和探索每个板的创造性能力时,以实际操作和建设性的方式探索程序。无论你是一个电子学的新老师,想把物理计算和计算

    arduino-1.6.5-r3-macosx

    arduino开发工具(又叫arduino IDE),是一个用来编写arduino程序的软件...Arduino,是一个基于开放原始码的软硬体平台,构建于开放原始码simple I/O介面版,并且具有使用类似Java,c语言的Processing/Wiring开发环境。

    arduino-1.8.5-windows.zip

    Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。...你只要在IDE中编写程序代码,将程序上传到Arduino电路板后,程序便会告诉Arduino电路板要做些什么了。

    Arduino-SerialRead-Java:如何使用 Java 应用程序与 Arduino 板通信

    ##Intro## 在这个例子中,我将展示如何使用 Java 应用程序读取 Arduino 板发送的数据。 Arduino 板详细说明一个随机数并通过串行端口打印数据。 Java 应用程序旨在查找 Arduino 连接的 COM 端口,在 Arduino 和您的...

    RFID-ARDUINO-JAVA.rar_java RFID_rfid_usefull75

    标题中的"RFID-ARDUINO-JAVA.rar_java RFID_rfid usefull75"表明这是一个关于使用Java编程与RFID(无线频率识别)技术相关的项目,可能涉及到将RFID读卡器与Arduino微控制器集成,并利用Java进行数据处理。...

    arduino---processing.

    实践项目可以包括:用Arduino读取光照强度并显示在Processing的图表上,或者通过Arduino控制的按钮来控制Processing中的游戏元素。 总之,Arduino 和 Processing 的结合为创新和实验提供了无限可能性,无论是对技术...

    Arduino-Java-Follower-Line-PID:用于组件测试和线性跟随器 PID 控制调整的 GUI 图形界面

    通过这个项目,用户可以学习到如何使用Arduino进行硬件控制,理解PID控制理论,以及如何用Java构建与硬件交互的GUI应用,同时掌握实时系统调试和参数优化的方法。对于电子工程、自动化或机器人技术的学习者来说,这...

    android-arduino-object-tracking-robot:自动从code.google.compandroid-arduino-object-tracking-robot导出

    摄像机安装在机器人上的伺服器上,可以使摄像机平移和倾斜。 几种图像处理技术用于检测图像中被跟踪对象的位置。 在我们的项目中,有两个Android应用程序。 其中一个使用基于颜色的跟踪方法,另一个使用基于模板的...

    树莓派4B 可用的arduino程序

    5. **编程流程**:在树莓派上,用户首先需要安装这个定制的Arduino IDE,然后选择合适的硬件板类型(如Wemos D1),导入所需的库,编写代码,最后通过USB连接将程序上传到Arduino或ESP8266设备。 通过这样的设置,...

    java-arduino-serial

    标题 "java-arduino-serial" 指的是一项利用Java编程语言与Arduino硬件进行串行通信的项目。在Java世界中,与硬件交互通常需要特定的库或API,这个项目可能提供了一个这样的接口,使得开发者可以方便地用Java编写...

    arduino-1.0.6-windows

    Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。...你只要在IDE中编写程序代码,将程序上传到Arduino电路板后,程序便会告诉Arduino电路板要做些什么了。

    SerialMQTTGateway:Java串行到MQTT网关+ Arduino演示程序+ Node-RED演示流程JSON配置

    这是一个Java NetBeans项目,已使用Open JDK 1.8.0_151进行了编译,并已在Ubuntu Linux 16.04.5 LTS x64,在运行网关的计算机上插入Arduino Duemilanove以及在第三方计算机上运行的Mosquitto MQTT代理中进行了测试...

    基于Arduino硬件的EEPROM/EPROM编程器_java_代码_下载

    目前,我们在 PCB 上有一个工作原型,它使用 Arduino Nano 和可以直接插入 Arduino Uno 的 Arduino-shield。 Arduino 固件提供了一个带有简单命令的串行接口,用于在主机和 eeprom 之间传输数据。 对于主机,可以...

    arduinoWebSockets-master_websocket_

    综上所述,这个项目涵盖了WebSocket协议的基础,Arduino编程,以及WebSocket在物联网中的应用,为开发者提供了一种在Arduino上实现实时双向通信的解决方案。通过学习和理解这些知识点,开发者可以创建出更加智能化和...

    btdroid-arduino:arduino-android-蓝牙

    这个项目的核心是利用Java编程语言开发Android应用程序,以便控制配备蓝牙模块的Arduino硬件。 【描述】"btdroid-arduino"项目描述了如何使用Android设备(手机或平板电脑)作为控制器,通过蓝牙协议与Arduino板...

Global site tag (gtag.js) - Google Analytics