|
我不大会写文章,首先还是请大家见谅 : )
前言
大约两年前,我在这里看到有个帖子介绍一个叫做NanoVM(http://www.harbaum.org/till/nanovm/)的项目,它是在AVR上实现了一个简单的JAVA虚拟机。由于我对JAVA很感兴趣,所以极度关注。于是我啃了半个月的馒头,省下一百多的生活费,在OurAvr上买了套M16的最小系统板,正式宣告向JAVA更深领域进军!沮丧的是,我那时才接触到单片机,根本搞不清东南西北,直接死在Make前面,横尸遍野……当然我的热情丝毫未见减,经过一个多月的摸索,对AVR的开发流程和方法有了一个整体的了解,已经能成功的编译出来了!立即下了个自带的LcdDemo进去,哇,成功的运行起来了,虽然显示位置上有些错误,但还是让我兴奋得一夜未眠。什么?让我接着在这上面接着搞开发?别搞笑了,我连它的代码都看不懂,怎么驾驭它呢?
时光飞逝,这两年期间,积累了很多。特别是一年前搞(抄袭?)了叫做JOP(Java优化处理器)的项目,它直接用FPGA搭建了一个JAVA处理器,直接处理JAVA指令码,JAVA Virtual Machine在这应该叫JAVA Real Machine了吧,哈哈~这个项目让我对JAVA虚拟机有了非常理性的认识。还有今年,项目需要,我在ARM9+Linux的环境下,移植了JVM,这有让我对从另一个侧面学习到了JAVA虚拟机的实现,此外让我和Linux有了近距离的接触。
闲下来了一个星期,重拾NanoVM,有了两年的积累,现在看NanoVM格外亲切(汗……),把它的源文件看了一遍,作者(Till Harbaum)功力不浅,它他的代码相当舒服。好,说干就干,我为NanoVM增加了DS1302的本地方法,功夫不负有心人,熬了个通宵,终于成功了……
What is JAVA?
JAVA对大家来说,只不过是一门高级编程语言(Programming Language),但这并不是JAVA的全部,JAVA之所以优秀的原因,是因为它有一个强大的虚拟机支持。好似JAVA虚拟机是根,JAVA编程语言是叶,根繁才能叶茂;而对于大树下乘凉的人来说叶茂就行,而我更愿意把土刨开,看看它的根。本文研究的重点,也是JAVA虚拟机的实现。
What is NanoVM?
首先请大家明确,不同于C或Basic等,NanoVM不是一个JAVA编译器!我们还是用SUN提供的标准的编译器javac,但我们要让生成.class文件在AVR中运行!
大家回想一下为什么JAVA号称“一处编译,到处运行”?这是因为编译出来的文件是对应于JAVA虚拟机的,和各不同的处理器无关,只有在这个处理器上实现JAVA虚拟机,那么这个JAVA程序就能运行。JAVA虚拟机的作用相当于际时链接.class文件。JAVA就不存在像ARM那样交叉编译的概念了。NanoVM的目的正是于此,让跨平台的JAVA跨到AVR上。
当然JAVA虚拟机的设计是按32位或64位处理器来的,AVR的资源实在有限,不能完整实现JAVA虚拟机规范,实际使用的可行性也不大。我觉得它的意义不在于此,它让我们从AVR对角度认识JAVA虚拟机的实现机制。
NanoVM的运行
不同于一般,我们编程(Java)所生成的程序不下到Flash Rom里,而是下到了EEPROM中。那Flash里的是什么呢?这肯定是JAVA虚拟机(即NanoVM)了,上电后JAVA虚拟机开始运行,读取EEPROM中的JAVA程序并且执行。这看似繁琐的过程也是JAVA虚拟机魅力所在。借个官方的图说明这个问题。
![]()
但正如上所述,AVR的资源不足,所以EEPROM保存的并不是.class文件。这又是问什么呢?这需要读者对class文件结构有一定了解。class文件不仅仅包含了JAVA虚拟机的指令码,更多的是譬如JAVA虚拟机版本号、各种常量(如类名方法名等等)和、超类(父类)、接口(Interfaces)、字段(fields)和变量(attributes)等等信息,一个完整的JAVA程序是由多个class文件构成的,AVR的EEPROM中不可能构建一个文件系统,所以把各个class文件结合在一起(这个过程称之为装载和连接)生成最终JAVA虚拟机指令码的工作只能交给有文件系统的OS(Windows?Linux?)来完成,NanoVM中有个专门的工具叫NanoVMTool担以此任。NanoVMTool同样是用JAVA写的,你能在Windows或Linux(或……)下应用自如。
实例
我不是光说不练的那种人(!),下面就引领大家在AVR上运行第一个JAVA程序。
1.安装JDK
废话,搞JAVA开发不安装JAVA开发环境怎么行!你可以到官网(java.sun.com)下个j2se的开发包,嫌速度慢的话可以到各大软件站下载,这东西遍地都是……NanoVM虽然没对JAVA版本有要求,但还是建议用J2SE 1.4的版本,J2SE 1.4比较稳定,最新的J2SE 5和J2SE 6在JAVA语法、class文件结构和AVA虚拟机有细微的变动。似乎NanoVM还没跟上这些变动,当然NanoVM也不对这些变动敏感(哪那么多废话,骗稿费啊,找扁!)。
2.下载NanoVM(已上传)
你可以从sourceforge(http://sourceforge.net/project/showfiles.php?group_id=181239&package_id=209853)下载最新的代码,源码包中有编译好的.hex文件,你不想自己编译的话可以直接用。
3.安装rxtx(已上传)
我们要通过NanoVMTool用串口把我们的JAVA程序下到AVR的EEPROM中(你也可以使用ISP等方式下载,只是我觉得有些麻烦),出于安全性和跨平台的考虑,JAVA是不能直接访问硬件的,但SUN对此定义了标准,由一个叫RXTX(http://www.rxtx.org/)的组织实现,大家可以根据里面Readme中的说明安装,就拷贝几个文件,这里从略。
4.HelloWorld
写一个最简单的Hello.java:
import nanovm.io.*;
import nanovm.avr.*;
class HelloWorld {
public static void main(String[] args) {
//向串口写"Hello World!"
System.out.println("Hello World!");
//向LCD写"Hello World!"。如果你编译NanoVM时在config.h
//中配置了LCD的话,否则会抛出异常,请去掉下面语句
Lcd.clear();
Lcd.gotoYX(0, 0);
Lcd.print("Hello World!");
}
}
把它保存在java\examples\目录下,以方便使用。
5.编译NanoVM
在NanoVM的vm\build\下有不同处理器的编译脚本(Makefile),如avr_mega32_lcd、avr_mega8和avr_mega168等等。这里还有很多以AVR为控制器的(玩具)机器人的脚本,如(乐高的)ctbot和nibo,开来作者更愿意把NanoVM用在玩具机器人上 ^_^
可以把Makefile中的DEFAULT_FILE改成上面Hello,之后make编译,会得到NanoVM.hex和NanoVM_eeprom.hex两个文件,前者是NanoVM虚拟机,下到Flash中,后者是上面所写的JAVA程序,下到EEPROM中。现在就运行吧,有结果没?
6.使用NanoVMTool
当你重新写一个JAVA程序时,是不是用在make一遍?肯定没那么复杂,其实上面make时调用的是NanoVMTool,NanoVMTool能完成装载、连接和下载的功能,你可以运行它来看它的命令帮助。编译还是要交给javac了,如果你还不会编译一个JAVA程序的话,请自行参考相关教程,这里就不展开讲啦。当NanoVMTool装载和连接后,就准备向AVR下载了,把你的AVR通过串口连上PC,重启(复位)AVR,就开始自动下载了,下载完成后自动运行。
此外NanoVM还有Eclips的插件,真正做到集成开发,不用你再敲命令了。
展望
前久坛友推荐的美国以太网比赛,我申请到了套件,准备吧他用到NanoVM之上,实现java.net.*中几个基本的类,再实现javax.servlet.*中的部分类,做一个MiniJSP(Java Server Pages),AVR上跑动态网页服务器,酷吧,哈哈。现在手头上只有M16,空间已经满了,暂告一段落,下步准备用M128(呜呜呜呜,又要啃馒头了),外扩RAM和EEPROM,就该够用了。
如果资源和精力也许的话,我还打算实现java.sql.*,做个MiniBBS。想过OurAvr是架设在AVR上的吗?阿莫下次换服务器时考虑一下我这个天方夜谭的方案吧,搞它十几片AVR单片机做并行处理,慢就慢点,不在乎,玩的就是心跳,酷毙了!
结束语
NanoVM在AVR上实现了一个简单的JAVA虚拟机,对大家理解虚拟机的实现由很大启迪,有兴趣的朋友可以试试,我也在学习探索阶段,大家多多交流,呵呵。
第一次写那么长的东西,估计我毕业论文也不会写那么多。文章从头到尾狗屁不通,希望各路英雄拍砖时手下留情,不要打脸!
最后要感谢我GF对我这两年来休学闭门搞技术的支持;还要感谢OurAvr这个平台,让我学到很多很多……
声明
1.本文作者有对本文进一步修正完善更新的权力。
2.本文首发OurDev.cn,转载务必保持完整性。
3.加酷和回帖一样,是种高尚的美德,哈哈~~~
附:
NanoVM最新公版源代码
点击此处下载nanovm-20070707(文件大小:991K)
rxtx--java串口类
点击此处下载rxtx-2.1-7-bins-r2(文件大小:596K) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|