Forum: Mikrocontroller und Digitale Elektronik MSP430 Speicherbereich verletzt!


von Benni J. (benni1000)


Lesenswert?

Hey und hallo zusammen,
habe ein Progrämmchen für meinen MSP430G2553 geschrieben. Irgendwie 
funktioniert es aber nicht richtig. Ich bilde mit ein Pointer richtig 
verwenden zu können, werde aber das Gefühl nicht los, dass ich doch 
irgendwo einen Schnitzer drin habe, weil sich das ding einfach 
verrechnet. Einfache Aufgaben wie
1
if((uint8_t)(signal_[16]) >= (uint8_t)25)
führen zu einem falschen Ergebnis. Manchmal.
Gibt es eine Möglichkeit mit dem "Code Composer Studio" herauszufinden 
wo ich möglicherweise eine Speicherverletzung habe? Oder eine 
schwierige?
Bis zu einer gewissen Programmgröße/ Komplexizität scheint alles gut zu 
laufen.
Gruß
Benni

von tux (Gast)


Lesenswert?

Lass dir halt mal signal_[16] ausgeben wenn es schief geht. Zugriffe auf 
ein Array sind jetzt keine Pointermagie...

von no cast (Gast)


Lesenswert?

Benjamin Johann schrieb:
> werde aber das Gefühl nicht los, dass ich doch
> irgendwo einen Schnitzer drin habe

... und wie soll man das ohne den Code bewerten?

Benjamin Johann schrieb:
> if((uint8_t)(signal_[16]) >= (uint8_t)25)

Ich hoffe, signal ist unsigned deklariert, oder?
Und wozu die cast? Wenn du bei signal[n] nur 8 Bit sehen willst, blende 
die oberen einfach aus
1
if((signal_[16]) & 0x00FF >= 25)
und es liest sich besser.

von Fritz G. (fritzg)


Lesenswert?

Wie groß ist das Array? 16 Elemente? Dann kann das nicht funktionieren, 
wenn du auf das 17. Element zugreifst.

von Benni J. (benni1000)


Lesenswert?

Hallo "no cast", hallo Fritz,
Jaja... habt ja recht. Könnte schon etwas großzügiger mit Code sein. 
Aber ich möchte keinen dazu nötigen meine Programme zu berichtigen. 
Deshalb hatte ich die Frage allgemein gestellt. Gibt es eine Möglichkeit 
z.B. über die Pointeradressen zu bewerten, ob man gerade belegten 
Speicher überschreibt?

Zu der Zeile oben: Das Array ist 42 Elemente lang. Alles ist vom Typ 
uint8_t. Wollte durch die Casterei nur sicherstellen, dass der Compiler 
nicht doch irgendeinen "int" vergleicht und so auf ein ungleiches 
Ergebnis kommt. Eher eine Verzweiflungstat.

Gruß
Benni

von Jenni B. (Gast)


Lesenswert?

Benni J. schrieb:
> Gibt es eine Möglichkeit
> z.B. über die Pointeradressen zu bewerten, ob man gerade belegten
> Speicher überschreibt?

In C geht das nicht. Du kannst einem pointer auf eine beliebige Adresse 
zeigen lassen. Wenn da eine Variable liegt, oder ein andere pointer 
darauf zeigt, überschreiben die sich gegenseitig.
Und C verhindert keine Feldüberschreitung.

Benni J. schrieb:
> Aber ich möchte keinen dazu nötigen meine Programme zu berichtigen.

Du nötigst eher durch rumeierei an Fragen, die sich mit dem Code einfach 
beantworten lassen. :-(((

von Benni J. (benni1000)


Lesenswert?

Hey Freunde :-)
Habe gerade einen Fehler gefunden. Habe eine mathematische Funktion 
genutzt. Dabei allerdings als Ergebnis nur eine float-Variable 
bereitgestellt. Scheinbar hat mir das den Speicher ordentlich 
durcheinandergewürfelt.

Statt
1
exp()
 benutze ich jetzt
1
expf()

Trotzdem danke fürs zuschauen :-p

Gruß
Benni

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.