Forum: Mikrocontroller und Digitale Elektronik Absturzproblem


von Tom (Gast)


Lesenswert?

Hallo,

ich verwende in meinem Bootloader (auf dem tutorial zu c bootloadern 
basierend) folgendes:
1
memset(flash_data, 0xFF, sizeof(flash_data));

dieses commando bringt den uc sofort zum abstürzen und neustarten. Das 
witzige ist, dass ich das kommando schon immer drinn hab und es im 
tutorial auch drinn steht.

definition:
1
uint8_t   flash_data[SPM_PAGESIZE];
2
3
includes: 
4
5
6
#include <string.h>
7
#include <stdlib.h>
8
#include <stdio.h>

Wieso kann dieser Befehl abstürzen? Vor allem wird er direkt in der 
initialisierung des Programs auch ausgeführt, dort aber ohne probleme. 
Nur mitten während der laufzeit gibt es sofort einen absturz - liegt 
auch definitiv an dem befehl, ohne läufts.

von Karl H. (kbuchegg)


Lesenswert?

Tom schrieb:

> Nur mitten während der laufzeit gibt es sofort einen absturz - liegt
> auch definitiv an dem befehl, ohne läufts.

Ne. es liegt an der Umgebung, die aus irgendeinem Grund vitale 
Informationen genau an dieser SRAM Position liegen hat. Und wenn dann 
der memset den Speicher niederbügelt, geht der Rest in die Hose, weil 
ihm der memset die Daten unter dem Hintern weggebügelt hat.

Du siehst die Symptome - der memset macht sie sichtbar. Aber die Ursache 
steckt woanders.

von Tom (Gast)


Lesenswert?

Hm,

wenn ich den memset durch das ersetze:
1
 
2
for (uint16_t mm = 0; mm < sizeof(flash_data); mm++) {
3
                                  flash_data[mm] = 0xff;
4
                            }

tritt der fehler nicht auf!

Ist das nicht genau das selbe?

von Karl H. (kbuchegg)


Lesenswert?

Ich kann mich nur wiederholen:
Die Ursache steckt woanders.

Was genau die Ursache ist, kann ich so nicht sagen. Es gibt viele 
mögliche Szenarien für derartige Dinge. Ich hab mich halt für die 
naheliegenste und häufigste entschieden. Die scheint es bei dir aber 
nicht zu sein.
Mehr kann man mit der unvollständigen Information allerdings nicht sagen 
und mit jeder weiteren versuchten Diagnose würde ich mich zuweit aus dem 
Fenster lehnen.

von Tom (Gast)


Lesenswert?

Wie geht man sowas denn an?

Das Programm ist relativ klein, ich würde mich wundern wenn der compiler 
nun auf einmal verrückt spielen würde. Bisher waren es auch immer eher 
meine Fehler als die des Compilers ;)


Eigentlich nichts besonderes, ein C programm das ganz normal compiliert 
wird. Da dürfte doch keine Kollision auftreten?! Ram ist auch nur zu 
rund 30% belegt (Atmega640)

von Dumdi D. (dumdidum)


Lesenswert?

Tom schrieb:
> Hm,
>
> wenn ich den memset durch das ersetze:
>
>
1
> for (uint16_t mm = 0; mm < sizeof(flash_data); mm++) {
2
>                                   flash_data[mm] = 0xff;
3
>                             }
4
>
>
> tritt der fehler nicht auf!
>
> Ist das nicht genau das selbe?

Was passiert wenn Du beide Möglichkeiten gleichzeitig drin lässt? 
Vermutlich liegt Dein Problem wirklich woanders.

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.