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.
Beitrag #5115658 wurde von einem Moderator gelöscht.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.