RamRetention

Gast #5114130
Lesenswert?

Hallo,

ich habe eine Funktion, die ein System in den Deepsleepmodus versetzt.

Dort gibt es kein RAM Retention, alles was man behalten möchte muss 
gesondert irgendwo gespeichert werden.

Nun habe ich eine Abfrage in einer while-Schleife, in welcher ich eine 
Variable Abfrage, ob der Sleepmodus verlassen werden darf.
Die Abfrage lautet ungefähr so:
while(variable == false) bleibe im Sleep Modus.

Nun ist die Frage: verliert die Variable auf die ich triggere einfach 
nur ihren Wert, was bei einer Abfrage auf Null ok wäre, oder 
verschwindet sie gänzlich, so dass die while Schleife nicht mehr weiß 
worauf sie ihren Vergleich durchführen soll?
Gast #5114136
Lesenswert?

RamRetention schrieb:
> Nun ist die Frage: verliert die Variable auf die ich triggere einfach
> nur ihren Wert, was bei einer Abfrage auf Null ok wäre, oder
> verschwindet sie gänzlich, so dass die while Schleife nicht mehr weiß
> worauf sie ihren Vergleich durchführen soll?

ich habe zwar keine Ahnung von deinem Controller (den du auch nicht 
genannt hast), aber eine Variable kann nicht verschwinden. Sie hat immer 
irgend einen Wert. Eventuell kommt es sogar zu einen Fehler, weil der 
Controller den Ram nicht ansprechen kann. Die Variabel wird wohl 
volatile sein, damit wird sie auch nicht im Register vorgehalten.
Gast #5114143
Lesenswert?

RamRetention schrieb:
> Dort gibt es kein RAM Retention, alles was man behalten möchte muss
> gesondert irgendwo gespeichert werden

Solange die Versorgungsspannung anliegt, geht der Inhalt von Variablen 
nicht verloren, auch wenn der Prozessor schläft.

RamRetention schrieb:
> Nun habe ich eine Abfrage in einer while-Schleife, in welcher ich eine
> Variable Abfrage, ob der Sleepmodus verlassen werden darf

Das gibt es nicht. Im Sleepmodus kann auch keine Abfrage stattfinden, 
und eine while-Schleife würde dafür sorgen, dass der Sleepmodus 
irgendwann eintritt.

Hier scheinen tiefgehende Missverständnisse vorzuliegen.

Georg
#5114202
Lesenswert?

Georg schrieb:
> Solange die Versorgungsspannung anliegt, geht der Inhalt von Variablen
> nicht verloren, auch wenn der Prozessor schläft.

Es gibt auch extreme Schlaf-Modi, in denen die Stromversorgung des RAMs 
abgeklemmt wird, z.B. LPMx.5 beim MSP430.

RamRetention schrieb:
> Nun habe ich eine Abfrage in einer while-Schleife, in welcher ich eine
> Variable Abfrage, ob der Sleepmodus verlassen werden darf.

Verrate uns doch mal, welchen Chip und Schlafmodus du benutzt, und 
welches Ereignis die CPU wieder aufwecken soll. Aber ich vermute mal, 
dass die Schleife gar nicht erst ausgeführt wird.
#5114954
Lesenswert?

RamRetention schrieb:
> Nun habe ich eine Abfrage in einer while-Schleife, in welcher ich eine
> Variable Abfrage, ob der Sleepmodus verlassen werden darf.

Wir kennen Dein "System" nicht, aber üblicher Weise wird im Sleep kein 
Code mehr ausgeführt. Der Programmcounter bleibt auf der Instruktion 
nach dem Sleep-Befehl stehen. Je nach CPU-Typ macht er dort nach dem 
Aufwachen weiter oder springt erst in einen Interrupthandler.
#5115091
Lesenswert?

Nach dem 3.mal lesen versteh ich die Frage glaub ich. Du suchst die 
Definition von "ram retention". Nun, den Moment wo die 
Versorgungsspannung unter das im Datenblatt genannte Level sinkt, den 
Moment musst du davon ausgehen, dass im Ram irgendwas steht. Nicht 0, 
nicht FF, sondern tatsächlich IRGENDWAS.

