Darkside(https対応しました) |
2018年11月20日(火) 21:56
まあ正規化というのは前菜であり、内分計算を伴う変換計算こそが本丸である。変換テーブルから引いた4つの値(正方形の頂点)と、アクセル&ハンドルの入力値(正方形内部の一点)を正確に変換する。これが、今時のパソコンならどうってことはない。しかし、8ビットマイコンで行うとなれば話は別だ。多倍長の乗算は、やたら処理が重い。
C言語であれば記述は楽なようでいて、何も考えないと計算時間を馬鹿食いする。
ここでまた、無茶苦茶な変換結果が出て来る。
XC8は、16ビット超の変数がいきなり使い物になっていない。
多倍長演算の負荷を減らすべく、XC8には short long 型という24ビット整数が存在する・・・ことになっているらしいのだが、コンパイルでエラーになり使用できない。これだけでも、非常に痛い。24ビットで足りるのに、なにを好き好んで32ビット使わねばならないのか。アセンブラであれば、最小限の計算規模に抑えたうえで8ビット単位のアクセスも自在なので、XC8とは比較にならない高速で計算できる。汎用の計算ルーチンさえ作ってしまえば、使い回しできるし。
だが、アセンブラで作り込んだ資産は、PICの機種乗り換えを困難にするんだよな。
メンテナンス製や、目的に応じてPICの使い分けを容易にできるという点で、XC8のメリットは絶大だ。性能的にXC8で間に合うなら、XC8を使う一手。それだけに、余計なことで性能劣化というのは耐えられない。
目を瞑って long 型を使うと、今度は乗算が機能していない。明らかに、上位16ビットに値は入っていない。問題をややこしくしているのは、XC8の sprintf が long 型を処理できないこと。下位16ビットしか表示しない。しかし、>>16 させて上位16ビットを持って来ても、値が入っていない。いやこれもひょっとすると、シフト演算子も16ビットまでしか対応していないのかもしれない。
だんだん頭が混乱して来る。24ビット使えるようにしろよ。使えないなら32ビットをちゃんと扱えよ。
自前でXC8による汎用計算ルーチンを作るとしても、やはりCとアセンブラには決定的な機能差がある。特に、キャリーフラグは大きい。オーバーフローを知るのに、アセンブラならキャリーフラグという1ビットを参照するだけで済む。Cでは、1バイトを見るしかない。これだけで、必要なメモリーサイズが1バイト異なる。しっかり最適化しようとすると、その差は余りにでかい。
まあ本来こういう計算は、なーんも考えずに浮動小数点演算できるSTM32などでやるべきなんだろうな。でも、PIC16F88 のアセンブラでは難なく処理できていただけに・・・仕方なく、バラして16ビット以内で計算できるように組み合わせ、何とか処理する。上下バイトの単独アクセスは union 使えば行けるし。
とりあえず、左右キャタピラの動きに変換することは出来た。
written by higashino [バトルタンク改造Tiger1] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]
Generated by MySketch GE 1.4.1
Remodelling origin is MySketch 2.7.4