Question

Sur mon Freescale HCS08 micro 8 bits, chaque fois que j'appelle une fonction de bibliothèque qui renvoie des valeurs de pointeurs je passe, et je ne veux pas vraiment, j'ai jeté dans un NULL, par exemple.

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

Le type du dernier argument est uint16_t * et retourne le nombre de caractères effectivement envoyé, une valeur que je ne me soucie pas.

Cependant, j'avais des problèmes avec le port A sur mon micro flouer chaque fois que cette fonction a été appelée, et le débogage m'a fait remarquer que les choses vissant arguments vers le haut. Les registres de configuration de Port A vivent à des adresses 0x0000 et 0x0001, qui est où les points NULL (aka (void *)0). Je pensais que NULL était en quelque sorte magique où il ne serait pas faire quoi que ce soit, mais il ne semble pas.

Ma solution se sent vraiment pirater:

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

Y at-il une meilleure solution? J'ai essayé de définir MNUL à un segment non utilisé de la mémoire sur mon processeur, mais qui provoque une réinitialisation immédiate.

Était-ce utile?

La solution

À moins que la documentation UART_SendBlock indique que le passage un pointeur NULL est ok, vous obtenez probablement un comportement indéfini si vous le faites - et dans ce cas, il semble que la fonction écrit juste à l'adresse que vous passez, adresse 0 - ce qui irait à sous « comportement non défini ».

Il suffit d'appeler avec un paramètre, il n'y a aucune raison d'être « intelligent » à ce sujet.

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

Si vous êtes ressources limitées, faire unused_16 une approche globale et le réutiliser dans d'autres endroits

Autres conseils

La fonction tente d'écrire une valeur dans chaque fois que les derniers points d'argument. Vous êtes de passage à NULL (0x0000), de sorte que le résultat est en cours d'écriture à l'emplacement de mémoire 0x0000 ou votre port A. En général (dans la programmation générale), la fonction vérifierait l'argument et ne pas essayer d'écrire à l'emplacement si elle était NULL, mais il semble que cette fonction ne suit pas cette convention. Vous devez allouer une variable pour la fonction d'écrire son résultat, même si vous ne l'utilisez pas.

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