Forum: Mikrocontroller und Digitale Elektronik RamRetention


von RamRetention (Gast)


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?

von Peter II (Gast)


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.

von Georg (Gast)


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

von Clemens L. (c_l)


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.

von S. R. (svenska)


Lesenswert?

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

Ziemlich doof. Nimm irgendetwas anderes, was erhalten bleibt (ein 
Hardware-Register oder so).

von Georg (Gast)


Lesenswert?

Georg schrieb:
> eine while-Schleife würde dafür sorgen, dass der Sleepmodus
> irgendwann eintritt

Muss natürlich heissen "niemals eintritt". Oder er tritt ein, aber dann 
wird die Schleife nicht ausgeführt.

Georg

von Peter D. (peda)


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.

von Vincent H. (vinci)


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.

von Peter D. (peda)


Lesenswert?

Einen Deep Sleep Mode gibt es z.B. beim PIC24:
http://ww1.microchip.com/downloads/en/DeviceDoc/39927c.pdf

Beim Aufwachen wird intern ein Reset ausgeführt, d.h. der Code startet 
am Resetvektor, da ja alles zerstört ist (Programmcounter, Stackpointer, 
Stack usw.).
Nur 2 Register, einige Bits und die RTC bleiben erhalten, sowie die 
IO-Ports.

von Rudolph R. (rudolph)


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.

von S. R. (svenska)


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.

von Rudolph R. (rudolph)


Lesenswert?

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

Und der Rest vom Programm braucht keinen Speicher? Eher 
unwahrscheinlich.

von S. R. (svenska)


Lesenswert?

Rudolph R. schrieb:
> Und der Rest vom Programm braucht keinen Speicher? Eher
> unwahrscheinlich.

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.

von Jim M. (turboj)


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.
von Jacko (Gast)


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! ;-)

von Clemens L. (c_l)


Lesenswert?

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.

von Soul E. (Gast)


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.

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.