Pregunta

Estoy escribiendo firmware para una PIC32MX, usando HiTech PICC32. Uno de los problemas que quiero evitar es que, dado que la mayoría de los pines tienen varios nombres (por ejemplo, AN0 = RB0 ??= CN2 = PGED1), yo u otra persona podría usar RB0 accidentalmente sin darme cuenta de que AN0 ya está en uso. (Esto en realidad puede ser catastrófico, ya que la configuración incorrecta de un pin analógico / digital puede provocar un consumo excesivo de corriente y la liberación de humo esencial).

Además de documentar exhaustivamente cada pin utilizado, me preguntaba si había una forma rápida de solucionar este problema a nivel de codificación. Quiero una macro que la gente (principalmente yo) pueda usar, digamos CLAIM_PIN (58) , que emitirá una advertencia o error si se ejecuta dos veces.

(No quiero esto a toda costa, si la única solución posible es demasiado horrenda o imposible de mantener, entonces lo olvidaré y simplemente desarrollaré una reputación de estallar en llanto o prenderme fuego o algo así. También vi esta pregunta sobre macros de producción de macros , lo que descarta eso.

Debo aclarar: el código está escrito en múltiples unidades de compilación (al menos, creo que esto es lo que significa la frase). Tengo un archivo .h / .c para mi código A2D, de manera similar para SPI, y de manera similar para varios periféricos que solo usan ciertos puertos de E / S. El espacio no es realmente un problema, mi código deja mucho espacio en la PIC32MX; también puedo usar otro indicador __DEBUG para eliminar el código de verificación del pin para uso final.

¿Fue útil?

Solución

Ok, aquí. Sin costo de tiempo de ejecución.

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

CLAIM(58);
CLAIM(58);

Si se ejecuta dos veces, se generará un error:

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

Para extender la verificación a varias unidades de compilación, querrá ajustar la macro en #if DEBUG porque estaríamos usando el enlazador para detectar el choque y, por lo tanto, tendría una huella de tiempo de ejecución.

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

Otros consejos

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

Ahora, cuando dos piezas de código intentan reclamar un pin, el símbolo se definirá doblemente y el compilador o el vinculador generarán un error.

Editar: Según los comentarios, esto podría resultar mejor:

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

Si puede permitirse la sobrecarga de tiempo de ejecución o si esto es solo para la depuración, simplemente crearía algo como una función IOPinOpen () que realiza un seguimiento de los pines en uso en lugar de lidiar con el truco macro .

Por otro lado, valió la respuesta actualizada de Mark Ransom un +1.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top