Hallo Forum,
ich mache gerade meine ersten Erfahrungen mit nem STK600 und den AVR
XMega Mikrocontrollern. Nach dem Tutorial klappten die ersten kleineren
Programme schon ganz ordentlich. Leider bin ich jetzt an einem Punkt wo
ich nicht weiterkomme und weder hier im Forum oder im Datenblatt etwas
gefunden habe was mir weiterhilft.
Zu meinem Problem, ich möchte nach einem ausgeführten Watchdog-Reset nur
einen Teil der globalen Variablen wieder zurücksetzen. Sicherlich ist
eskein Problem diese einzeln mit 0 zu initialisieren. Schöner fände ich
aber eine Routine, die das SRAM bis auf ein paar Adressen wieder
zurücksetzt.
Jetzt meine Frage, wie kann ich auf das SRAM zugreifen? Das ist mir
irgendwie unklar. Und ist es möglich einer Variablen eine bestimmte
Adresse zuzuweisen, oder einen Adressbereich für bestimmte Variablen zu
definieren.
Über Hilfe würde ich mich echt freuen.......
Viele Grüße
Ja, C Programmierung.
Also ich hätte schon gerne einen fest definierten Bereich. Jetzt kann
ich ja im AVRStudio6 unter Toolchain - AVR/GNU Linker einmal unter
Memory Settings das SRAM Segment definieren (weiß leider nicht wie)oder
unter Miscellaneous ein Linker Flag setzen.
Der Befehl -Wl,--section-start=.noinit=0x2000 als Linker Flag scheint
schon mal zu funktinieren.
Nur wie greife ich jetzt auf das Adresse 0x2010 bis 0xffff zu?
Dennis Peters schrieb:> Also ich hätte schon gerne einen fest definierten Bereich.
Weshalb? Normalerweise attributierst du die nicht beim Start zu
initialisierenden Variablen entsprechend dem Link und überlässt die
Speicherwaltung dem Linker. Der legt diese Variablen automatisch in die
benannte Sektion und sorgt für die richtigen Adressen.
Wenn du eine komplett eigene Speicherverwaltung des Linkers im Auge
hast, dann wirds halt etwas komplizierter. Weil du dann erst einmal
gründlich verstehen solltest, wie die normale Speicherverwaltung
funktioniert.
Wozu? Das macht der Startup-Code doch sowieso schon von selbst. Alle
external/static Vars, die nicht explizit in die .noinit Sektion gelegt
werden, werden beim Start automatisch initialisiert.
Hi
>Weil ich dann wie oben beschrieben genau den SRAM Bereich löschen kann,>der keine .nonit Variablen enthält.
Und den Stack gleich mit plattmachen?
MfG Spess
hier mal ein .asm Beispiel von mir für einen ATMega16 also für 1kByte
SRAM muss du halt entsprechend anpassen. Ich hatte das ganze direkt vor
dem Programm gemacht deswegen war mir das mit Zeitaufwand egal, den im
Programm weiter unten gibt dann keine solchen Verzögerungen.
Thomas O. schrieb:> hier mal ein .asm Beispiel
Drum fragte ich nach Assembler vs. C. Ein Assembler-Beispiel ist in
dieser Frage bei C Programmierung zu 100% nutzlos.
>Wozu? Das macht der Startup-Code doch sowieso schon von selbst. Alle>external/static Vars, die nicht explizit in die .noinit Sektion gelegt>werden, werden beim Start automatisch initialisiert.
Aber nicht nach einem Watchdog_Reset. Das ist mein Problem, denn sonst
könnte ich die Variable auch im EEPROM speichern.
>Und den Stack gleich mit plattmachen?
Ich frag jetzt mal ganz dumm, wäre das kritisch wenn ich den Bereich
einhalte?
du wirst es doch in C hinbekommen eine Schleife z.B. 1024mal
abzuarbeiten und eine Adresse bei jedem Schreiben um 1 zu erhöhen? Da
ich mit C nichts am Hut habe mache ich mir den Aufwand nicht aber ein
.asm Beispiel ist doch besser als garkeins. Vielleicht kann jemand
anderes das Beispiel oben nach C umwürfeln.
Dennis Peters schrieb:> Aber nicht nach einem Watchdog_Reset.
Doch, meines Wissens ist es dem Startup-Code völlig schnurz, wodurch ein
Reset ausgelöst wurde. Anders wärs beim Watchdog-Interrupt.
Thomas O. schrieb:> du wirst es doch in C hinbekommen eine Schleife z.B. 1024mal> abzuarbeiten und eine Adresse bei jedem Schreiben um 1 zu erhöhen?
Sein Problem ist nicht das Löschen selbst, sondern die Frage der
Speicherorganisation. Also welche Variable an welcher Stelle landet und
welcher Bereich wann gelöscht werden muss/kann/darf.
Hi
>Ich frag jetzt mal ganz dumm, wäre das kritisch wenn ich den Bereich>einhalte?
Welchen Bereich? Der Stack ist dynamisch. Wie weit er in den RAM
hineinreicht, ist einfach ausgedrückt, von der Stelle im Programm
abhängig, die gerade abgearbeitet wird.
>ich mache gerade meine ersten Erfahrungen mit nem STK600 und den AVR>XMega Mikrocontrollern.
Dann ist der Watchdog das allerletzte was du brauchst. Ergo hast du kein
Problem mit den Variablen.
MfG Spess
Ich habe etwas ähliches gemacht:
Es handelt sich hier zwar um einen V850-Automotive Controller, aber bei
den AVRs sollte das gleich sein.
Zu meinem Projekt habe ich das .ld-File angepasst. Darin steht der
Aufbau des SRAMs. Bei meinem Controller beginnt der SRAM an der Adresse
0xFFFF0000 und genau dort hin habe ich die .noinit-Section gelegt.
Die Größe wird automatisch angepasst, was für meine Zwecke ok ist. Man
kann aber auch feste Werte eintragen.
nach einem Reset würde ich mich auf nichts mehr (Variablen/SRAM)
verlassen. Wenn ich sichergehen will das nichts verloren geht, würde ich
den µC ausreichend Puffern, mit einem Analogeingang die Spannung vor dem
Spannungsregler messen und wenn diese Abfällt sofort alles wichtige ins
EEPROM schreiben. Damit ich nach dem folgendem Reset damit
weiterarbeiten kann.
Thomas O. schrieb:> nach einem Reset würde ich mich auf nichts mehr (Variablen/SRAM)> verlassen.
Die Quelle des Reset geht aus einem Statusregister hervor. Das kann man
also schon differenzieren. Bei Watchdog/Pin ist die Situation anders als
bei Powerup/Brownout.
Ich habe das mal ein bissl getestet und der Mega8 verhält sich da wie
erwartet (BOD an, Watchdog an), wenn der BOD resettet, zählt das als
quasi-POR, nur eben mit dem BOD-Reset-Bit gesetzt. Ein eventuell vorher
gesetztes WD-Reset-Bit wird also auch zurückgesetzt => kein Problem.
Ich weiß nicht so ganz, wo OPs Problem noch liegt.
-Seine Variablen, die er behalten will, packt er ins .noinit (attribute)
-In main() oder auch below-main, wie er mag, prüft er aufs WD-Reset-Bit
und wenn es nicht gesetzt ist, initialisiert er die .noinit-Variablen
-Fertig.
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.