Echtzeit mit System Die Systemprogrammierung von Windows Embedded Compact 7

Die Unterstützung von Mehrkern-Prozessoren ist eines der wichtigsten Features von Windows Embedded Compact 7. Damit werden Embedded-Systeme erheblich leistungsfähiger. Trotzdem sollte man der Echtzeit-Programmierung weiterhin Sorgfalt widmen, denn durch das Beachten einiger Randbedingungen läuft das System runder und zuverlässiger.

Die Systemleistung ist ausschlaggebend für die Produktivität des Benutzers. Sie hat außerdem direkten Einfluss auf den Eindruck, den der Benutzer von einem Gerät hat. Der Benutzer beurteilt die Nützlichkeit eines Geräts häufig auf Grundlage der Systemleistung und der Benutzerfreundlichkeit der Oberfläche. Leistungsoptimierung und Systemanpassung stellen eine große Herausforderung für die Anbieter von Firmware dar.

Überwachen und Optimieren der Systemleistung

Das Überwachen und Optimieren der Leistung sind wichtige Aufgaben bei der Entwicklung von Small-Footprint-Geräten. Die Optimierung erfordert, dass Firmware- und Software-Entwickler die Ressourcenbelegung in ihren Systemkomponenten und -anwendungen einschränken, damit für die anderen Programme und Komponenten noch genügen freie Ressourcen vorhanden sind. Unabhängig davon, ob Gerätetreiber oder Benutzeranwendungen entwickelt werden, können optimierte Verarbeitungsalgorithmen die Prozessorauslastung reduzieren, und effiziente Datenstrukturen können die Arbeitsspeicherbelegung verringern. Entwicklungswerkzeuge zum Identifizieren von Leistungsproblemen in Treibern, Anwendungen und anderen Komponenten (Bild 1) sind auf allen Systemebenen verfügbar.

Die »Echtzeit-Leistung« in Treiber-, Anwendungs- und OAL-Code (OEM Adaptation Layer) beeinflusst die Systemleistung direkt. Aber auch Komponenten und Anwendungen ohne Echtzeit-Unterstützung können sich auf das Echtzeit-Verhalten auswirken.

Der System-Timer ist ein Hardware-Zeitgeber, der pro Millisekunde einen Impuls erzeugt. Mittels dieser Impulse steuert der System-Scheduler, welche Threads zu welchem Zeitpunkt ausgeführt werden. Ein Thread ist die kleinste ausführbare Einheit in einem Prozess. Das Betriebssystem bzw. der Echtzeit mit SystemScheduler des Betriebssystems teilt den Prozessen Ausführungszeit zu. Mit der Sleep-Funktion kann ein Thread für eine angegebene Zeitdauer angehalten werden. Der Mindestwert für die Sleep-Funktion ist 1, was den Thread für ca. eine Millisekunde anhält.

Eine Sleep-Einheit beträgt jedoch nicht genau 1 Millisekunde, da sie den aktuellen System-Impuls plus den Rest der vorherigen Zeiteinheit umfasst. Die Sleep-Zeit ist außerdem mit der Priorität des Threads verknüpft. Die Thread-Priorität bestimmt die Reihenfolge, in der das Betriebssystem die Threads auf dem Prozessor ausführt. Aus diesem Grund sollte die Sleep-Funktion nicht verwendet werden, wenn genaue Zeitgeber für Echtzeit-Anwendungen benötigt werden. Besser sind in diesem Fall dedizierte Zeitgeber mit Interrupts.

Die Energieverwaltung (Power Management) kann sich auf die Systemleistung auswirken. Wenn der Prozessor in den Leerlauf übergeht, verursachen alle von einem Peripheriegerät oder dem System-Scheduler generierten Interrupts, dass der Prozessorstatus gewechselt, der vorherige Kontext wiederhergestellt und der Scheduler aufgerufen wird. Der Energiekontextwechsel ist ein zeitaufwendiger Vorgang.

Der Kernel reserviert und verwaltet den Systemspeicher für Heaps, Prozesse, Critical Sections, Mutexe, Events und Semaphores. Wenn Kernel-Objekte nicht mehr benötigt werden, wird dieser Speicher jedoch nicht vollständig freigegeben. Stattdessen bleiben die Systemspeicherbereiche für die nächste Zuordnung reserviert. Da die Wiederverwendung des zugeordneten Speichers schneller ist, initialisiert der Kernel während des Startprozesses den Systemspeicherpool und ordnet weiteren Speicher nur dann zu, wenn im Pool kein Speicher mehr verfügbar ist. Die Systemleistung kann abnehmen, abhängig davon, wie die Prozesse den virtuellen Speicher, die Heap-Objekte und den Stack verwenden.

Beim Aufrufen von System-APIs oder Grafik-APIs ist zu beachten, dass das Aufrufen von APIs ohne Echtzeit-Unterstützung die Systemleistung drastisch reduzieren kann. Das Graphical Windows Event System (GWES), das die Darstellung der Fenster und der Benutzeroberfläche steuert, gehört z.B. dazu. Wer eine Benutzeroberfläche braucht, muss sich also dessen bewusst sein, dass viele Grafik-Aufrufe das System langsamer machen. Wer kritische Echtzeit-Anwendungen betreibt, sollte sicherstellen, dass die APIs, die dort aufgerufen werden, auch echtzeit-kompatibel sind.

Andere APIs, beispielsweise für den Zugriff auf ein Dateisystem oder Hardware, können die Leistung ebenfalls beeinträchtigen, da sie möglicherweise Blockaden auslösen, z.B. bei Mutexen oder Critical Sections, um Ressoucen zu schützen.

Echtzeit-Leistung messen

Windows Embedded Compact umfasst zahlreiche Tools für die Leistungsüberwachung und Problembehandlung, mit denen die Auswirkungen der Win32-APIs auf die Systemleistung ausgewertet werden können. Mit diesen Tools lässt sich eine ineffiziente Speicherbelegung identifizieren, beispielsweise wenn eine Anwendung den zugeordneten Systemspeicher nicht freigibt.

Folgende Werkzeuge von Windows Embedded Compact 7 sind insbesondere zum Auswerten der Echtzeit-Leistung der Systemkomponenten und -anwendungen nützlich:

  • ILTiming: Wertet ISR-Latenzen (Interrupt Service Routine) und IST-Latenzen (Interrupt ServiceThread) aus.
  • OSBench: Wertet die Systemleistung aus, indem die Zeitdauer überwacht wird, die der Kernel zum Verwalten der Kernelobjekte benötigt.
  • Remote Performance Monitor: Wertet die Systemleistung aus, einschließlich der Speicherbelegung, des Netzwerkdurchsatzes und anderer Aspekte.