2

Cでマクロを使用するのはこれが初めてであり、通常は関数に配置するコードの大部分をマクロに置き換えようとしています。これは非常に頻繁に使用される割り込みの一部であるため、可能な限り最適化する必要があります。ドキュメントを読んだ後、コンパイラが関数のインライン化をサポートしていないことを確認しました。関数呼び出しのオーバーヘッドを回避したいと思います。

コード自体がデータをシリアル入力パラレル出力シフトレジスタに送信します。私が見る限り、必要なコードを記述するためのより短い方法はありません。

私はC18コンパイラバージョン3.41とMPLABXIDEを使用しています。

したがって、関数形式で使用しているコードは次のとおりです。

void first_one(void)
{
   //3 invisible zeroes
            LATBbits.LATB1=0; //data set to zero

            LATBbits.LATB0=1;//first clock
            LATBbits.LATB0=0;

            LATBbits.LATB0=1;//second clock
            LATBbits.LATB0=0;

            LATBbits.LATB0=1;//third clock
            LATBbits.LATB0=0;
            //end of invisible zeroes

            //two visible zeroes    
            LATBbits.LATB0=1;//first clock
            LATBbits.LATB0=0;

            LATBbits.LATB0=1;//second clock
            LATBbits.LATB0=0;
            //end of two visible zeroes

            LATBbits.LATB1=1;//Data is now one

            LATBbits.LATB0=1;
            LATBbits.LATB0=0;
            //one 

            LATBbits.LATB1=0;//Data is now zero

            LATBbits.LATB0=1;//first clock
            LATBbits.LATB0=0;

            LATBbits.LATB0=1;//second clock
            LATBbits.LATB0=0;

            //after this, everything should be in place
            LATBbits.LATB0=1;
            LATBbits.LATB0=0;
}

関数をこのマクロに変えました:

#define first_one() {  \
\
            LATBbits.LATB1=0;\               
                              \
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
                                \
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
                            \
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
            \                                
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
\
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
            \
            LATBbits.LATB1=1;\
\
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\    
\
            LATBbits.LATB1=0;\
             ^^^ The syntax error is here!
\
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
\
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
\
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
\
                     }

だから私は何が間違っているのですか?

更新:コメントを削除しましたが、別の場所で構文エラーが発生しています。

4

4 に答える 4

8

トークンの後にスペースがないことを確認してください\。一部のコンパイラは、これに対してコンパイルエラーを発行します。

于 2012-05-05T17:03:13.577 に答える
3

コメントが削除される前に行がスプライスされるため、\in \//3 invisible zeroes は行を継続しません。

コメントを削除するか、Cスタイルのコメント(/* 3 invisible zeroes */)を使用して、行を続けるにコメントを配置する必要があります。\

于 2012-05-05T16:40:37.583 に答える
1

問題は、コメントとプリプロセッサがそれらを処理する方法にあります。コメントを削除すると、これは正常に機能するはずです。交互に使用/*コメント*/

于 2012-05-05T16:47:07.817 に答える
1

3つの提案:

まず、それぞれの後に末尾のスペースがないことを確認します\

()次に、引数を取ることを意図していない場合は、マクロ名からを削除します。 以下のコメントごとに編集します。

最後に、マクロの内容をdo {...} while(0)(末尾のセミコロンなしで)でラップします。このように、first_one();コードを記述するときに、閉じ中括弧の後に偽のセミコロンが表示されることはありません。

要するに、

#define do_first         \
  do {                   \
    LATBbits.LATB0 = 1;  \
    ...                  \
  } while(0)

編集Lundinは、これは古風で不必要であると指摘しています。マクロがフォームのステートメントに展開された場合、診断を回避する必要があると常に信じていました{...};-明らかに私は間違っていました。しかし、私はまだそれを文体の選択として好みます。

于 2012-05-05T17:17:38.320 に答える