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