mbed LPC1768でJVM
RAMを豪快に使うだけのあそび
前回(RunnableインターフェースでマルチスレッドLチカ - Lynx-EyEDの電音鍵盤 新館)の続き。
JVMをmbedに移植しました。らくちん。mbedいいよmbed。
mbed LPC11U24/LPC1768には2MBのフラッシュがついています。classファイルをTest.claという名前にリネームしてmbedにコピー(←ファイル名が8.3形式にしか対応していない模様)すると、これを逐次解釈します。
↓こちらからフォークしてください。対応mbedはLPC11U24,LPC1768です*1
https://mbed.org/users/lynxeyed_atsu/code/FRDM_RaVem_JVM/
mallocとreallocがメモリーを取得できていないにもかかわらず、NULLを返さないコンパイラが一部にあったので、スタック領域に動的メモリを擬似的に確保するメモリプールマネージメントを実装しています。pool.hをご覧下さい。
今回作ったJVMはスレッドをnewするたびにメモリを動的に確保します。したがってメモリが少ないLPC812、LPC11U24、LPC1114だと1スレッド動作が現実的と言えます。
で、超ご無沙汰してるmbed LPC1768。LPC1768のCPUが使用できるRAMは比較的多いので4スレッドスーバーエコジャナイシステムを作りました。
上記のコードを2箇所修正します。
[device_depend.cpp]の5行目を
#define bc_str_length 2048 // from 32 to 1024
に変更(2048にする)。これはバイトコードをフラッシュからRAMにコピーするための領域です。(2048 = 2キロバイト)
[pool.h]の19行目。
#define pool_size 512 // 256 * (sizeof(int)) = 1kByte
に変更する。これはJVMが使うRAMのヒープ領域です*2。int型(=4バイト)アラインメントしてるので512 x 4 = 2キロバイトです。
コンパイルしてmbedに書き込みます。
Javaのコードの作成
(前回)のSoftBlinkLEDTest.javaを修正します。lpc800.javaも前回を参考に用意しておいてください。
public class SoftBlinkLEDTest implements Runnable{ private int x,y; public SoftBlinkLEDTest(int bit_num, int sleep_time_ms){ x = bit_num; y = sleep_time_ms; } public static void main(String[] args){ SoftBlinkLEDTest LED1 = new SoftBlinkLEDTest(0, 90); // LED1, half-cycle = 90msec SoftBlinkLEDTest LED2 = new SoftBlinkLEDTest(1, 100); // LED2, half-cycle = 100msec SoftBlinkLEDTest LED3 = new SoftBlinkLEDTest(2, 500); // LED3, half-cycle = 500msec SoftBlinkLEDTest LED4 = new SoftBlinkLEDTest(3, 1000); // LED4, half-cycle = 1000msec Thread th1 = new Thread(LED1); Thread th2 = new Thread(LED2); Thread th3 = new Thread(LED3); Thread th4 = new Thread(LED4); th1.start(); th2.start(); th3.start(); th4.start(); } public void run(){ int port_bit = x, time = y; while(true){ try{ Thread.sleep(time); }catch(Exception e){} lpc800.portWrite(port_bit, 1); //System.out.println("LED_on"); try{ Thread.sleep(time); }catch(Exception e){} lpc800.portWrite(port_bit, 0); //System.out.println("LED_off"); } } }
javacコンパイル。
$ javac SoftBlinkLEDTest.java
SoftBlinkLEDTest.classをリネーム
$ mv SoftBlinkLEDTest.class Test.cla
Test.claをmbed LPC1768にコピー。
mbedのマスストレージはこんな感じになってるはず。
リセットボタンを押してスタート。ロードに2,3秒かかります。
↓こんな感じに動作するはず。