7/19/2011

ARM Cortex-M0ボード"MARY"のリアルタイム性能





CQ出版・マルツパーツから販売されているARM Cortex-M0基盤 "MARY" (トランジスタ技術2011年4月増刊に付属)は,超小型ながら必要十分な基本機能と高い拡張性をもった,とてもクリスプなマイコンです.ご多分にもれず私も3月の発売時に大人買いしました(単体で買っても1980円,増刊号では3000円で2枚付属するという破格の安さも魅力の一つです).
  • マイクロコントローラ:NXP LPC1114
  • CPUコア:ARM Cortex-M0
  • 動作クロック:48MHz
  • 内蔵フラッシュメモリ:32kBytes
まずは全開で回したとき(デジタル出力をON/OFFするだけのループ)の確認です.ループ周期は約1.7μsecでした. さすがに速いです.パルスにかなりヒゲが出ているのはGPIOの応答限界なのでしょうか.

ソース:
#Ifdef __USE_CMSIS
#include "LPC11xx.h"
#endif

int main(void)
{
  int sample_out; 

    GPIOSetDir(1, 8, 1);   // PIO1_8 : OUTPUT
    sample_out = 0;

    while(1)
    {
      GPIOSetValue(1, 8, sample_out); 
      sample_out = 1 - sample_out;
    }
    return 0; 
}



1000カウントの空for ループを入れて回したとき.ループ周期は約400μsecとなりました.



図は省略しますが,10000カウントにすると約4msec (=4000μsec) でした.デクリメントと条件分岐が一回あたり4μsecくらいかかるということですね.十分すぎるほど速いように見えますが,Cortex-M0は乗除算が(整数であっても)複数サイクルを要することと,浮動小数点演算はさらにさらに高コストなことを考えると,制御則などを下手にコーディングすると一気に時間がはねあがることも予想されます.これからもう少し演算性能をテストしておこうと思います.Cortex-M3,M4との比較も早くやってみたいところです.

追記:簡単な演算テストをしてみた結果は以下の通りでした.クロスコンパイラはgccです.
  •  int どうしの乗算 3.6μsec
  •  int どうしの除算 7μsec
  •  float どうしの乗算 60μsec
  •  float の sin関数 240μsec
コンパイラの最適化処理にも依存するので一概にはいえませんが,だいたいの目安にはなりそうです.やはりfloatで sqrt, sin, cos, exp などの数学関数を使うと急激に時間が増えます.二,三段の複合計算をしたら簡単に1msecを超えました.非線形制御を実装するときにはさまざまな工夫が必要です.

追記の追記:
Arduinoのリアルタイム性能についても少し追記しておきましたが,Arduinoでは全開で回したときの周期が460μsecでした.sinやcosを入れると数十msecまで増えることもあります.