Question

J'écris un micrologiciel pour un PIC32MX à l'aide de HiTech PICC32. Un des problèmes que je veux éviter est que, comme la plupart des broches ont plusieurs noms (par exemple, AN0 = RB0 ??= CN2 = PGED1), je ou quelqu'un d'autre pourrais utiliser accidentellement RB0 sans se rendre compte que AN0 est déjà utilisé. (Cela peut en réalité être catastrophique, car la configuration incorrecte d’une broche analogique / numérique peut entraîner une consommation excessive de courant et le dégagement de fumée essentielle.)

En plus de documenter de manière détaillée chaque broche utilisée, je me demandais s’il existait un moyen rapide de régler ce problème au niveau du codage. Je veux une macro que les gens (principalement moi-même) peuvent utiliser, disons CLAIM_PIN (58) , qui émettra un avertissement ou une erreur si elle est exécutée deux fois.

(Je ne veux pas cela à tout prix, si la seule solution possible est trop horrible ou trop incontrôlable, alors je l'oublierai et je ne ferai que développer la réputation de fondre en larmes ou de m'immoler par le feu. a vu cette question sur les macros produisant des macros , ce qui les exclut.)

Je devrais préciser: le code EST écrit en plusieurs unités de compilation (du moins, je pense que c’est ce que signifie l’expression). J'ai un fichier .h / .c pour mon code A2D, de même pour SPI et pour divers périphériques utilisant uniquement certains ports d'E / S. L’espace n’est pas vraiment un problème, mon code laisse beaucoup de place sur le PIC32MX; De plus, je peux utiliser un autre indicateur __DEBUG pour supprimer le code de vérification du code PIN pour une utilisation finale.

Était-ce utile?

La solution

Ok, ici. Aucun coût d'exécution.

#define CLAIM(n) struct busy##n {}

CLAIM(58);
CLAIM(58);

S'il est exécuté deux fois, l'erreur se produira:

z.c:4: error: redefinition of ‘struct busy58’

Pour étendre le contrôle à plusieurs unités de compilation, vous souhaitez placer la macro dans #if DEBUG , car nous utiliserions l'éditeur de liens pour détecter le conflit et créerions donc une empreinte au moment de l'exécution.

#define CLAIM(n) char busy##n = 1;
#define CLAIM(n) void busy##n() {} // bdonlan

Autres conseils

#define CLAIM_PIN(n) char claimed_pin_##n;

Désormais, lorsque deux morceaux de code tentent de revendiquer une broche, le symbole est défini de manière double et le compilateur ou l'éditeur de liens génèrent une erreur.

Modifier: Selon les commentaires, cela pourrait être meilleur:

#define CLAIM_PIN(n) void claimed_pin_#nn(void) {}

Si vous pouvez vous permettre la surcharge d’exécution ou si c’est juste pour le débogage, je créerais quelque chose comme une fonction IOPinOpen () qui gardait la trace des pins en cours d’utilisation au lieu de gérer les ruses des macros. .

D'autre part, la réponse actualisée de Mark Ransom valait la peine un +1.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top