2014-08

2014-04  FM3 RX62N SH2A PIC32MX

2014年8月

積み案件


1)はモチベーションの低下。(もうすでに飽きている)

2)は完成済。

3)でAndroidのADKを試そうとしていて足踏み中。(進捗どうですか:永遠に零) --- USB_HOST参照

4)STM32F4 DISCOVERYをDISCOVERY(ジャンク箱から発見)したった。(未使用だけど埃被ってた)。mbedで遊ぼうかどうか思案中。(夏休みの電子工作ってことで・・・爆!)

5)STM32F4 nucleoを買おうかどうか思案中。これもDOSCO_F407VGが終わってからか。

6)ハルロック1巻買ったよ

7)Kbox2 とか Linux-on-Androidとかの復讐(え゛)




11bitコンピュータのアセンブラとシミュレータ

ダウンロードはこちら

  • アセンブラ、シミュレータ(Windows/Linux兼用) gccソース込み。
  • MITライセンスにしています。
  • 1ワード16bit命令の似たようなコンピュータなら、ちょっと改造したら移植できるかも。
  • 某トランジスタ製コンピュータのCPUによく似ています。が、互換性はないと思います。(練習用とか)
    • これも、ちょっと改造したら移植できるかも。




11bitコンピュータで円周率を求めるには・・・

π=4 * arctan(1)
  • arctan()はマクローリン展開すると線形多項式になる。
  • たぶんこんな感じの関数をASMで書くと良いような気がする。
    int main()
    {
       short i,pi=0,k=400;
       for(i=1;i<1000;i+=2) {
          pi = pi + k / i;
          k=k*(-1);
       }
       printf("pi=%d\n",pi);
    } 
  • だけど64ステップで書けるかと言われると・・・x86なら除算もあるので出来るけど・・・それは無理

11bitコンピュータで円周率を求めてみた。

  • 例のブログにヒントがありました。
  • マチンの公式を使います。
  • 多倍長演算は使いません。(11bit精度です)
  • 割り算は引き算のループです。



  • さっき、{それは無理}と書いたけれど、やれば出来る



                                      //
                                      //	RAMは後半 1k WORD の 先頭から 4 WORD存在すると仮定している.
                                      //
0000:                                 work0:     equ  0x400 
0000:                                 work1:     equ  0x401 
0000:                                 work2:     equ  0x402 
0000:                                 work3:     equ  0x403 
                                      //	work3はCALL命令のPC保存用(RET)で使用する.
                                      
0000:                                            org  0 
                                      //----------------------------------------------------------------
                                      //
                                      //		atan(x)=x-(1/3)*x^3+(1/5)*x^5-(1/7)*x^7....
                                      //
                                      //	pi=4*(4*atan(1/5) - atan(1/239))
                                      //	  =16 * (1/5) - (16*(1/5)/3 *(1/5)*(1/5)) - 4 * (1/239)
                                      //
                                      //	浮動小数->整数の下駄履きは 係数500を掛けているので、
                                      //	  =1600 - (1600/75) - (2000/239)
                                      //	結果の整数値(下駄履き係数500) を 500 で割ると、3.14になる.
                                      //----------------------------------------------------------------
                                      
0000:                                 main:            
0000:0640                                        mov  a,1600 		// 4*4*100
                                      //	mov b,5			// 係数500を掛けているので、5で割らずそのまま.
                                      //	call div_ab
                                      //	mov [work0],c	// work0=4*4*(1/5)
0001:3400                                        mov  [work0],a 	// work0=4*4*(1/5)
                                      
0002:1c00                                        mov  a,[work0] 
0003:084b                                        mov  b,75 		// 3*5*5
0004:1006 5814                                   call div_ab 
0006:3c01                                        mov  [work1],c 	// work1=4*4*(1/5) /3 *(1/5) * (1/5)
                                      
