Это первый раз, когда я использую макросы в C, и я пытаюсь заменить большой раздел кода, который я обычно добавляю в функцию с макросом. Это часть прерывания, которое будет использоваться довольно часто, и поэтому мне нужно как можно больше оптимизировать его. После прочтения документации я видел, что компилятор не поддерживает функцию inlining, и я хочу избежать служебных вызовов функции.Почему эта макрокоманда 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 Как я уже сказал в вопросе, компилятор не поддерживает функцию inlining. – AndrejaKo
... но, как сказал Пол, действительно ли здесь важна накладная функция вызова - это не одна функция линии в конце концов. Похоже на [преждевременную оптимизацию] (http://c2.com/cgi/wiki?PrematureOptimization) для меня. – Clifford