これは私がC言語でマクロを使用している初めてのことです。通常はマクロに関数の中に入れたいコードの大きな部分を置き換えようとしています。これは非常に頻繁に使用される割り込みの一部なので、可能な限り最適化する必要があります。ドキュメントを読んだ後、私はコンパイラが関数のインライン展開をサポートしていないことを知り、関数呼び出しのオーバーヘッドを避けたい。このCマクロが構文エラーを引き起こすのはなぜですか?
コード自体はデータをシリアル・イン・パラレル・アウト・シフト・レジスタに送信します。私が見る限り、必要なコードを書き込むための方法はありません。
私はC18コンパイラバージョン3.41とMPLAB X IDEを使用しています。
だからここで私は、関数の形で使用しているコードです:
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;\
\
}
だから私は間違って何をやっていますか?
更新:コメントを削除しました。別の場所で構文エラーが発生しています。
なぜあなたはマクロに関数を回す必要があると思いますか?関数呼び出しのオーバーヘッドが重要な場合は、インライン関数にしてください。 –
@ Paul R私が質問したように、コンパイラは関数のインライン展開をサポートしていません。 – AndrejaKo
...しかし、Paulが言ったように、関数呼び出しのオーバーヘッドはここで重要です。これは結局は1行の関数ではありません。私に[早期最適化](http://c2.com/cgi/wiki?PrematureOptimization)のように見えます。 – Clifford