JAVAでbcm2835ライブラリを動かしてみた(その2 仕切り直し) [Raspberry Pi]
(2013.08.30)
/dev/memのmmap処理を欠いたまま、bcm2835のシェアド・ライブラリをJAVAから呼び出す試みは失敗に終わりました。しかし、立ち直りの早いところが親族SNS管理人の強みです。
¥(^_^) <==懲りない奴
未だ、Raspberry piのGPIO制御を実際に試していなかったので、bcm2835ライブラリにblink.cを組み込んで、動かしてみました。
$ sudo bcm2835_blink
LEDが点滅している
これをユーザー・モードで起動できるように修正します。
$ sudo chown root:root bcm2835_blink
$ sudo chmod 4755 bcm2835_blink
$ ls -al bcm2835_blink
-rwsr-xr-x 1 root root 16275 8月 29 15:12 bcm2835_blink
$ bcm2835_blink
動きました。
(パチパチパチ~)
bcm2835_blinkを子プロセスから起動し、終了させるプログラム(<==bcm_interface.c)を書きました。
さらに、共有メモリを設けて、その上で二つのリング・バッファを動かして、bcm2835_blinkとbcm_interface間で通信できるようにしました。
$ dd if=/dev/zero of=/tmp/shm bs=4096 count=1
$ bcm_interface /tmp/shm
これで以下のことが出来るようになりました。
(1)ユーザ・モードで起動したプログラムからbcm2835ライブラリ関数を呼び出して、GPIOを制御する。
(2)そのプログラムを子プロセスとして起動する。
(3)共有メモリを設定して、二つのプロセス間で通信する。
”JAVAからbcm2835ライブラリを呼び出す”ための道具立ては揃ったように思うのですが・・・
どうでしょう?
/dev/memのmmap処理を欠いたまま、bcm2835のシェアド・ライブラリをJAVAから呼び出す試みは失敗に終わりました。しかし、立ち直りの早いところが親族SNS管理人の強みです。
¥(^_^) <==懲りない奴
未だ、Raspberry piのGPIO制御を実際に試していなかったので、bcm2835ライブラリにblink.cを組み込んで、動かしてみました。
$ sudo bcm2835_blink
LEDが点滅している
これをユーザー・モードで起動できるように修正します。
$ sudo chown root:root bcm2835_blink
$ sudo chmod 4755 bcm2835_blink
$ ls -al bcm2835_blink
-rwsr-xr-x 1 root root 16275 8月 29 15:12 bcm2835_blink
$ bcm2835_blink
動きました。
(パチパチパチ~)
bcm2835_blinkを子プロセスから起動し、終了させるプログラム(<==bcm_interface.c)を書きました。
child = fork(); if( child == 0 ) { argv[0]="bcm2835_blink"; execve(argv[0], argv, environ); exit(0); } sleep(3); printf("%s\nO.K. setup complete\n",argv[0]); kill(child,SIGINT); exit(0);
さらに、共有メモリを設けて、その上で二つのリング・バッファを動かして、bcm2835_blinkとbcm_interface間で通信できるようにしました。
$ dd if=/dev/zero of=/tmp/shm bs=4096 count=1
$ bcm_interface /tmp/shm
struct ring_buff *r_buff,*w_buff; fd = open( argv[1], O_RDWR); s = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); --------------------------------- 親プロセス(bcm_interface) r_buff=(struct ring_buff *)s; w_buff=(struct ring_buff *)(s+sizeof(struct ring_buff)); --------------------------------- 子プロセス(bcm2835_blink) w_buff=(struct ring_buff *)s; r_buff=(struct ring_buff *)(s+sizeof(struct ring_buff)); --------------------------------- r_buff->rp =0; w_buff->wp =0;
これで以下のことが出来るようになりました。
(1)ユーザ・モードで起動したプログラムからbcm2835ライブラリ関数を呼び出して、GPIOを制御する。
(2)そのプログラムを子プロセスとして起動する。
(3)共有メモリを設定して、二つのプロセス間で通信する。
”JAVAからbcm2835ライブラリを呼び出す”ための道具立ては揃ったように思うのですが・・・
どうでしょう?
|
|
|
コメント 0