CQ出版社インターフェース誌の2017年8月号で解説している,固定小数点演算で sin 関数の値を求める二つの関数を比較するためのプログラムの全体.

Dependencies:   mbed

Revision:
0:9b1d4712f862
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CMSISmain.cpp	Wed Aug 02 12:01:51 2017 +0000
@@ -0,0 +1,44 @@
+//----------------------------------------------------------------------
+//  自作 Sin16() と ARM の arm_sin_q15() の実行時間の比較
+//      arm_sin_q15.c は自分でインポートする必要がある
+//  2017/03/01, Copyright (c) 2017 MIKAMI, Naoki
+//----------------------------------------------------------------------
+#include "mbed.h"
+#include "SinCosFixed.hpp"  // Sin16() 用
+#pragma diag_suppress 3108  // arm_sin_q15() で,コンパイル時に出る warning 抑制のため
+#include "arm_math.h"       // arm_sin_q15() 用
+
+const int TS_ = 10; // 標本化間隔:10 μs
+
+Ticker timer_;
+AnalogOut da1_(A2);
+AnalogOut da2_(D13);
+DigitalOut dOut_(D2);
+
+const int DX_ = 997;
+int16_t phi1_ = 0;
+int16_t phi2_ = 0;
+
+void TimerIsr()
+{
+    dOut_ = 1;
+    int16_t sn1 = Sin16(phi1_);         // 300 ns(実測値)
+    dOut_ = 0;
+    wait_us(2);
+    dOut_ = 1;
+    int16_t sn2 = arm_sin_q15(phi2_);   // 570 ns(実測値)
+    dOut_ = 0;
+    
+    phi1_ += 2*DX_;
+    phi2_ = (phi2_ + DX_) & 0x7FFF;
+    
+    da1_.write_u16(sn1+32768);
+    da2_.write_u16(sn2/2+32768);
+}
+
+int main()
+{
+    timer_.attach_us(&TimerIsr, TS_);
+    
+    while (true) {}
+}