Aus genau diesem Grund besitzen moderne Prozessoren auch zig 
verschiedene Aufwachquellen und Prüfungen, etwa interne 
Spannungsüberwachungen und ähnliches, um eben NICHT auf RAM angewiesen 
zu sein.
#5115361
Lesenswert?

Georg schrieb:
>> Nun habe ich eine Abfrage in einer while-Schleife, in welcher ich eine
>> Variable Abfrage, ob der Sleepmodus verlassen werden darf
>
> Das gibt es nicht. Im Sleepmodus kann auch keine Abfrage stattfinden,
> und eine while-Schleife würde dafür sorgen, dass der Sleepmodus
> irgendwann eintritt.

Da dürfte eher eine Abfrage beim Aufwachen gemeint sein, sowas wie das 
hier:
1
  while(triplock == roundtrip)
2
  {
3
    cli();
4
    sleep_enable();
5
    sei();
6
    sleep_cpu();
7
    sleep_disable();
8
  }

Es gibt ja mitunter mehr als einen Grund aus dem der Controller aus dem 
Sleep wieder aufwacht.
Das benutze ich mit den AVRs am Ende der Hauptschleife und schicke die 
damit in den IDLE Mode bis der nächste Timer-Tick durch ist.
Ist nicht so prall, spart aber auch Energie.

Aber so tief schlafend, dass das RAM abgeschaltet wird?
Da bleibt doch nur noch ein Neustart.
#5115436
Lesenswert?

Rudolph R. schrieb:
> Es gibt ja mitunter mehr als einen Grund aus dem der Controller aus dem
> Sleep wieder aufwacht.

Ja, aber wenn der RAM-Inhalt kaputt ist, muss man die Variable eben in 
irgendwelchen Registern speichern, die den Tiefschlaf überleben. Anders 
gehts nicht.

Vielleicht geht es ja auch um externen Speicher (z.B. AVR's XMEM oder 
einen 8051 mit SRAM...). Weiß man alles nicht.
#5115636
Lesenswert?

S. R. schrieb:
> Irrelevant: Vor und nach dem Sleep darf das Programm beliebig Speicher
> nutzen. Aber wenn nach dem Sleep der RAM-Inhalt kaputt ist, dann muss
> das Programm damit umgehen können.

Üblicherweise ist beim Aufwachen aus Tiefschlafmodi bei denen der RAM 
nicht erhalten bleibt auch der Program Counter verloren gegangen. Daher 
wird ein Reset erzeugt beim Aufwachen.
Beitrag #5115658 wurde von einem Moderator gelöscht.
Gast #5116307
Lesenswert?

Wenn Deepsleep ein Koma mit Gedächtnisverlust ist, braucht das
kein Mensch - dazu kann man auch AUSSCHALTEN und spart noch
ein paar nA..µA.

Aber der gewählte µC ist ja GROSSES Geheimnis. - Klar, wenn
ich so einen Mist verkaufe muss ich den Kunden zum Schweigen
verpflichten. Sonst werden andere Abnehmer gewarnt! ;-)
Gast #5116556
Lesenswert?

Clemens L. schrieb:
> Jacko schrieb:
>> Wenn Deepsleep ein Koma mit Gedächtnisverlust ist, braucht das
>> kein Mensch - dazu kann man auch AUSSCHALTEN und spart noch
>> ein paar nA..µA.
>
> Dann kann man aber nicht (per RTC- oder I/O-Interrupt) wieder aufwachen.

Darüber hinaus haben die mir bekannten Controllertypen, wo im deep sleep 
der core spannungsfrei geschaltet wird (z.B. Renesas RH850) ein 
retention RAM, wo man Daten ablegen kann, die erhalten bleiben sollen. 
Ist aber für den Ersteller des linker command files etwas mehr 
Scheckerei, denn man muss sich bei jeder Variable überlegen, ob sie ins 
RAM oder ins retention RAM soll.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren