大学でアドバイスもらったり、Shibasakiさんにアドバイスをもらったりでいろいろ最適化されてきたのでそろそろ公開できそうな感じになってきたソース。
皆様には本当に感謝しています。
それで、結局、PWMのところでいろんな案が出てきて結局どれにしようか迷っている。
もともとのソースはこれ。(1)
if (cnt1==0)P1.DR.BYTE=0x01; if (cnt1==1)P1.DR.BYTE=0x02; if (cnt1==2)P1.DR.BYTE=0x04; if (cnt1==3)P1.DR.BYTE=0x08; if (cnt1==4)P1.DR.BYTE=0x10; if (cnt1==5)P1.DR.BYTE=0x20; if (cnt1==6)P1.DR.BYTE=0x40; if (cnt1==7)P1.DR.BYTE=0x80;
それに対して自分の出した改善策はコレだったのですが・・・。(2)
switch(cnt1){ case 0: P1.DR.BYTE=0x01; break; case 1: P1.DR.BYTE=0x02; break; case 2: P1.DR.BYTE=0x04; break; case 3: P1.DR.BYTE=0x08; break; case 4: P1.DR.BYTE=0x10; break; case 5: P1.DR.BYTE=0x20; break; case 6: P1.DR.BYTE=0x40; break; case 7: P1.DR.BYTE=0x80; break; }
こんな案や(3)
static unsigned char byte[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; P1.DR.BYTE = byte[cnt1];
こんな案を頂きました(4)
P1.DR.BYTE = 1 << cnt1;
突っ込みが入るくらいなので、(1)がプログラム的に劣っているのは間違いないのです・・・。
自覚もありました。それで検証してみたのですが・・・。
見た目に関して言えば、(1)、(2)、(3)は人間に分かりやすいという性質がある。
(4)はパッと見た感じ分かりにくいですがインテリジェンスな感じがします。行数が少ないというメリットもありますね。
実行時間で比較した場合、(2)(3)は、アセンブリを見た感じ、どの値をとっても実行したときのクロック数は同じ感じです。
(4)に関しては1ビットシフトをn回分繰り返すということで実行速度にバラつきが出そうな感じです。(1)は当然比較回数が異なるのでバラつきが出ます。
で、結局「-S」のオプションでアセンブリを出したりしてみたもののよく考えたらCISCであるH8は命令ごとにステートが違うので単純に行数では実行速度の比較が出来ない・・・。しかもちょっと分かりにくい。
ちなみにアセンブリの命令一覧を見ていて8ビットのローテーション命令があった。
左シフトしてあふれたケタを右に入れる命令。
これがC言語ではじめから存在したら何も問題はないのに・・・。(実はあるのだろうか?)
来週は実機で激しくループさせてみたり、パソコンで実行時間計ったりしてみたいと思う。
まぁ、ぶっちゃけた話、どのソースを使っても((1)でも)、サーボの動きに見た目の変化はなかったんだけどねw
ここまで来たら徹底的に実験したいと思います。