前回のRPC版から少し修正してようやく変数の双方向ができました。
NO.111 rpc
ただ今回はとても大変でした・・・。
ハマり加減が半端なく、次から次へと奈落の底へ。。
あまりのハマりっぷりにネタにしようかと思います。。
とりあえず2点だけ。
1、gba側をspi通信のマスターにすることはできません
ええ、当たり前の話です。
マルチブートすることを前提とした場合、必ずmbed側がマスターになります。
mosi、misoのピンはmbedを基準に固定されるわけでGBAではないです。
間違ってもGBA側をマスターにしたコードを書いて、
ピンを動かそうとした時に気がついた、とか無いようにしてください。orz
ちなみにその時のGBAのコードは以下のような感じでした。
REG_SIODATA32 = 適当なu32の値; REG_SIOCNT = SIO_CLK_INT | SIO_32BIT | SIO_START;
割り込み関数も要らないのでとてもシンプルです。カードリッジ起動には有効ですね。
僕だけかもしれませんけれど、このI/Oマップのレジスタ、綺麗だなあと思いました。
2、mbedのrpc。ターミナルソフトに気をつけよう
前回、変数のreadコマンドがうまくいかないと書きましたけれど
原因がわかりました。入力の時、/var/readの後に改行コードが入っていた為、
値が拾えなかったというオチです。
strcpy(buf, "/var/read"); RPC::call(buf, outbuf);
とやったらうまくいきました。
間違っても変数の値を取り出す自作関数を作った後、発覚するような
アホなことは避けましょう。。泣く泣く下記のような方法に修正。
int var = atoi(outbuf);
まーライブラリの勉強になったからいいんですけど。。
あとエラー処理、再送処理まったく作っていません。
前回のdumpプログラムの所感で、
8MBのromを20回ぐらい吸い出した感じでは一回もcrcチェックで
引っかかったことはありませんでした。
通信速度(初期設定)が早すぎて値がおかしくなるってのは
ありましたけれど。