chintaro3の日記 

基本、チラ裏です。書いておくと頭の中が整理できますゆえ。

mbed感想

先日からちょこちょこ話題にしているエムベッド。
使ってみて解った事メモ。
 
・何も考えずに当たり前に浮動小数点が使える事がこんなに有り難かったとは・・・
PCとかのプログラミングしてる人には笑われそうだが、一昔前の、チープなワンチップマイコンじゃありえなかったよな。FPGAと比べても、FPGAであらゆる数値演算に浮動小数点を使うのはかなりウンザリな感じなので、「簡単な処理を簡単にやりたい。ただし浮動小数点で」という場合にはmbedに分がある。
 
・ハード割り込みはやっぱり難しい
ハード割り込みが入ってから、実際の処理が始まるまでの時間のバラつきを、管理するのが難しい。Tickerを併用してたせいもありそうだけど。これは標準ライブラリに頼っている事とのトレードオフかな。きっちりタイミング管理する必要があったので、結局、ハード割り込みを使うのはやめた。
 
・Tickerがかなり正確
これは助かった。ハード割り込みの代わりに、Tickerでポーリング的に処理する事で何も問題なし。但し最速10kHzが上限なのかな。それっぽいソースはまだ見つけてないが、10kHzより高い周波数を設定するとハングアップした。
 
・A/Dも結構正確
どこまでがA/Dの精度に起因するか切り分け出来てないが、0.5%ぐらいの実力が出せる。これを浮動小数点演算で補正すれば何も問題ない。外付けのA/Dは結局使わずじまい。
 
・A/Dのサンプリング時間はそこそこ
40kHzが限界だった。10kHzのTicker1サイクル内で4回A/D変換したらギリギリ。なので、例えば録音用途にはそこそこの性能しか期待できない。
 
・Tickerを複数使うとちょっと面倒
Ticker割り込みを複数使うと、その割り込みの優先順位に伴う状態管理が面倒。なので、せいぜい2つが限度と思われる。途中、Tickerを3つ使っていたら、割り込み順位の問題でタイミング管理がカオスになりかけたので、これはヤバイと一番遅くてどうでもいい処理をmain()に移して、while無限ループで回すことで問題を回避した。
 
・D/Aはノイズ対策が大変
 A/D入力は適当にフィルター処理すればノイズの影響を見かけ抑える事が出来るが、D/A出力に乗ってくるノイズは面倒。GND1本しかないし。これこそ、外付けのD/Aを載せるべきだった。反省。
 
・キャラLCDがたまにハングアップする
 出ないときは全然出なくて、再現性無いので、ちょっと不安。USB繋ぎっぱなしで電源ON/OFFするのがまずいのだろうと思っている。
 
・下手にマルチタスク風にするより、mbedを複数使った方がラク。
 大量生産するのでないならば、1コアで複数のスレッドで依存関係に苦労するより、さっくり別CPUに分けてしまった方が全然すっきりするしデバッグ時間も短くて済む。特にタイミング管理が重要な場合。これにかかる作業時間を考えたら、mbedを1枚余分に使うぐらいのコストメリットは簡単に出せる。

・I2C のI/Oエキスパンダは割り込み仕様に注意
 今回、結局ハード割り込みは使わなかったが、I/OエキスパンダICの ACK/NACK仕様がmbedのそれとかみ合わず、割り込み信号が出っぱなしになってしまうので割り込みとして使えないという事に、ソフト作製を始めてから気が付いた。I/OエキスパンダIC側は、I2C通信の最後がACKで終わらないと、通信に失敗したと判断して割り込み要求を出す。しかし、mbed側は、データ読みだしの最後はNACKを返すという「仕様」(!!!)なのだ。つまりI2Cエキスパンダ側からみるとデータ読みだしは毎回失敗しているように見えるという「仕様」。これを外付け回路で直すなんてやってたらメリット何にもなくなるので、あり得ない。I2Cでハード割り込みを併用する場合はACK/NACKの仕様をよく確認して、こういう問題の出ないICを選ぶしか手が無い。
 
 

mbed NXP LPC1768 : Development Board Cortex-M3

mbed NXP LPC1768 : Development Board Cortex-M3

mbed + ☆board Orangeセット: mbedはじめるならこれで決まり!

mbed + ☆board Orangeセット: mbedはじめるならこれで決まり!