Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil preprocessor аля MACRO в assembler
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
AndreyS
Добрый день всем.

Меня интересует вопрос и очень давно.
Как в Си Keil с помощью команд препроцессора произвести некое вычисление с количеством итираций болшее 1.

Например раньше в асме у меня это не вызывало проблем через директиву SET.
В Си не нашел (может плохо искал). Но на #define SS SS+2 компилятор ругается. В целом варнинги не напрягают. А напрягает их количество, если я делаю такое большое число раз.

Подскажите плиз, как на стадии компиляции мне высичлить константу???

Например это нужно для вычисления значения 2^x

Спасибо.
Палыч
Цитата
на #define SS SS+2 компилятор ругается.


Странная конструкция... Вы что хотели то определить?

Цитата
Например это нужно для вычисления значения 2^x


Например, так

#define E2(X) (1 << (X))
AndreyS
Цитата(Палыч @ Dec 24 2007, 19:04) *
Странная конструкция... Вы что хотели то определить?
Например, так

#define E2(X) (1 << (X))



Спасибо.

Вы задали вектор моим размышлениям smile.gif

А конструкцией я пытался реализовать следующее ss+=2;
Палыч
Цитата(AndreyS @ Dec 24 2007, 22:06) *
А конструкцией я пытался реализовать следующее ss+=2;
В ассемблере есть (обычно) директива SET и директива EQU - препроцессорный define, скорее, аналог последней: вместо определенного в define идентификатора подставляется его значение в текст программы. Первые препроцессоры были совершенно отделены от транслятора, и тупо подставляли в тексте программы вместо одной последовательности символов другую, ничего не зная о значениях этих символов. Сейчас, хотя препроцессор и интегрирован с транслятором, но "нарастить" значения идентификаторов попрежнему не может. Впрочем, нужно ли это? Я себе не представляю программу, в которой это пригодилось бы.
AndreyS
Добрый день

Цитата
Сейчас, хотя препроцессор и интегрирован с транслятором, но "нарастить" значения идентификаторов попрежнему не может. Впрочем, нужно ли это? Я себе не представляю программу, в которой это пригодилось бы.


По поводу увеличивающихся по значению идентификаторов.

Вот пример (в асме он используется всегда):

Код
    LABEL    SET    0
START_TIMER_TIME_OUT    MACRO COUNTER,LABEL_NUM
    COUNTER    SET    COUNTER+1

    JB TR2,SUF&LABEL_NUM
    MOV TMR2L,#LOW(TIME_MINIMUM)       ; Мин. промежуток времени для задержки по IIC шине (для EEPROM и термодатчиков)
    MOV TMR2H,#HIGH(TIME_MINIMUM)
SUF&LABEL_NUM:
    SETB TR2                                  ; Запускаем отсчет времени
    ENDM


Вызоа макроса

Код
    START_TIMER_TIME_OUT LABEL,%LABEL        ; Запускаем таймер


Может быть пример неудачный. Но использование макросов с проверкой оправдано когда критичны потери времени на вход и выход в/из процедуры.

Удачи.
Палыч
Цитата(AndreyS @ Dec 25 2007, 16:37) *
По поводу увеличивающихся по значению идентификаторов. Вот пример ...
Может быть пример неудачный. Но использование макросов с проверкой оправдано когда критичны потери времени на вход и выход в/из процедуры.
Ну, с ассемблером - там всё ясно. Речь шла о языке С.
AndreyS
Цитата(Палыч @ Dec 25 2007, 18:25) *
Ну, с ассемблером - там всё ясно. Речь шла о языке С.



А ну я подошел к своей проблеме топорно.
На основании опыта с асмом, решил реализовать 2^x как макроопределения.
Ваш вариант наставил на путь истинный smile.gif

После асма мне еще тяжело перейти к дефайнам. Меня интересовал вопрос, чтобы после работы препроцессора полученное значение было подставлено в код, а не вся формула. А до сдвига константы на константу я не дошел smile.gif

Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.