目次
前
次
計算の高速化
低速クロックのマイコンで、計算を高速化したい場面が
起こるときは、次のようにする。
- 整数で扱える範囲におさめる
- シフト処理による乗算と除算実現
- テーブル参照で計算省略
整数で扱える範囲におさめる
小数点以下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を加算すると考えれば、対応表は以下となる。
- 0 <-> 10
- 1 <-> 11
- 2 <-> 12
- 3 <-> 13
- 4 <-> 14
- 5 <-> 15
- 6 <-> 16
- 7 <-> 17
- 8 <-> 18
- 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};
目次
前
次