0007:1c00                                        mov  a,[work0] 
0008:2401                                        mov  b,[work1] 
0009:5000                                        sub  a,b 
000a:3400                                        mov  [work0],a 	// work0=16*atan(1/5) (マクローリン展開は2項のみ)
                                      
                                      
000b:07d0                                        mov  a,2000 		// 4*500
000c:08ef                                        mov  b,239 
000d:100f 5814                                   call div_ab 
000f:3c01                                        mov  [work1],c 	// work1=4*atan(1/239) == 4*(1/239)
                                       
0010:1c00                                        mov  a,[work0] 
0011:2401                                        mov  b,[work1] 
0012:5000                                        sub  a,b 
                                      //	答えはAレジスタに残る. 係数500が掛かった固定小数.
                                      
0013:                                 halt:            
0013:5813                                        jmp  halt 
                                      
                                      //	C=A/B
0014:                                 div_ab:          
0014:3c03                                        mov  [work3],c 
0015:17ff                                        mov  c,0x7ff 
0016:                                 div_loop:        
0016:4801                                        add  c,1 
0017:5000                                        sub  a,b 
0018:6816                                        jnc  div_loop 
0019:6403                                        ret   
                                      
001a:                                            end   
                                      
                                      
  • わずか26ステップで出来ました。
  • 基数変換とか桁別表示を入れると64ステップくらい食うかも。

ダウンロードはこちら -- アセンブラ、シミュレータも全部込みです。




このCPU、とっても小っちゃいのに、気に入りました。

  • 実はSC/MP-IIに少し似ています。
  • SC/MP-IIは、acc以外では16bit長のレジスタ(ポインタ)が3本とPC(16bit長)が1本あります。
  • 16bit長のレジスタ(インデックスレジスタ)の4番目がPCというお約束になっていて、PCは4番目のインデックスレジスタという設定になってます。
  • 命令の種類がとても少ないというのは共通点。
  • フルアセンブラで書くしかない、というのも共通点。全然コンパイラ向きではありません。
  • スタックポインタが無いことも共通点。
  • 遅いことも共通点 \(^ ^);;





Android をRoot化する

Kingo Android Rootというのを使うらしい。


  • /system/以下 が書き換え出来ないときは、rwで再マウントするだけ。
# mount -orw,remount /system
  • 戻すときは、
    # mount -oro,remount /system
  • この辺はLinuxと同じだけど、Androidはディレクトリ構成がアレですな。


結局root化はKingoのおかげで簡単にできたけど、

  • /system/xbin/su を消しても消しても、OS再起動すると現れる怪、と
  • ゲームアプリが起動しなくなる怪、が未解決<---今ここ。
  • あと、ubuntu入れようとしたけど、 /data/ がたったの2GBなのでどうしようか思案中。
  • ext_SDは16GB挿してるけど、そこにLinux入れるの?って感じか。





参考、このへん

別に、ゲームアプリをどうこうしたいわけじゃなくて、busybox使いたいだけなのに、 それによってゲームアプリが起動しなくなるんだったら、ゲームアプリ消せばいいわけで・・・。

まあ、よくわからん。






PIC32MX 220F032B(220円PIC)でAndroid端末を繋いでみる。

  • 進捗は、ありまぁーす。

https://raw.github.com/iruka-/ATMEL_AVR/master/web/jpg/PIC/adkdemo.png

もっと読む: USB_HOST







KBox2とlibfakechrootについてのメモ => Android

  • KBox2というのは、root権限取ってない Android端末でLinux(Unix)っぽいCUIシェルを実現させるための環境。
  • Android端末の
    /data/data/jackpal.androidterm/kbox2/
  • というディレクトリにインストールされる。
  • 環境変数はこんな感じ
    FAKECHROOT='true'
    FAKECHROOT_BASE='/data/data/jackpal.androidterm/kbox2'
    FAKECHROOT_EXCLUDE_PATH='/data/data/jackpal.androidterm/kbox2:/data/data/jackpal.androidterm/kbox2'
    FAKECHROOT_VERSION='2.16'
    HOME='/home/kbox'
    ・・・
    KBOX='/data/data/jackpal.androidterm/kbox2'
    LD_LIBRARY_PATH='/data/data/jackpal.androidterm/kbox2/lib:/data/data/jackpal.androidterm/kbox2/usr/lib'
    LD_PRELOAD='/data/data/jackpal.androidterm/kbox2/lib/libfakechroot.so'


