Endereço 0 sendo substituído por ponteiro nulo no HCS08
Pergunta
Em minha micro HCS08 de 8 bits, sempre que eu chamo uma função de biblioteca que retorna valores para os ponteiros, eu passo, e eu realmente não os quero, joguei um nulo, por exemplo
UART_SendBlock((char *)txstr, strlen(txstr), NULL);
O tipo do último argumento é uint16_t *
e retorna o número de caracteres realmente enviados, um valor com o qual não me importo.
No entanto, eu estava tendo problemas com a porta A no meu micro sendo mangustado toda vez que essa função era chamada, e depurar me apontava para esse argumento estragando as coisas. Os registros de configuração da porta A ao vivo nos endereços 0x0000 e 0x0001, que é onde NULL
(também conhecido como (void *)0
) pontos. Eu pensei NULL
De alguma forma, era mágica onde não faria nada, mas não parece assim.
Minha solução alternativa parece realmente hacker:
#define MNUL (void *)(&mynull)
uint32_t mynull;
Existe uma solução melhor? Tentei definir o MNUL para um segmento de memória não utilizado no meu processador, mas isso causa uma redefinição imediata.
Solução
A menos que a documentação para uart_sendblock afirme que passar um ponteiro nulo está ok, você provavelmente recebe um comportamento indefinido se o fizer - e, nesse caso comportamento".
Basta chamá -lo com um parâmetro, não há razão para ser "inteligente" sobre isso.
uint16_t unused_16;
UART_SendBlock((char *)txstr, strlen(txstr), &unused_16);
Se você for restrito a recursos, faça unused_16
um global e reutilizá -lo em outros lugares
Outras dicas
A função está tentando escrever um valor para onde quer que os últimos argumentos apontem. Você está passando no NULL (0x0000), então o resultado está sendo escrito no local da memória 0x0000, ou sua porta A. Normalmente (em programação geral), a função verificaria o argumento e não tentaria escrever no local se fosse NULL, mas parece que essa função não segue essa convenção. Você precisa alocar uma variável para que a função escreva seu resultado, mesmo que você não o não use.