Globale Variablen nicht initialisieren

Normalerweise initialisiere ich globale Variablen natürlich. In diesem speziellen Fall soll der Wert der Variablen aber nach einem Reset weiter verfügbar sein. Allerdings scheint der Compiler von sich aus alle Variablen Null zu setzen. Kann man das verhindern?

nein.
Du könntest in Setup die Variable aus dem EEPROM rücklesen.
Das setzt aber Voraus, dass du den Wert vorher in das EEPROM schreibst.

Beschreib mal das ganze drumherum damit wir verstehen um was es dir geht bevor wir hier einem XY-Problem nachlaufen.

Ein System aus Arduino Nano crasht circa einmal pro Woche, ohne dass ich eine Idee habe, woran das liegen kann. Ich habe jetzt den Watchdog aktiviert und würde gerne wissen, wie oft der zuschlägt. Das geht natürlich mit dem EEPROM.
Das zweite Problem ist der letzte Status des Systems, den ich gerne nach einem Reset wieder herstellen möchte. Da der sich aber häufig ändert, würde ich dafür nicht so gerne das EEPROM verwenden.

Sie könnten ein FRAM-Modul für Ihren Speicher hinzufügen, wenn Sie befürchten, das EEPROM zu beschädigen

Ja!
gcc attribut section .noinit

Musst du nur noch rauskriegen, ob vorher ein Spannungsausfall war, dann ist der Inhalt nämlich undefiniert. Aber da weiß @combie bestimmt auch was, wie man den Grund eines Resets raus kriegt.

Das abzustellen wäre natürlich auch eine Möglichkeit :slight_smile:

Gelöst!
Er tut, was er soll, dank dieser Zeile:
static uint16_t Reset_cnt attribute ((section (".noinit")));

Dank an combie

Das einzige, was ich nicht verstehe: wieso will er zwei mal Klammer auf? Mit einer Klammer geht es nicht.

Bitte Codetags verwenden, sonst hat keiner was davon!

#define NOINIT __attribute__((section(".noinit")))


byte resetCounter NOINIT;


void setup() 
{
  Serial.begin(9600);

  Serial.println(++resetCounter);
}

void loop() 
{

}

Ich auch nicht.
Hat mich aber auch bisher noch nicht interessiert.
Wird sich aber ein Grund finden lassen, wenn man tief buddelt.

Auch wenn der Bootloader RAM benötigt, kann es überschreiben werden.
Zudem löst ein WTD ja nicht ohne Grund aus. Der Speicher kann danach korrupt sein
Es macht also Sinn, den Datenbereich mit einer Prüfsumme o.ä. abzusichern.

Natürlich!
Im AVR gibts ein Statusregister, welches den Resetgrund beinhaltet.
Manche Bootloader sichern den Grund. Aber gelöscht wird er von jedem Bootloader.
Also: Nur ohne Bootloader sicher zu beauskunften.

Stimmt, das ist noch sicherer: Nur wenn die Prüfsumme stimmt, kann man auf dem Rest aufbauen.

Gerade ausprobiert: Der normale optiboot des Uno überschreibt den .noinit - Bereich übrigens nicht, selbst wenn er denselben Sketch nochmal hochlädt.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.