最近在研究Java虚拟机移植到单片机上,今天已经初步完成。接下来整理下代码,准备过些日子与大家见面!

         硬件环境:STM32F429DISCovery

         开发工具:em::Blocks(Code::Blocks衍生版本) + arm-none-eabi-gcc+ IntelliJ IDEA + jdk

         系统环境:圆景V1.7.8, 已经集成Java虚拟机


一、编译系统内核:


java与单片机通信 单片机能用java_java与单片机通信



内核大小为占用约75K FLASH,8K RAM。将其余FLASH空间用于应用程序和文件系统,其余的RAM用于内存管理。

         下载内核到开发板,终端显示欢迎界面

java与单片机通信 单片机能用java_stm32_02

键入ps、free查询系统基本信息

java与单片机通信 单片机能用java_java_03


ps命令显示内核已经包含了6个基本任务线程。

         基本指令运行至少占用64字节的内存管理空间。

二、在IntelliJ IDEA 新建一个HelloJava工程。新建一个HelloJava类,做最简单的Hello world!输出

java与单片机通信 单片机能用java_虚拟机_04



将编译好的java文件下载到系统缓存当中去

java与单片机通信 单片机能用java_虚拟机_05


下载完成后执行adoj -x命令从Ram中执行Java程序

java与单片机通信 单片机能用java_java与单片机通信_06

Java程序执行完毕。



三、高级应用。

         由于内核只为虚拟机提供一个基本输出函数,如果我们需要更多的IO功能,就需要在应用程序中注册函数。

         在应用程序中写一个随机数(RNG)驱动函数,

java与单片机通信 单片机能用java_java与单片机通信_07

注册到本地函数组当中去:

java与单片机通信 单片机能用java_虚拟机_08

应用程序会注册一个Ext Task的任务

java与单片机通信 单片机能用java_单片机_09

将应用程序编译


将编译好的应用程序下载到FLASH中去

java与单片机通信 单片机能用java_java_10

再新建一个Lucky Java项目

java与单片机通信 单片机能用java_虚拟机_11

输入一个简易的幸运星程序,如果获取的随机数对100求模等于88就是幸运数。

java与单片机通信 单片机能用java_虚拟机_12


编译后下到系统RAM中,此时如果执行该java程序,系统会提示有相关的本地函数无法找到

java与单片机通信 单片机能用java_stm32_13

装载刚才编译好的应用程序,装载rand函数,此时,我们可以查到系统已经多了一个刚才提到到Ext Task任务

java与单片机通信 单片机能用java_java与单片机通信_14

装载刚才编译好的Java程序,大概过了一会儿,输出提示已经捕捉到幸运数

java与单片机通信 单片机能用java_java_15

输入ps和free查看线程和内存使用状况:

java与单片机通信 单片机能用java_java_16

可以输入kill 7 将线程卸载掉,再输入ps和free可以看到刚刚申请的的资源已经全部释放掉了

java与单片机通信 单片机能用java_java与单片机通信_17

为了提高幸运指数,一方面可以缩短Sleep时间,另外一方面可以增加一个Java线程挖掘幸运数,现在我们采取第二种方法,增加一个luckThread类

java与单片机通信 单片机能用java_java与单片机通信_18


main函数里面new 一个luckThread类(当然,也可以多new几个)


java与单片机通信 单片机能用java_虚拟机_19



下载到ram里面去执行


java与单片机通信 单片机能用java_java_20



四、固化到文件系统中执行

         刚才的程序是保存在RAM中,意味着我们每次上电都要重新加载程序。现在将Lucky.adoj固化到文件系统中,下载到FLASH空间:


java与单片机通信 单片机能用java_虚拟机_21



复位后查询文件系统,发现了新增的Lucky.adoj文件


java与单片机通信 单片机能用java_stm32_22



加载Lucky程序,对于在文件系统的应用,如果没有上程序锁,可以重复装载,效果如下所示:

java与单片机通信 单片机能用java_java与单片机通信_23

java与单片机通信 单片机能用java_java_24


后记,开发板上带有一片LCD,将来刚好可以移植一些简单游戏上去。

java与单片机通信 单片机能用java_单片机_25