2008年09月12日 [ColdFire] ColdFire×P2P地震情報(9) 熱にご注意,SilentCベンチ
_ [ColdFire] ColdFire×P2P地震情報(9) 熱にご注意,SilentCベンチ
Interface 9月号付録基板を使い,P2P地震情報のサービスを作ってしまう勝手な企画です.過去の記事は,タイトルのColdFireカテゴリからどうぞ.
今回は,加速度センサやSilentCの気になるところを調べてみました.
熱にご注意
P2P地震情報の中の人から「加速度センサの値って熱の影響受けやすいみたい.実験したからデータあげる」と言われたので,データを見てみました.ドライヤーで加熱したそうな.
って,変わりすぎ! データシート,データシート… 加速度センサのデータシートでは,0 gの感度差は±2.0 mg/℃,感度差は±0.03 %/℃が仕様とされているようです.いや,緑色のX軸は明らかにその範囲外.温度センサを付けていなかったので,温めすぎた可能性も否定できませんが.
しかしながら,このような緩やかな変化は移動平均を使ってオフセットを出せば概ね解決します.問題になるのは,熱でノイズが増すかどうか.X軸のFFTを出してみました.
ドライヤーを入れる前が平常時,入れた後が加熱時,入れてしばらく経ったのが過熱時です.平常時と比べると,加熱時,過熱時はノイズレベルが1段,2段ほど増えていることがわかります.
ドライヤーの風による影響も含まれていると思いますが,同じ風量を当てた「加熱時」と「過熱時」とでノイズレベルに差があることから,ドライヤーの風だけではなく,熱(温度)が関係していると言ってもよいでしょう.
つまり,ノイジーな状態を緩和するには,基板の熱対策も重要になってくる… かもしれない,ということです.データシートきっちり読める人,人柱実験が大好きな人を募集しています(?).
SilentCベンチ
SilentCはインタプリタです."filename::funcname"という風に別ファイルの関数を呼べるのは大変便利ですが,パフォーマンスが心配になります.せっかくなので,調べてみましょう.
main(){ char c,soc; int i; //事前処理が必要な場合はここ c=CreateTimer(0,30000,0); for(i=0;i<10000;i++){ //計測したい処理 } PrNum(GetTimerCount(c)); CreateTimer(c,0,0); //事後処理が必要な場合はここ }
"(30000-出力値)*10/10000"と計算すると,処理の所要時間がms単位で出ます.ただし,forループの処理時間を考慮しなくてはなりません.予めループ内に何もない状態で計測を行い,それをループ処理そのものに掛かった時間と仮定して一律差し引くようにしました(0.4543 ms).
なかなか面白いところがありますね.
- 関数を呼び出す場合,同じファイルの末尾に書くよりも別ファイルの先頭に書いたほうが早い.
- 上から 別ファイル1行目の関数呼び出し,同じファイル末尾の関数呼び出し,同じファイル1行目の関数呼び出し です.
- メモリマップドI/Oなどでポインタを使って読み書きする場合,"pointer[0]=0;"を"*pointer=0;"とすると約2倍早い(箇所は限定される).
- 途中で終了するための入力チェックは結構重たい.UDPの受信チェックなんかはさらに重たい.
- 値を10進数で書いても16進数で書いてもあまり変わらない.バイト数の関係か,10進数で書いたほうが気持ち早い.
- 除算はビットシフトのほうがやや早いが,数値で書いても遅くはない.