events
Am 24. Mai 2012 findet das DESIGN&ELEKTRONIK-Entwicklerforum »HMI – Komponenten & Lösungen« mit begleitender Fachausstellung statt. Die Themen: »Bedienen und Beobachten: Technik, Know-how und Tools für das Design moderner Benutzerschnittstellen«.
Auch in diesem Jahr veranstaltet die DESIGN&ELEKTRONIK wieder das Entwicklerforum »Embedded-System-Entwicklung« am 11. und 12. Juli 2012 in München. Neben einem technisch anspruchsvollen Vortragsprogramm ermöglichen verschiedene Workshops den Teilnehmern einen differenzierten Einblick in die Thematik.
Ausführliche Informationen:
www.embedded-entwicklerforum.de
Produkte des Jahres 2012
Linux /ARM
Linux ist heute erste Wahl geworden, wenn es um die Entscheidung für ein Betriebssystem in einem leistungsfähigen Embedded-System geht. Wie kann es sein, dass eine Open-Source-Software gerade bei Embedded-Systemen so erfolgreich ist?
Die große Konferenz für ARM-Systementwicklung am 11. und 12. Juli 2012 in München bietet Entwicklern die Gelegenheit, sich detailliertes Wissen über die aktuellen Cortex-Architekturen anzueignen, die mittlerweile zum Industriestandard avanciert sind.
Ausführliche Informationen:
www.arm-entwicklerkonferenz.de
embedded world Technology Report
Infos und Hintergründe rund um Android im Embedded-Umfeld.
Welche Embedded-Trends zeichnen sich ab? Im »embedded world Technology Report« gibt ein unabhängiger Expertenrat einen exklusiven Einblick in aktuelle Entwicklungen und zukünftige Trends im Embedded-Bereich.
Interessiert? Hier geht es zum kostenlosen Download
embedded world special
Wir haben aktuell von der weltgrößten Messe für die Embedded-Branche mit News, Videobeiträgen und Produktneuheiten berichtet.
Windows Embedded Standard 7
Was ist neu in Windows Embedded Standard 7? Lesen Sie alles rund um das neue Microsoft-Embedded-Betriebssystem Embedded Standard 7 in unserem Spezial.
Windows 7 - Special zum Download
Marktübersichten Embedded
Wer bietet was?
Schnelle Information auf einen Klick!
Software im sicherheitskritischen Bereich
Um die »Worst-Case Execution Time« zu erhalten, gibt es verschiedene Herangehensweisen – bequeme und weniger bequeme.
Zeitverhalten automatisch analysieren und optimieren
Kurzer Weg zum schnellen Code
In komplexen Embedded Systemen kann jeder noch so kleine Performance-Bug schnell zum Flaschenhals werden. Mit neuen Verfahren lassen sich Performance-Einbrüche bei der Codeabarbeitung und beim Datenzugriff automatisch finden, die Tools geben zudem Hinweise für die Optimierung des Codes.
Anzeige
Galt früher alleine Stabilität im Sinne von logischen Fehlern oder Programmierfehlern als Maß für die Qualität von Software, so sind heute auch die erzielte Rechenleistung, etwaige Performance-Einbrüche und eine optimale Ausnutzung der Hardware mit einzubeziehen. Performance-Bugs lassen sich zwar mit Hilfe üblicher Profiling-Methoden messen, diese erfordern allerdings eine Code-Instrumentierung, beeinflussen also selbst das Laufzeitverhalten der Applikation.
In typischen »Deeply Embedded«-Anwendungen zum Beispiel im Automobil- oder Industriebereich ist eine solche Veränderung des Laufzeitverhaltens nicht akzeptabel. Hier sind alle auszuführenden Tasks zyklisch abzuarbeiten, nicht selten ist die Länge des Zyklus' genau festgelegt und keine der Tasks darf das vorgegebene Zeitregime verletzen, auch wenn es zu Ausnahmesituationen kommt. Die Applikation muss also bestimmte Antwortzeiten zwingend einhalten und darf auch unter hoher Last die Spezifikation nicht verletzen.
Anders als bei universellen Prozessoren ist bei modernen »Systems-on-Chip« (SoC) wie den High-End-Mikrocontrollern »TC1797« von Infineon (Bild 1) nicht so sehr die – meist vergleichsweise niedrige – Taktfrequenz wichtig, sondern ein auf das jeweilige Anwendungsgebiet optimiertes, komplexes Systemdesign. Der Schlüssel für eine hohe Leistungsfähigkeit und einen großen Datendurchsatz liegt vor allem in den geringen Zugriffzeiten der internen Speicher, den spezialisierten Einheiten und der Aufgabenteilung der Busse. Die richtigen Werkzeuge vorausgesetzt, lässt sich die Performance meist noch deutlich steigern.

