2 Stimmen

Adresse 0 wird von NULL-Zeiger auf HCS08 überschrieben

Auf meinem 8-Bit Freescale HCS08 Mikro, wann immer ich eine Bibliotheksfunktion aufrufe, die Werte an Zeiger zurückgibt, die ich übergebe, und ich will sie nicht wirklich, habe ich ein NULL hineingeworfen, z.B.

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

Der Typ des letzten Arguments ist uint16_t * und gibt die Anzahl der tatsächlich gesendeten Zeichen zurück, ein Wert, der mir egal ist.

Ich hatte jedoch Probleme mit Port A auf meinem Mikrofon, der jedes Mal, wenn diese Funktion aufgerufen wurde, verstopft war, und die Fehlersuche wies mich darauf hin, dass dieses Argument die Dinge durcheinander brachte. Die Konfigurationsregister von Port A befinden sich an den Adressen 0x0000 und 0x0001, also dort, wo NULL (alias (void *)0 ) Punkte. Ich dachte NULL irgendwie magisch war, wo es eigentlich nichts bewirken würde, aber es scheint nicht so zu sein.

Mein Workaround fühlt sich wirklich hakelig an:

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

Gibt es eine bessere Lösung? Ich habe versucht, MNUL für ein unbenutztes Speichersegment auf meinem Prozessor zu definieren, aber das führt zu einem sofortigen Reset.

9voto

nos Punkte 214143

Es sei denn, die Dokumentation für UART_SendBlock besagt, dass die Übergabe eines NULL-Zeigers in Ordnung ist, erhalten Sie wahrscheinlich undefiniertes Verhalten, wenn Sie dies tun - und in diesem Fall scheint es, dass die Funktion nur an die Adresse schreibt, die Sie übergeben, Adresse 0 - die unter "undefiniertes Verhalten" gehen würde.

Rufen Sie sie einfach mit einem Parameter auf, es gibt keinen Grund, sich darüber "schlau" zu machen.

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

Wenn Sie nur über begrenzte Ressourcen verfügen, sollten Sie unused_16 ein Global und verwenden Sie es an anderer Stelle wieder

3voto

Ian Wetherbee Punkte 5859

Die Funktion versucht, einen Wert an die Stelle zu schreiben, auf die das letzte Argument zeigt. Sie übergeben NULL (0x0000), also wird das Ergebnis in den Speicherplatz 0x0000 oder Ihren Anschluss A geschrieben. Normalerweise (in der allgemeinen Programmierung) würde die Funktion das Argument prüfen und nicht versuchen, in den Platz zu schreiben, wenn es NULL ist, aber es scheint, dass diese Funktion dieser Konvention nicht folgt. Sie müssen der Funktion eine Variable zuweisen, in die sie ihr Ergebnis schreiben kann, auch wenn Sie sie nicht verwenden werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X