目次

計算の高速化

 低速クロックのマイコンで、計算を高速化したい場面が
 起こるときは、次のようにする。
  1. 整数で扱える範囲におさめる
  2. シフト処理による乗算と除算実現
  3. テーブル参照で計算省略

整数で扱える範囲におさめる

 小数点以下1けた程度の温度値の平均を求めるような場合は  温度値を10倍した値の総和を計算後、平均を求める。  10で割った商と余を求めてから、表示すれば固定小数点の  計算を実行したことになる。 温度であれば、−100℃〜100℃と限定すると、総和は  10個程度求めても、最大値は10000ほど。この範囲で  あれば、平均を求めるのならば、固定小数点や浮動小数点の  計算は不要になる。

シフト処理による乗算と除算実現

 10倍の値を求めるには、シフト処理で次のようにする。  元値をxとする。  10 = 8 + 2 = 2 * (4 + 1) res0 = (x << 2) ; /* x 4 */ res = (res0 + x) ; /* x 5 */ res = (res << 1) ; /* x 10 */  関数にまとめると、以下。 UWORD mul10(UBYTE x) { UWORD result ; result = (x << 2) + x ; result <<= 1 ; return result ; }  100倍の値を求めるには、シフト処理で次のようにする。  元値をxとする。  100 = 64 + 32 + 4 res0 = (x << 2) ; /* x 4 */ res1 = (res0 << 3) ; /* x 4 * 8 */ res2 = (res1 << 1) ; /* x 64 */ res = res0 + res1 + res2 ;  関数にまとめると、以下。 UWORD mul100(UBYTE x) { UWORD res0 ; UWORD res1 ; UWORD res2 ; res0 = (x << 2); res1 = (res0 << 3); res2 = (res1 << 1); return res0 + res1 + res2 ; }  除算は、減算の繰返しで実現できるが、除数が2のべき乗で  あれば、右シフトを利用して、計算を高速化できる。

テーブル参照で計算省略

 サーボモータを動かす場合、パルス幅に相当する数値が必要に  なることがある。  パルス幅が、1ms〜2msで、これを0.1msの分解能で  示すと、10〜20になる。10以上は、ベースを10として  10を加算すると考えれば、対応表は以下となる。
  1. 0 <-> 10
  2. 1 <-> 11
  3. 2 <-> 12
  4. 3 <-> 13
  5. 4 <-> 14
  6. 5 <-> 15
  7. 6 <-> 16
  8. 7 <-> 17
  9. 8 <-> 18
  10. 9 <-> 19
 計算式を記述すると時間がかかる場合は、配列の添字を使い、数値を  引き出す工夫をする。 UBYTE val_pat[20] = {10,11,12,13,14,15,16,17,18,19,0,1,2,3,4,5,6,7,8,9};
目次

inserted by FC2 system