最近在研究Java虚拟机移植到单片机上,今天已经初步完成。接下来整理下代码,准备过些日子与大家见面!
硬件环境:STM32F429DISCovery
开发工具:em::Blocks(Code::Blocks衍生版本) + arm-none-eabi-gcc+ IntelliJ IDEA + jdk
系统环境:圆景V1.7.8, 已经集成Java虚拟机
一、编译系统内核:
内核大小为占用约75K FLASH,8K RAM。将其余FLASH空间用于应用程序和文件系统,其余的RAM用于内存管理。
下载内核到开发板,终端显示欢迎界面
键入ps、free查询系统基本信息
ps命令显示内核已经包含了6个基本任务线程。
基本指令运行至少占用64字节的内存管理空间。
二、在IntelliJ IDEA 新建一个HelloJava工程。新建一个HelloJava类,做最简单的Hello world!输出
下载完成后执行adoj -x命令从Ram中执行Java程序
Java程序执行完毕。
三、高级应用。
由于内核只为虚拟机提供一个基本输出函数,如果我们需要更多的IO功能,就需要在应用程序中注册函数。
在应用程序中写一个随机数(RNG)驱动函数,
注册到本地函数组当中去:
应用程序会注册一个Ext Task的任务
将应用程序编译
将编译好的应用程序下载到FLASH中去
再新建一个Lucky Java项目
输入一个简易的幸运星程序,如果获取的随机数对100求模等于88就是幸运数。
编译后下到系统RAM中,此时如果执行该java程序,系统会提示有相关的本地函数无法找到
装载刚才编译好的应用程序,装载rand函数,此时,我们可以查到系统已经多了一个刚才提到到Ext Task任务
装载刚才编译好的Java程序,大概过了一会儿,输出提示已经捕捉到幸运数
输入ps和free查看线程和内存使用状况:
为了提高幸运指数,一方面可以缩短Sleep时间,另外一方面可以增加一个Java线程挖掘幸运数,现在我们采取第二种方法,增加一个luckThread类
main函数里面new 一个luckThread类(当然,也可以多new几个)
下载到ram里面去执行
四、固化到文件系统中执行
刚才的程序是保存在RAM中,意味着我们每次上电都要重新加载程序。现在将Lucky.adoj固化到文件系统中,下载到FLASH空间:
复位后查询文件系统,发现了新增的Lucky.adoj文件
加载Lucky程序,对于在文件系统的应用,如果没有上程序锁,可以重复装载,效果如下所示:
后记,开发板上带有一片LCD,将来刚好可以移植一些简单游戏上去。