そもそも、libfakechrootって、何?

  • root権限なしでchrootするツール。(chrootというのは、ファイルシステムの'/' マウントポイントを現在のファイルシステムの任意のディレクトリ位置に再設定する機能)
  • Debianとかで、dpkg作るときに使われるツール。
  • cygwinもこの原理で動いているらしい。


どうやって実現しているの?

  • ld.so の LD_PRELOAD 機能を使って、 /lib/libfakechroot.so を libc.soよりも先に常駐(リンク)させておく。
  • libc.soの open や chdir , opendir 等をhookしてディレクトリ位置を置き換える。


試し方:

  • 1)Jackpal:Android-Terminal-Emulatorをインストールする。
  • 2)google playでOneBoxインストーラーをインストールしてKBox2環境を手に入れる、もしくは、KBox2のダウンロードから、インストーラーをダウンロードして、Android-Terminal-Emulatorから、
    $ chmod +x kbox2-base-installer 
    $ ./kbox2-base-installer 
    $ ./setup
  • 3)Android-Terminal-Emulatorの設定メニューで、初期起動するシェルスクリプトを以下のパスのスクリプトにしておくと、即座にKbox2のshに入れる。
    /data/data/jackpal.androidterm/kbox2/bin/kbox_shell


これで、暫く試しているのだが、Androidの問題点があって、

  1. スクリーンキーボードがすこぶる使いにくい。
  2. USB(Device)接続による携帯用の中華USB外付キーボードがまた、配置がでたらめすぎて、死ぬほど使えない。
  3. Bluetooth接続のキーボードもまた、使いにくい。


どれも、3分で使用をあきらめた。

  • Kbox2にはsshdサーバーやtelnetdサーバーのようなものが用意されていて、ssh経由で繋ぐことが出来る・・・筈なんだけれど
  • たいていの無線LAN(WiFi)はWindows PCやLinux PCと異なるLANセグメントに閉じ込められる(ルーターモード)ので、WiFiセグメントからLANセグメントへのssh接続は可能だが、その逆(PCからAndroidへssh)はブロックされる。

結局adbで繋ぐことに・・・・

  • AndroidSDKを入れる。(既に入れてあるなら不要)
  • USBで繋いでおいて、adb shell を立ち上げる。
  • /data/data/jackpal.androidterm/kbox2/bin/kbox_shell を起動する。 (root権限が必要)


最後が、全く本末転倒。





Kbox2 の Hello Worldを書いてみる。

その1)普通にhello.c を書く.

#include <stdio.h>
int main(int argc,char **argv)
{
    printf("Hello, World.\n");
}
  • kbox2のgccでコンパイル
    $ gcc hello.c -o hello
  • 実行
    $ ./hello


  • ここまでは、インストール猿なら、誰でも出来る。努力も根性も不要。

その2)Ubuntu Linux(PC)を用意する。

  • VMWarePlayer上でも構わない。
  • 何が面倒かって?それは Android NDKのインストールだよーん。 --->がんばれ俺!


延々とダウンロード

黙々とインストール

  • NDKのインストール先は、とりあえず、
    NDK_PATH="/usr/local/android-ndk-r9d/"
  • としておいて、
  • 先ほどのhello.cを用意。

KμCさんのブログを参考に、やってみる。

Makefileを書く

#
#CC = $(NDK_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc
CC = $(NDK_PATH)/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc

LIBS = -llog
TARGET_ARCH_CFLAGS = -march=armv5te -msoft-float

#SYSROOT = $(NDK_PATH)/build/platforms/android-4/arch-arm
SYSROOT = $(NDK_PATH)/platforms/android-19/arch-arm
CFLAGS  = -mandroid --sysroot=$(SYSROOT) $(TARGET_ARCH_CFLAGS)
LDFLAGS = -mandroid --sysroot=$(SYSROOT) $(LIBS)

