Domanda

Sul mio 8-bit Freescale HCS08 micro, ogni volta che io chiamo una funzione di libreria che i valori restituisce a puntatori lo passo, e io in realtà non li vogliono, ho buttato in un NULL, per es.

UART_SendBlock((char *)txstr, strlen(txstr), NULL);

Il tipo di l'ultimo argomento è uint16_t * e restituisce il numero di caratteri effettivamente inviato, un valore non mi interessa circa.

Tuttavia, ho avuto problemi con l'attacco A sul mio micro essere hosed ogni volta che la funzione è stata chiamata, e il debug mi ha segnalato che l'argomento avvitare le cose. registri di configurazione di Port un live agli indirizzi 0x0000 e 0x0001, che è dove NULL (aka (void *)0) punti. Ho pensato NULL era in qualche modo magico dove non sarebbe in realtà fare nulla, ma non sembra così.

La mia soluzione si sente veramente mod:

#define MNUL (void *)(&mynull)
uint32_t mynull;

C'è una soluzione migliore? Ho cercato di definire MNUL ad un segmento non utilizzata della memoria sul mio processore, ma che provoca un reset immediato.

È stato utile?

Soluzione

A meno che la documentazione per UART_SendBlock afferma che passando un puntatore NULL è ok, è probabilmente ottenere un comportamento indefinito se si fa - e in questo caso sembra che la funzione appena scrive all'indirizzo si passa, l'indirizzo 0 - che andrebbe in "comportamento indefinito".

Basta chiamare con un parametro, non c'è motivo di essere "intelligente" su di esso.

uint16_t unused_16;
UART_SendBlock((char *)txstr, strlen(txstr), &unused_16);

Se siete delle risorse limitate, make unused_16 un globale e riutilizzarlo in altri luoghi

Altri suggerimenti

La funzione sta cercando di scrivere un valore nel ogniqualvolta gli ultimi punti argomento. Si sta passando NULL (0x0000), quindi il risultato è stato scritto alla locazione di memoria 0x0000, o la porta A. Di solito (in programmazione generale) la funzione sarebbe controllare l'argomento e non provare a scrivere per la posizione se fosse NULL, ma sembra questa funzione non segue tale convenzione. È necessario allocare una variabile per la funzione di scrivere il suo risultato a, anche se non si ha intenzione di usarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top