Codeoptimierung mittels Profiling
Moderne Compiler bieten dem Entwickler meist gleich eine ganze Reihe statischer, auf der Analyse des Programmcodes basierender Code-Optimierungsmöglichkeiten, die unabhängig von der Zielarchitektur anwendbar sind. Dazu gehören zum Beispiel »Loop Unrolling«, »Function Inlining« oder »Common Subexpression Elimination«, um nur einige zu nennen. Zusätzlich können optimierende Compiler spezielle Chip-Features ausnutzen, wie sie auch der TC1797 bietet. Weil hierfür das zeitliche Verhalten des Programms unter realen Bedingungen bekannt sein muss, versagt hier die statische Programmanalyse. Vor allem die Einflüsse des Speichersubsystems auf die Leistung lassen sich erst während der Laufzeit beobachten und messen. Einige typische Performance-Bugs, die in diesem Zusammenhang auftreten können, sind: Cache-Effekte: Code und Daten werden wiederholt aus den Caches verdrängt und müssen aufwändig aus den langsameren Speichern zurückgeholt werden, Kontrollfluss mit vielen Sprüngen: Sprungbefehle bremsen das Programm aus, zum Beispiel wenn der Befehlscache nicht den angesprungenen Code enthält oder die Prozessor-Pipelines leerlaufen, hohe Interruptlast: Häufige Interrupts unterbrechen den normalen Programmablauf. Damit verbunden sind wiederum Verdrängungseffekte in den Caches.
Um bei der Code-Optimierung auch solche Effekte berücksichtigen zu können, gilt es erst einmal, Informationen über das Laufzeitverhalten zu sammeln. Ein »Application Profiling« zeigt, welche Wege das Programm durch seinen Kontrollflussgraphen (CFG) bevorzugt. Letzterer beinhaltet alle möglichen Wege durch das Programm in Form von Kanten, die wiederum die Basisblöcke (Knoten) miteinander verbinden. Basisblöcke sind linear hintereinander ausgeführte Sequenzen von Maschinenbefehlen, die keine Verzweigung durch einen Sprung oder Call beinhalten. Die »Coverage-Analyse«, ein Verfahren, das beispielsweise für das Profiling im »GNU-Compiler« zur Anwendung kommt, instrumentiert nun alle Kanten, die für eine spätere Rekonstruktion des Kontrollflusses nötig sind (Bild 2). Die Instrumentierung fügt eine Codesequenz in die jeweilige Kante ein und allokiert gleichzeitig einen Speicherplatz im Target-Speicher, der einen Zähler enthält. Beim Beschreiten der Kante wird gleichzeitig der zugehörige Zähler inkrementiert.
Nach Beendigung des Profiling-Laufes wertet das Tool »gcov« die Zähler aus und ermittelt Programmteile, die einen hohen Anteil an der Gesamtlaufzeit haben. Zusätzlich lassen sich auch kritische Pfade im Programm finden, die durch Umsortieren und Zusammenfassen von Basisblöcken ein günstigeres Cache-Verhalten und eine bessere Auslastung der Prozessor-Pipelines ermöglichen. Wie schon erwähnt, ist die eben beschriebene Verfahrensweise für Deeply-Embedded-Applikationen allerdings nicht akzeptabel. Nicht nur verändert die Instrumentierung das Laufzeitverhalten, sondern die Zähler belegen auch den oft knappen Target-Speicher.

1. Teil: Kurzer Weg zum schnellen Code
2. Teil: Profiling ohne Eingriffe
Weiterführende Links:
- Laufzeitfehler in Embedded-Software finden: Die statische Software-Analyse
- Laufzeit-Berechnung: Wie man die »Worst Execution Time« bestimmt
- Debugging:: pls: UDE 2.6 unterstützt Infineons Audo-Future-Serie
- Für Automotive- und Industrie-Anwendungen: Entwicklungsumgebung für 16-/32-Bit-MCUs von Infineon
- Fehlersuche für XC2x00- und XE166-Reihe: Optimierte Entwicklungsumgebung für Infineon-MCUs
- Vollautomatischer Softwaretest
- Multi-Core-CPUs besser im Griff: pls: Neuartiges Test- und Debuggingtool
- Linux: Software-Kopierschutz ohne Quellcode-Eingriffe
-
Homepage pls Development Tools











