Anbieter zum Thema
Wie das Power Management auf Kernel-Ebene funktioniert
Auf Kernel-Ebene werden einige Funktionen zur Verfügung gestellt, die entweder durch einen Interrupt oder durch das RTOS selbst aufgerufen werden. Nachfolgend werden die Eigenschaft und Aufgaben dieser Funktionen beschrieben:
- OEMPowerOff: Diese Funktion wird ausgeführt, wenn der Ausschalter betätigt wurde. Der aktuelle Zustand wird gespeichert und das System in den niedrigsten „Power-State“ gebracht. Die DRAMs werden noch mit „self-refresh“ Zyklen versorgt, die CPU wird angehalten, alle Interrupts sind gesperrt (disabled) ausgenommen davon sind die Aktivierungs-Quellen (wakeup sources).
Erfolgt ein Aktivierungs-Interrupt wird das System wieder in den ursprünglichen Zustand gebracht.
- OEMIdle: Ist kein Thread mehr aktiv, springt der Scheduler in die Funktion OEMIdle. Diese stoppt die CPU, d.h. es werden bis zum nächsten Interrupt keine Instruktionen mehr ausgeführt. Wird ein Interrupt ausgelöst, wird dieser in der Interrupt Service Routine (ISR) bearbeitet und danach ab der nächsten Instruktion nach dem CPU-Halt in OEMIdle weiter fortgefahren. Die Funktion OEMIdle wird beendet und wieder zurück in den Scheduler gesprungen.
- System Tick Interrupt: Dafür wird ein Timer benötigt, der einen zyklischen Interrupt von 1 ms Intervall liefert. Dieser Interrupt muß am Interrupt-Controller mit der höchsten Priorität liegen. Er wird auch als „Herzschrittmacher für das WinCE“ genannt. Der Scheduler wird durch diesen Interrupt aktiviert und erkundigt sich was als nächstes getan werden muss (SYSINTR_RESCHED)
Ein Beispiel aus der Praxis
Zusammenspiel zwischen Applikation <> PM <> Treiber
- Das Applikation-Projekt „PowerManagement“ wird als Unterprojekt zum Platform-Image angelegt und mit Target->Run Programs… die Applikation „Power_Management.exe“ gestartet. Beim Booten des WinCE wird der Treiber „Backlight.dll“ geladen.
- Folgende APIs der Applikation werden ausgeführt: •CreateEvent(); •Es wird ein Thread erzeugt, der die komplette Kommunikation abwickelt. hThread = CreateThread(0, 0, PowerNotificationThread, NULL, 0, 0); •MessageBox(NULL, TEXT(„Set backlight power requirement“), TEXT(„Power“), MB_OK); •hPowerRequirement = SetPowerRequirement(TEXT(„BKL1:“), D0, POWER_NAME, NULL, 0); •MessageBox(NULL, TEXT(„Release backlight power requirement“), TEXT(„Power“), MB_OK); •ReleasePowerRequirement(hPowerRequirement); •MessageBox(NULL, TEXT(„Press OK to exit“), TEXT(„Power“), MB_OK);
- Aufgaben des Threads „PowerNotificationThread()“ •hPowerMsgQ = CreateMsgQueue(NULL, &mqo); •Welche Events werden unterstützt: hPowerNotifications = RequestPowerNotifications( hPowerMsgQ, PBT_TRANSITION | PBT_ RESUME | PBT_POWERINFOCHANGE);
•Events werden eingelesen und verarbeitet mit: while(ReadMsgQueue(hPowerMsgQ, ppb, cbPowerMsgSize, &cbRead, )
•StopPowerNotifications(hPowerNotifications);
•CloseMsgQueue(hPowerMsgQ);
Rudi Swiontek ist Experte für Windows CE und bei Hilf! in Oberhaching für Schulungen und Entwicklungen zuständig. Ralf Ebert ist Produktspezialist bei Abacus-Deltron in Berlin und unter anderem für Design-In-Unterstützung und Beratung zuständig.
(ID:280374)