Можно ли преобразовать адрес назначения в аргумент функции через макрос C? - PullRequest
0 голосов
/ 28 октября 2010

Я работаю над встроенным кодом и пытаюсь преобразовать множество назначенных в память регистровых назначений для вызова функций get () / set ().Мне было интересно, можно ли будет поддерживать присваивание адресов, разбросанных по всему коду, но измените #defines, чтобы они принимали присваивание в качестве аргумента функции.

Old Way:

#define MOTOR_REG (*(volatile unsigned char *)(0xFEE002));  //a memory-mapped register
MOTOR_REG = value;        //sets value into the memory-mapped register

Желаемый новый путь:

#define MOTOR_REG( set_motor_reg(value); )

void set_motor_reg(unsigned char)
{
   //logic to set the motor register
}

MOTOR_REG = value;       //value should be passed in to MOTOR_REG macro

Итак, возможен ли этот сценарий с макросами C?Спасибо за ваши мысли!

Ответы [ 2 ]

2 голосов
/ 28 октября 2010
Макросы

C не позволят вам сделать именно это, поскольку они являются просто расширенным поиском и заменой, выполняемой препроцессором.Однако вы можете передать значение в виде макропараметра:

#define MOTOR_REG(value) set_motor_reg(value)

void set_motor_reg(unsigned char) { //logic to set the motor register }

MOTOR_REG(value); //value is passed in to MOTOR_REG macro

В приведенном выше случае использование MOTOR_REG, конечно, не нужно, поскольку вы можете вызвать set_motor_reg напрямую.Если вам разрешено использовать C ++, вы можете добиться желаемого поведения с перегрузкой операторов.

1 голос
/ 28 октября 2010

Вы не можете делать именно то, что вы хотите с макросами.(Вы можете сделать это в C ++ с перегрузкой операторов, но это, вероятно, не вариант).

Почему вы конвертируете все в функции, если хотите продолжать использовать вещи, как если бы они были переменными?

...