2015-05-25 6 views
-5
#define MHZ *1000000l 
#define MSEC /1000l 

Это функция DefinationСомнение Макросов в C

unsigned int SysTick_Config(unsigned int ticks) 
{ 
    if (ticks > SysTick_LOAD_RELOAD_Msk) 
    return (1); // Reload value impossible 

    STRELOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; // set reload register 

    return (0); // Function successful 
} 

функции вызываются, как указано ниже

SysTick_Config(96MHZ * 2.5MSEC); 

Моих сомнений по поводу макросов used.Does пишущих 96МЦев означают, что заменяется на (96 * 1000000l)? 96 размножается на 1000000? Кроме того, что означает/1000l в #define MSEC/1000l? почему это/используется.

Я использую IAR Embedded Workbench

+0

Редактировать свой вопрос, чтобы включить тег 'C'; и не могли бы вы рассказать нам, как вы скомпилировали свой код; какой компилятор вы используете? для 'gcc' У меня есть ошибка: недопустимый суффикс« MHZ »на целочисленной константе. но я работаю, если я изменил его на 'SysTick_Config (96 MHZ * 2.5 MSEC);' – houssam

+1

Вероятно, это не '1' в конце, а буква 'l', длинный суффикс для интегральных констант. – deniss

+0

спасибо..Its 'l', а не 1..Мой компилятор показывает l и 1 как то же ... так что, может быть, я запутался –

ответ

0

При использовании макроса рядом с номером, как это, там должно быть пробел между числом и макро. В этом случае вы должны увидеть ошибку компилятора.

/1000l просто деление на 1000.

+0

звучит скорее как комментарий, чем ответ –

+0

Ну, я отвечал на вопрос, который раньше был вопросом в OP, но OP был изменен с тех пор. * shrug * –

+0

Я знаю чувство, движущееся цель –

0

Вам нужно будет добавить пробелы между литералов и макросы, в противном случае компилятор будет считать их недействительными интеграл и плывут константы:

SysTick_Config(96 MHZ * 2.5 MSEC); 

После предварительной обработки эта линия будет расширена до

SysTick_Config(96 *1000000l * 2.5 /1000l); // trailing l makes the type 
              // of the constant a long 
              // int instead of a regular int 

Обратите внимание, что этот стиль программирования вызовет проблемы, если вы пишете что-то вроде

SysTick_Config(a + b MHZ * c - d MSEC); 

вам нужно будет убедиться, что вы явно групповые вещи вместе, как

SysTick_Config((a+b) MHZ * (c-d) MSEC); 

Я знаю, что некоторые люди любят писать код таким образом, думая, что это самодокументирован. Я думаю, что это ошибка, и не только потому, что это может привести к проблемам с приоритетом.

Более безопасный способ заключается в использовании -функции, как макрокоманду, которая принимает аргумент:

/** 
* When creating macros for arithmetic expressions, it's a good 
* idea to use parentheses around each macro argument and the 
* entire macro expansion itself; this way you can avoid 
* precedence issues if you pass an expression like a+b to 
* the macro. 
*/ 
#define TO_MHZ(x) ((x) * 1000000L) // use uppercase L to avoid confusion 
#define TO_MSEC(x) ((x)/1000L) // with the digit 1 

и использовать их в качестве

SysTick_Config(TO_MHZ(96) * TO_MSEC(2.5)); 

который расширяется к

SysTick_Config(((96) * 1000000L) * ((2.5)/1000L)) 

или

SysTick_Config(TO_MHZ(a+b) * TO_MSEC(c-d)); 

, которая расширяется до

SysTick_Config(((a+b) * 1000000L) * ((c-d)/1000L)); 

Таким образом, нет никакой путаницы, и избежать каких-либо проблем очередностью.

Смежные вопросы