hello : hello.o
  • makeする
    $ make
  • できたhello (android ARM用のelf) を端末に転送する。
    • とりあえず、端末のkboxシェルから、Linux側にsshプロトコルで scp出来るようだ。
      $ scp linuxuser@192.168.1.xxx:hello .
  • 実行する
    $ ./hello
  • 一応fopenとかやってみて、fakechrootされているところまで確認した。
  • たぶん、これで、普通にCで書かれていてlibc.soだけに依存しているソースは実行ファイルが作れる、ということは分かったけど、
  • ./configureとかどうするんだろう。ドキドキ





Kbox2 用のtarを作ってみる。

  • busyboxのtarは展開のみで圧縮機能が無かった。
    • これはbusyboxをビルドするときにスイッチで指定出来るらしい。
  • 手始めにubuntuのtarをKbox2用にビルドしてみることにする。

やり方は、またまた、KμCさんのブログを参考にしてみた。


まず、Ubuntu14.04LTSマシンを用意する(VMWarePlayer上でも可能)

  • 1)tarのソースを取得する。
    $ mkdir build
    $ cd build
    $ apt-get source tar
  • 2)configure用のスクリプトを書いてみる
    • config.sh
      #!/bin/sh
      # NDKのインストール先.
      export NDK_PATH="/usr/local/android-ndk-r9d/"
      
      export SYSROOT=$NDK_PATH/platforms/android-19/arch-arm
      export CFLAGS="-march=armv5te -msoft-float "
      export CC="$NDK_PATH/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -mandroid --sysroot=$SYSROOT"
      
      # ./tar-1.27.1/ に tarのソースがあること.
      
      mkdir work
      cd work
      ../tar-1.27.1/configure --host=arm-eabi --disable-ipv6 --prefix=/system/local --enable-shared
  • 3)上記 config.shを実行
    $ chmod +x config.sh
    $ ./config.sh
  • 4)Android用にクロスビルドする。
    $ cd work
    $ make
  • 5)いくつかコンパイルエラーが出る
    • 例えば、mkfifo.c 関数の二重定義 ---> mkfifo.c の該当関数をコメントアウト
    • 実行時、futimensが無い。---> config.h 書き換え
      /* Define to 1 if you have the `futimens' function. */
      /* #define HAVE_FUTIMENS 1 */
  • 6)直したら、再ビルド
    $ make
  • 7)出来たelfを転送、実行
    $ cp src/tar ~/
  • Kbox2からsshでコピー、実行
    $ scp linuxuser@192.168.1.xxx:tar .
    $ ./tar
  • 8)/bin/tar を消して置き換える
    $ cd /bin
    $ ls -l tar
    $ rm tar
    $ mv /home/kbox/tar .


やっと、tarのアーカイブ作成が可能になりました。





Linux-on-Android

  • 入れてみた。
  • Imageはubuntu-13.04.core.v2.img.zip みたいなやつ。
  • ubuntu14.04は、まだ用意されていない。
  • たしか、12.04のころは、complete-installerは有料アプリだったはず。
  • img.zipをunzipするところはinstaller側でのサポートが無くて手動っぽい。(なので、imgをダウンロードしてSD-Cardに転送するところはPCでやったほうが早い)
  • /mnt/external_sd/ あたりに 1GBのimgファイルを置いておいて、complete-installerから、そのディレクトリ、ファイルを指定して、Launchする。

KBox2 と Ubuntu-on-Androidの得失

KBox2Ubuntu-on-Android
root権限不要必要
インストールに消費されるDisk容量軽量(50MB程度?)重量級(1GB〜)
利点気軽にLinuxコマンドを実行できるUbuntu Linuxそのものを利用できる
root権限が要らないのでroot化の危険を回避できるapt-get等を使用してパッケージ導入が簡単
root化端末で使うことも出来る
( '/android_root/'以下に、ネイティブのファイルシステムが見えているので、いろいろ出来る)<===(loop mountなのでそれは無理)
弱点自分でdebパッケージを作るのが難しいUbuntuのバージョンがやや古い(13.04)ので、実はapt-getリポジトリにアクセス出来ないことが多い
配布されているdebパッケージが限定的で少ない、日本語対応していない(/etc/apt/source.listのraringをsaucyに書き換えることで少し回避できる)
コアパッケージや派生パッケージのソースが公開されていない'/'ファイルシステムが1GBのimgファイルなので、Android側の'/system/'とかをいじりたくても触れないもどかしさがある。(無理やりマウントは出来ないのだろうか)
自分でビルドするための情報が不足しているTCP portのアクセス権限がないので、sshとかするにはひと工夫要るらしい
/binとかのコマンドの大半がbusyboxなので、サブセット感が半端ない(昔やったことあるけど、もうやり方を忘れている)
(例えばtarはextract専用だったりとか)

