2010-10-27 3 views
0

Je travaille sur le code embarqué et tente de convertir un grand nombre d'assignations de registres mappés en mémoire aux appels de fonction get()/set(). Je me demandais s'il serait possible de maintenir les assignations d'adresses saupoudrées dans tout le code, mais changez les #defines pour qu'ils prennent l'assignation dans un argument de fonction.Possibilité de convertir une affectation d'adresse en argument de fonction via une macro C?

Way Old:

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

désiré New Way:

#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 

Alors, est-ce scénario possible avec des macros C? Merci pour vos pensées!

+2

Pourquoi voulez-vous faire cela? Quel est le problème avec le code tel qu'il est? –

+1

@Adam Rosenfield - Je suppose que le PO doit mettre à jour une base de code existante pour utiliser un code différent pour définir les valeurs de registre (probablement ajouter quelques validations en premier) et veut le faire avec une intervention minimale. –

+0

@Franci Penov - Correct, je souhaite éviter les opérations de Find + Replace massives s'il est simplement possible de changer le #define. – multiproximus

Répondre

2

Les macros C ne vous permettent pas de faire exactement cela, car ce ne sont qu'une recherche avancée & remplacé par le préprocesseur. Vous pouvez cependant passer la valeur en tant que paramètre macro:

#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 

Dans le cas ci-dessus, en utilisant MOTOR_REG est bien sûr inutile que vous pourriez appeler directement set_motor_reg. Si vous êtes autorisé à utiliser C++, vous pouvez obtenir le comportement voulu en cas de surcharge de l'opérateur.

+0

point-virgule en macro? – Nyan

+0

@Nyan: Merci, corrigé. –

1

Vous ne pouvez pas faire exactement ce que vous voulez avec les macros. (Vous pourriez le faire en C++ avec une surcharge d'opérateur, mais ce n'est probablement pas une option). Pourquoi convertissez-vous tout en fonctions si vous voulez continuer à utiliser les choses comme si elles étaient des variables?

Questions connexes