先輩とのお話、C言語の小技


昨日、大学で行われた公演を聴きに講堂に行ったのですが。
そこで、研究室の先輩(研究員さん?)にばったりあって、HPに公開しているソースを読んでいただいたことが判明。
そこから、深い話に発展していきました。その方は組み込みやモバイルのプログラムに長く携わっている方で「高速化」についていろいろと駄目出しをいただきました。
PWMのソースに関してはif文へのペナルティ、シリアルはバッファのペナルティをはじめ、浮動少数に関するペナルティ・・・「ぜんぜん違うソースになるんちゃうかー!?」ってとこまで、ペナルティがあって、でも、逆にそれを改善したら、かなり進歩出来そうです。
そんなお話をしていたら2時間が経っていました。
公演を聴きに来てたのにロビーで話しているうちに、公演が終わっていた!!
とは言え、公演を聴いていた友達に公演のことを聞いてみると微妙な表情をしていたので、個人的には有意義な時間だったなぁ・・・。と(いいのか!?)
近々、HP上に公開しているソースにもう一度テコ入れしてみようと思います。
(レスコンで実際に使う予定もあるので・・・。)
あと、KUMACOと自作モーターのページもちゃんとまとめたほうがいいかなぁ。

コメント

  1. Shibasaki より:

    初めまして。ホームページは結構以前から見せてもらっています。
    ロボットや組み込みコンピュータはまったくの専門外なので「すごいなあ」と思います。
    C言語については少々使えるので、今回何かアドバイスできるかと思い pwm_init.c を読んでみました。
    何をするものなのかよくは分からないのですが、いくつかプログラミング的に気になるところはありました。
    まず、定義されてない変数(P1 等。ハードウェア関連ですか?)が数多く登場しています。
    が、インクルード文が見当たりません。暗黙のヘッダファイルがあるんでしょうか?
    グローバル変数は static 宣言して他のソースコードからアクセスできないようにするのが安全です。
    値の参照や変更は(それを許可する場合)、同じソースコード内の専用の関数を使って行うようにします。
    こうすることで変数名の衝突を気にしなくてもよくなり、またプログラム全体の見通しがよくなります。
    一連の方法は「カプセル化」と呼ばれるものです。ただ、これは関数を通す分だけ処理速度が低下するので、
    処理能力の高くない環境では問題になるのかもしれません。
    次に、int_imia0・int_imia1・int_imia2 関数についてですが、関数名が不適当だと思いました。
    返り値も引き数も int 型ではないですし、また関数名だけでは何をするための関数なのか把握できません。
    あ、もしかして interrupted (割り込み時)でしょうか? 命名が自由でないなら変えられないですね……
    (続きます。)

  2. Shibasaki より:

    関数内に移ります。
    if (f_pulse){
    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;
    }
    cnt1++;
    if (cnt1 > 7) cnt1=0;
    という部分ですが、
    if (f_pulse) P1.DR.BYTE = 1 7) cnt1 = 0;
    と書いてしまっても問題ないと思います。C言語を使うのならC言語の便利な機能を使った方が楽です。
    (「

  3. Shibasaki より:

    上の書き込みは投稿時に大事な部分が二か所消えてしまっています。正しくは、
    if (f_pulse) P1.DR.BYTE = 1 << cnt1;
    if (++cnt1 > 7) cnt1 = 0;
    と、
    (「<&lt」はビットを左に指定桁だけずらします。二進数なので一桁ずらすごとに倍になります。
    また、前置きの「++」は変数の値を 1 増やして、その後に使用するという演算子です。)
    です。

  4. みっちー より:

    どうも!
    Shibasakiさんこんにちわ!
    ご指摘ありがとうございます!
    pwm_init.cに関しては最近だいぶん見直して新しいのをそろそろ公開しようかなと考えていたのですが、
    P1.DR.BYTE = 1 7) cnt1 = 0;
    に関しては、僕の中ではif文の真と偽のときの処理量を変えないためにif文は極力使わないように
    cnt1= (++cnt1 & 0x07);
    で、行こうかなと考えていました。
    定義されてない変数(P1 等。ハードウェア関連ですか?)が、コレに関しては、開発環境(GDL)と、マイコンが同じであることを前提にしているので、暗黙のヘッダが存在しますが、次回公開時は、サンプルのメイン関数もつけていちおうコンパイルが通る状態で公開したほうが親切なのかなぁとも考えています。
    いろいろご指摘ありがとうございます。

  5. みっちー より:

    付け足して、関数名称の件ですが、int_imia0・int_imia1・int_imia2 関数についてはタイマ割り込みの関数なので変更はできません。
    on_off_pwm 関数の名前についてはご指摘の通りだと思います。引数で取るより関数を分けてしまったほうが分かりやすいし、処理も早いし…ですね!
    いろいろ参考になります

みっちー へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

アーカイブ

広告

Top