もっと読む: Android






PIC32MX Bluetoothを試す

  • btstack for PIC32 を試してみた。

もっと読む: PIC32MX Bluetoothを試す




PIC32MX USB Audio を試す

  • USB Audio Speaker for PIC32 を試してみた。

もっと読む: PIC32MX USB Audio を試す






Dockerメモ

Qiita

  • とりあえずインストール
    # apt-get install docker.io
    • dockerだけだと Gnomeのdockerという、わけわからん物がインストールされる(47kBくらいのやつ)注意してね。
  • たったこんだけで走る。(bashだけ、だけどね)
    $ docker run -i -t base /bin/bash


  • まあ、lxcも簡単だったけど、Dockerはもっと簡単なのか。
    • 動作原理はこのへんに書かれている。
    • aufsはunion filesystemで、二つのファイルシステム(roとrw)をレイヤーで重ねて見せるようなやつだと思われ。
    • で、結局LXC使ってんじゃん、というツッコミは無しで。


  • コンテナのイメージ(と言うのか?)が作られる場所は
    /var/lib/docker/aufs/mnt/<わけわからんGUIDな文字列>/
    /var/lib/docker/aufs/diff/<わけわからんGUIDな文字列>/
    /var/lib/docker/aufs/mnt/<わけわからんGUIDな文字列>-init/
    /var/lib/docker/aufs/diff/<わけわからんGUIDな文字列>-init/
    そのまんま普通にLXCのrootfsみたいな感じだけど、4つに分けられている意味が分からなかった。


  • たぶん、mnt/ が付いてるやつは、ほんとに union mountされている mount pointなんじゃあなかろうか(つまり、Dockerコンテナの / はそこにmountされている) ???要確認
  • 試したところ、mnt/のほうはゲストを終了させるとファイル消滅して空ディレクトリだけになるので、たぶんマウントポイントだけの役割なのだろう。
  • diff/のほうには、rootfsのユーザーランドがなんとなく全部残っている感じ。(GUID名は異なる)
  • で、ゲストが更新したファイルだけが、diff/<わけわからんGUIDな文字列>/ 以下に残っていた。
  • <わけわからんGUIDな文字列> が、長すぎて嫌〜。


困ったちゃん。

  • Ubuntu14.10 (Unity) で試したんだけど、Dockerの中でapt-getしようとしたら、ubuntu12.10(quantal)になってて、apt-get出来なかった。
    • なんで、せめて14.04LTSを base にしてないんだろう。あほなの?

Dockerチートシート

  • メジャーなレポジトリ

busybox, centos, ubuntu, debian

  • 公式イメージ。人気なのは言わずもがな

dockerfile/*

  • Dockerfile Projectが管理。
  • ElasticSearch,nginx,redis,mongodbなど。baseはubuntu 14.04

base

  • 今は非推奨。中身はubuntu12.10。


案の定、baseのかわりにubuntuにしたら、14.04LTSになった。


結論

  • まあ、そういうわけで、似たようなコンテナを沢山飼いたいときは、union fs使ったほうがディスク領域の節約になるし、コンテナの中のファイルをいじった場合に、何を変えたかすぐわかるし、初期状態(というか自分の都合のよい初期設定状態)にリセットしたり、同じようなコンテナを複製したりが超楽になるはずなので、Dockerお勧めかもね。




UsbStudyをPIC32MX に移植する

もっと読む: USBStudy


<前の月次の月>