ki 2013-04-26
一直想在软件世界之外做点硬件的研究。最近对开源硬件arduino生产了兴趣,搭了一些实验系统,也用c++写了一些简单的程序。虽然对于程序员来说,应该不拘泥于使用何种语言,但必竟java还是我最熟悉的语言,于是就有了一个想法,可不可以在arduino芯片上执行java代码?
首先,当然网上找现成的,找到一个项目NanoVM,一个可以在Atmega8芯片上用的jvm,但是有几点要改造,一是NanoVM是以引导程序bootloader方式烧录的,必然会和arduino本身的引导程序生产冲突。二是NanoVM的class文件需要保存在eeprom里,只有1k的空间,完全不够使用。
如果不想自己去改NanoVM的代码,那只有自己开发一途,正好我一直要找一个项目去深入研究一下jvm的机制,两个目的不谋而和,就算不成功,也可以在这两个领域积累不少经验。
要达成在arduino上执行java代码有三种方法:一是解释执行,我有成功写过java解释器,但是要在单片机的环境下写java解释器,资源不够是一个大问题,所以基本不考虑。二是把java代码翻译成c++代码再用gcc编译,这似乎是一个可行的办法。三是和NanoVM一样,写一个微型的jvm执行class里的byte code。
暂时决定采用第三种方法,自己DIY JVM。
现在正在做的事情:
1. 看JVM规范,学习class文件的结构,以及程序操作码的执行过程
2. 通过javacc定义和解析ClassFile结构,自动生成读取class文件的代码(Java代码)
目标要做到的事情:
3. 在PC的java平台实现自己的jvm执行class文件中的程序代码
4. 将读取class文件和jvm移植到arduino的c++平台上
5. 将一些arduino的库通过java实现一份
6. 将class文件保存在sd卡供jvm读取
7. 考虑在sd上实现虚似内存以弥补芯片的内存不足
现在就想到这么多,先写这些,能不能做到还不好说,过程愉快足矣。
PS. 在看《Java虚拟机规范(Java SE 7)》的过程中,意外发现其中一名译者@langyu竟然是以前土豆的同事,哈哈,这也是激起我开这个博客的直接动力
第三步:通过 arduino 软件选择对应的网络端口就可以进行固件更新了,不过更新的时候要注意不能将 Arduino.begin() 和 ArduinoOTA.handle() 这两个关键函数给更新掉