Pergunta

Eu estou escrevendo firmware para uma PIC32MX, usando HiTech PICC32. Um dos problemas que eu quero evitar é que desde que a maioria dos pinos de ter vários nomes (ex. AN0 = RB0 ??= CN2 = PGED1), eu ou alguém pode acidentalmente usar RB0 sem perceber que AN0 já é usado. (Isso pode realmente ser catastrófico, uma vez incorretamente a configuração de um pino analógico / digital pode levar a consumo excessivo de corrente e liberação de fumaça essencial.)

Assim que documenta de forma tão abrangente todos os pinos usado, eu queria saber se havia uma maneira rápida de dirigir esta questão fora no nível de codificação. Eu quero uma macro que as pessoas (principalmente eu) pode usar, dizem CLAIM_PIN(58), que irá emitir um aviso ou erro se ele é executado duas vezes.

(Eu não quero a todo o custo, se a única solução possível é muito horrendo ou insustentável, então eu vou esquecê-lo e apenas desenvolver uma reputação de começar a chorar ou a criação me pegando fogo ou algo assim. Eu também vi essa pergunta sobre macros produzindo , o que exclui isso.)

Devo esclarecer: o código é escrito em múltiplas unidades de compilação (pelo menos, eu acho que isso é o que significa a frase). Eu tenho um arquivo .h / .c para o meu código A2D, da mesma forma para SPI, e similarmente para diversos periféricos que apenas usar certas portas de E / S. O espaço não é realmente um problema, meu folhas de código muito espaço na PIC32MX; Também posso usar outra bandeira __DEBUG para remover o código pin verificação para uso final.

Foi útil?

Solução

Ok, aqui. Nenhum custo de tempo de execução.

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

CLAIM(58);
CLAIM(58);

Se correr duas vezes ele vai erro fora:

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

Para estender a seleção para várias unidades de compilação que você vai querer enrolar o macro em #if DEBUG porque estaria usando o vinculador para detectar o choque e, portanto, teria uma pegada de tempo de execução.

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

Outras dicas

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

Agora, quando dois pedaços de tentativa código para reivindicar um pino, o símbolo será duplamente definido e quer o compilador ou o vinculador irá gerar um erro.

Editar: Com base nos comentários, este pode vir melhor:

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

Se você pode pagar a sobrecarga de tempo de execução ou se isso é apenas para a depuração, eu tinha acabado de criar algo como uma função IOPinOpen() que manteve a par de pinos em uso em vez de lidar com artifícios macro.

de

Por outro lado, Mark Ransom atualizados resposta valia um +1.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top