Lynx-EyEDの電音鍵盤 新館

制御とか数学とか駄文とか

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のマスストレージはこんな感じになってるはず。
f:id:Lynx-EyED:20130830001204p:plain
リセットボタンを押してスタート。ロードに2,3秒かかります。
↓こんな感じに動作するはず。

*1:最近mbedに追加された他のデバイス、たとえばLPC1114,KL25Zなどは今までLPC812で行っていた時と同様にバイトコードを配列変換すれば動作するはずです。余力のある方はraven.cpp/device_depend.cppを変更してください

*2:前述した通り、スタック領域に擬似的に形成してます