2014-12-28 14 views
5

Ich weiß, Dereferenzierung eines Null-Zeigers ist undefiniert - aber ich würde gerne wissen, was auf einem bestimmten Ziel - ein MSP430 passiert.Was geschieht beim MSP430, wenn ich einen Null-Zeiger dereferenziere?

Ich habe keine Karte, um diese vor mir zu laden, um dies jetzt zu testen.

Was würde passieren, wenn ich dies (oder ähnlich) machen würde?

int * foo = NULL; 
(*foo)++; //Crash? 

Position 0x0 ist im SFR-Bereich und reserviert.

Würde es einen PUC/POR generieren? Oder würde es still "arbeiten"? bei der Adresse 0x0

Die Baugruppe erzeugte

;int * foo = NULL; 
clr.w R15 
;(*foo)++; 
inc.w R15 

buchstäblich So Standort 0x0 von 1.

Als ich das ich den Wert von 0 auf 1. Ich gehe sehen im Simulator laufen erhöht wird Keine Warnungen im Debug-Protokoll erhalten und das Programm wird normal beendet.

Ich verwende den IAR EW430 Compiler/Assembler/Simulator.

+0

Nur so ist es klar, Sie fragen nach beobachtetem Verhalten von undefiniertem Verhalten; Eine große Bestellung. Diese Frage wäre nicht hier, wenn Sie die tatsächliche * Hardware * in Ihren Mits haben, ist das richtig? Und wäre es nicht auch davon abhängig, ob zum Zeitpunkt der Übertretung ein übergeordneter Unterbrechungshaken installiert wurde, der von dem spezifischen Moment desselben abhängt? (oder haben Sie * vollständige * Kontrolle über alle oben genannten?). – WhozCraig

+0

@WhozCraig das ist richtig. In einer Nussschale frage ich, ob der msp430 heftig heruntergefahren wird, wenn 0x0 gelesen oder geschrieben wird oder es schädlich weiter funktioniert. Ich kann nicht herausfinden, was diese Adresse enthalten würde. Es gibt einen Interrupt, den Sie einrichten können, der ausgelöst wird, wenn auf "freien" Speicher außerhalb des normalen Bereichs zugegriffen wird, von dem aus Sie etwas über das Ereignis protokollieren können, aber ich denke nicht, dass dies eine Option ist. Mehr oder weniger frage ich nach einer großen widerspenstigen Legacy-Code-Basis, die keine Anwei- sungen verwendet oder auf andere Weise Zeigerparameter in Schnittstellen überprüft. – Nick

+0

Adresse 0,1 sind die Interrupt-Freigabebits. Wenn daher die Adresse 0 von Wert 0 auf Wert 1 erhöht wird, wird einer der Interrupts aktiviert. Das Programm wird weiterlaufen. @Nick, hast du das Architekturblatt für den msp430 nicht gelesen? Die Architekturspezifikation finden Sie unter: user3629249

Antwort

6

Nicht nur das Schreiben und Lesen der Adresse 0x0 wird nicht zu einem Absturz oder Neustart führen, sondern ist ein völlig legaler Vorgang, der häufig von MSP430-Anwendungen verwendet wird.

Der Anfangsteil oder MSP430 Speicherabbild für I/O-Ports und Steuerregister reserviert ist: http://en.wikipedia.org/wiki/TI_MSP430#MSP430_address_space

Insbesondere kann die Steuerregister bei 0x0 und nachfolgenden Adressen sind:

#define IE1_     0x0000 /* Interrupt Enable 1 */ 
#define IE2_     0x0001 /* Interrupt Enable 2 */ 
#define IFG1_     0x0002 /* Interrupt Flag 1 */ 
#define IFG2_     0x0003 /* Interrupt Flag 2 */ 

So zum Beispiel Schreiben von Null auf diese Speicheradresse durch Dereferenzieren eines uint8_t * oder uint16_t * Zeigers wird Interrupts deaktivieren. Schreiben Null durch Dereferenzieren eines uint32_t * es wird auch die Flags löschen. Die Erhöhung des Wertes dieser Register ist nicht sehr sinnvoll, sollte aber völlig legal sein.

Zumindest ist das bei msp430 Serie 1, Serie 2 und Serie 4 der Fall. Durch Überprüfung der Header-Dateien konnte ich nichts auf 0x0 auf Serie 5 abgebildet finden (die Interrupt-Steuerregister werden der Region zugeordnet) 0x0100).

Also, wenn Sie Orte in Code fangen möchten, wo der NULL-Zeiger dereferenziert wird, sind Sie völlig auf sich allein gestellt.

+0

Danke für die Erklärung, davor hatte ich Angst. Ich habe mir einen Header der Serie 5 angeschaut, weshalb ich nicht herausfinden konnte, wofür 0x0 verwendet wurde. – Nick