山中様,藤原様,ひやした様 レス,ありがとうございます。 >>> register unsigned a= (count&(divNum-1));/*=count%divNum 高速化*/ >>> DA.DR0=*(adrR+a);/*右足,=adrR[count%divNum];*/ >>> DA.DR1=*(adrL+a);/*左足*/ >>> count++; >>かなり最適化されてると思います、1バイトx2個のデータなら >>ワードデータにし1回のアドレス演算で済む様にしては、それにし >>てもこれだけの処理なのに重すきる様な、やはりhamayanさんが >>言われてる様に逆アセンブルして原因を追求してみるしか無いと >>思います。 そうなんです。これだけの処理なのに・・・。なにか別のところに 原因があるような気がしてなりません。 逆アセンブルは当方の環境ではできないのですが, 最終的には,環境を整えてするしかないかもしれません。 >>adrRやadrLの定義のしかたにより型変換などでムダな事やってそう >>な気もしますが。 グローバル変数として,次のように定義して, unsigned char *adrR,*adrL;/*データのアドレッシング用*/ main(から呼ばれる関数)で次のように代入しています。 adrR=((unsigned char *)dat+(ratio<<10)+(ampR<<6));/*高速化*/ adrL=((unsigned char *)dat+(ratio<<10)+(ampL<<6));/*高速化*/ >同感。これ以上の「劇的な最適化は」は出来ないように見えますね。 >で、ワタシ、最近こればっかりなのですが、どこで時間が掛かっているのか >オシロとIOポート作戦で調べるとか。(^^; (^^;)・・・やってみます。 >具体的な事がわからないので全くハズしているかもしれませんが、 >システム全体のアルゴリズムを再考してDMAのIOモードを使うとか、 >そういうソリューションは検討してみるのも手かもしれませんね。 作っているのは,マイクロロボット駆動ソフトウェアなのですが, アクチュエータ駆動が正弦波,電磁石駆動がポートのビット操作・・・です。 アクチュエータ(PZT)も電磁石もぞれぞれ2個ずつあります。 >最もシンプルなコードで現象を再現して頂ければ >イエローソフトのコンパイラ(で良ければ)で >コンパイルしたアセンブラリストを提示できますけど。 ありがとうございます。 シンプルなコードで再現を目指してみます。 その仮定でとっかかりがみつかるかもしれません。 その他,お気づきの点ありましたら,今日一日悩みぬく予定ですので, 是非,ご教授ください。 // Katsushi MATSUBAYASHI matsu@xxxxxxxxxxxxxx // Associate Professor, Tokyo National College of Technology