11
votes

#pragma à l'intérieur #define

Je travaille dans un micro-contrôleur en utilisant la langue C forte>. Dans ce micro spécifique, les interruptions doivent être définies en utilisant #pragma code> en suivant: xxx pré>

code> est l'adresse l'interruption de la table vectorielle. Le code> est 1 ou 2. Par exemple, pour définir une interruption dans le port 0 goupille 0: p> xxx pré>

Nous définissons le service d'interruption réel Routine ailleurs et utilisez le pointeur de fonction (comme isr_p00 code> dans l'exemple) pour les exécuter. p>

Il serait pratique si les interruptions pouvaient être définies à l'aide d'une macro. Je veux faire définir une macro de la manière suivante: p> xxx pré>

Le compilateur lancer l'erreur suivante: p> xxx pré>

indiquant la ligne suivante : P>

static void _int_##INT_NAME() { (*isr_##INT_NAME)(); }


2 commentaires

Quel microcontrôleur et quel compilateur? Si elle est basée sur GCC, il peut y avoir un attribut spécial macro yo peut utiliser, comme dans la micropuche C32: void __isr (_timer_5_vector) quelqueisr (vide)


Le micro est OKI 431 et le compilateur provient de OKI: IDEU8.


3 Réponses :


1
votes

Un travail de travail consiste à utiliser la génération de code ou une autre macro-language pour prépraper votre code.

IE Écrivez le code avec une extension différente.

Avez votre rôle de maquillage ou votre appel similaire la macro language (E.G. M4) ou un script de quelque forme que ce soit pour générer un fichier .C

puis compilez cela.


1 commentaires

Vous recherchez une solution qui n'invoquera pas d'autre script.



0
votes

Autant que je sache, ce que vous êtes spécifiquement demande est impossible. Je présume un préprocesseur qui fonctionne comme le préprocesseur GNU C . Dans le manuel pour cela, Il indique :

Le compilateur ne reconstitue pas la sortie du préprocesseur. Chaque jeton de prétraitement devient un jeton de compilateur.


1 commentaires

J'ai aussi pensé que c'est impossible. Mais je me demande si vous pouvez atteindre une autre façon.



13
votes

C99 a le nouveau mot clé _pragma qui vous permet de placer #pragma à l'intérieur de macros. Fondamentalement, il s'attend à une chaîne comme argument qui correspond au texte que vous auriez donner à la directive #pragma .

Si votre compilateur ne supporte pas cela (GCC fait) et que vous iriez une implémentation externe de ce dont vous avez besoin (comme indiqué, m4 pourrait être un choix) le meilleur serait probablement Pour rester aussi proche que possible de ce non-nouveau _pragma . Ensuite, une fois que votre constructeur de compilateur attire la standard, vous pouvez simplement arrêter d'utiliser votre script.


2 commentaires

Le compilateur ne prend pas en charge _pragma. :(


@Donotalo, dommage. Il est que 11 ans maintenant que cette norme existe ;-) Vous pouvez essayer une solution mixte en utilisant simplement gcc comme pré-processeur, puis en utilisant votre compilateur natif pour les étapes suivantes de la compilation.