Вам нужно будет добавить пробелы между литералов и макросы, в противном случае компилятор будет считать их недействительными интеграл и плывут константы:
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));
Таким образом, нет никакой путаницы, и избежать каких-либо проблем очередностью.
Редактировать свой вопрос, чтобы включить тег 'C'; и не могли бы вы рассказать нам, как вы скомпилировали свой код; какой компилятор вы используете? для 'gcc' У меня есть ошибка: недопустимый суффикс« MHZ »на целочисленной константе. но я работаю, если я изменил его на 'SysTick_Config (96 MHZ * 2.5 MSEC);' – houssam
Вероятно, это не '1' в конце, а буква 'l', длинный суффикс для интегральных констант. – deniss
спасибо..Its 'l', а не 1..Мой компилятор показывает l и 1 как то же ... так что, может быть, я запутался –