Strategien zur Verwaltung der Codegröße - PIC18 XC8

7

Ich bin neu in der Embedded C-Entwicklung und suche nach allgemeinen Prinzipien / Richtlinien für die Verwaltung der Größe des generierten Codes.

In meinem speziellen Beispiel verwende ich XC8 auf einem PIC18F4550. Mein Code belegt bisher etwa 13% des Speicherplatzes. Sobald ich "time.h" und 1/2 Funktionen davon benutze, springt die Nutzung auf 45%! Mir ist klar, dass der kostenlose XC8-Compiler nicht optimiert, aber ich bin trotzdem sehr überrascht zu sehen, wie viel Speicherplatz verwendet wird.

Was ich suche nach Tipps / Blickpunkten nach dem Vorbild von

  • Alternativen zu den Standardbibliotheken, die in kleinen, zielgerichteten Teilmengen der Funktionalität implementiert werden. ZB eine Datums- / Zeitbibliothek. dh gibt es Repositionen, von denen ich nützliche Routinen erhalten kann?
  • Wie man sieht, was den ganzen Raum nutzt. (Listing / Map-Dateien - und Tipps zu deren Analyse)
  • Alle anderen Tipps / Ressourcen.

BEARBEITEN : Ich habe hier eine nette Implementierung ohne Verwendung von stdlib gefunden: /codereview/38275/convert-between-date-time-and-time-stamp-without-using-std-library-routines

Die allgemeine Frage bleibt jedoch bestehen. Gibt es Richtlinien, gute Repository-Quellen usw.

Andre
quelle
Ist Opt Level 1 nicht erlaubt? Für wenig mehr können Sie eine der neuen pic32-Linien mit viel mehr Blitz bekommen. Es scheint, dass xc8 eingeschränkter ist als die 16 und 32 Compiler.
Erik Friesen
1
@ErikFriesen Danke Ich werde auf jeden Fall später die pic32-Reihe ausprobieren. Im Moment möchte ich versuchen, es mit dem pic18 zum Laufen zu bringen. Das interessiert mich aber auch allgemein. Dh es wird immer eine Platzbeschränkung geben und ich würde gerne verstehen, wie man Dinge verbessern kann
Andre
1
Wir haben eine Lizenz für XC8 Pro, die unser Haupt-Firmware-Typ verwendet. Der Rest von uns entwickelt mit der kostenlosen Version für kleinere Sachen, und er zieht und kompiliert, falls nötig, zur Optimierung. Es scheint mir, dass der Compiler die gesamte Optimierung in der kostenlosen Version anwendet, aber eine Reihe von Verzweigungsanweisungen einfügt. Die Demontage von der Pro-Version und der kostenlosen Version sieht also gleich aus. In der kostenlosen Version springen nur eine ganze Reihe von Zweigen herum. Sie können alle benötigten Funktionen aus der Zeitbibliothek übernehmen und Ihre eigenen drehen. Dort ist fast immer Platz gespart.
Matt Young
Danke @MattYoung, ja, ich denke, die Antwort für die Bibliotheken wird so ziemlich nur Google für vorhandene Lösungen / andere Standard-Labs sein und von dort aus modifizieren. Es scheint, dass die Platzersparnis erheblich sein wird. Ich bin überrascht, dass es keine weiteren Unterschiede zwischen den kostenlosen und den Pro-Ausgängen gibt. Ich habe viele gegenteilige Kommentare / Beschwerden gesehen. Sehr interessant.
Andre
Ich habe die beiden nur in einigen Anwendungen ausführlich verglichen, in denen das Timing entscheidend war, aber das waren meine Ergebnisse. Es lohnt sich auf jeden Fall, weiter zu lesen.
Matt Young

Antworten:

2

Hier sind einige Dinge, die ich bei der Verwendung des Microchips C18-Compilers getan habe. Möglicherweise gelten die Konzepte für Ihren Compiler: - Deklarieren Sie jede Zeichenfolge einmal. Fügen Sie eine separate .c-Datei ein und verwenden Sie eine .h-Datei, um auf sie zu verweisen. Mit anderen Worten, duplizieren Sie Anzeigemeldungen nicht mehrmals. - Zeichenfolgen so deklarieren, dass sie in Rom gehen. Dies hilft Ihnen nicht mit ROM (Code Space), spart aber Speicherplatz. - Schreiben Sie engen Code. Wenn mehrere Codezeilen dupliziert werden, fügen Sie sie in eine Funktion ein. Kopieren / Einfügen ist nicht erforderlich, ein eingebetteter Programmierer bester Freund. - Implementieren Sie, wie Sie bereits gedacht haben, Ihre eigenen Funktionen, anstatt eine Bibliothek einzuschließen. Ich habe einmal eine Menge Platz gespart, indem ich meine eigene itoa () -Funktion erstellt habe. Versuchen Sie, printf nicht zu verwenden.

BrianK
quelle
3

Ich habe mich ein bisschen umgesehen und hier sind die Tipps, die ich finden kann

  1. Schreibe besseren Code. Codegröße und -geschwindigkeit müssen bei jedem Schritt des Weges berücksichtigt werden.
  2. Der C-Compiler / Linker verwendet nur die Funktionen, die Sie tatsächlich verwenden. Das Einfügen einer .h-Datei sollte also die Codegröße nicht (stark) erhöhen.
  3. Standardfunktionen sind jedoch häufig allgemeiner als erforderlich. Es ist möglich, kleinere Versionen zu schreiben, die nur das tun, was Sie benötigen
  4. Geteilte Zeichenfolgen gemäß der Antwort von @ BrianK

Dann gibt es einige Alternativen, die das Kernproblem der Codegröße nicht ansprechen, aber möglicherweise in Betracht gezogen werden müssen, wenn alles andere fehlschlägt

  1. Verwenden Sie einen PIC mit mehr Platz
  2. Verwenden Sie einen optimierenden Compiler, z. B. MPLAB Pro
  3. Verwenden Sie Assembler für einen Teil oder den gesamten Code

Ich möchte immer noch auf einfache Weise sehen, welche Funktionen und enthaltenen Funktionen den meisten Platz beanspruchen. Ich werde hier aktualisieren, wenn ich einen einfachen Weg dazu finde.

Andre
quelle
2

Das Implementieren einer eigenen Version von Standardfunktionen anstelle der gesamten Bibliothek kann hilfreich sein. Es gibt eine Million kleinerer, spezifischerer Optimierungen, die Sie vornehmen können, aber eine gute Referenzsammlung dieser Art von Tricks ist das Buch Hacker's Delight . Es ist sehr praktisch (besonders für ein bisschen Twiddling, wie Sie es oft auf einem Mikrocontroller tun) und ich empfehle es.

aloishis89
quelle
2
Ich habe die erste Ausgabe von Hacker's Delight (und liebe es). Irgendwelche Ideen, was die Unterschiede in der zweiten Ausgabe sind? Lohnt es sich zu bekommen, wenn ich den ersten habe?
Tcrosley
Ich habe nicht die erste Ausgabe, aber ich glaube, die zweite Ausgabe enthält eine Reihe neuer Materialien sowie einige Verfeinerungen des Originals.
Aloishis89
Es gibt kein "Einschließen der gesamten Bibliothek", nur die von Ihnen verwendeten Funktionen werden mit dem Programm verknüpft. Beachten Sie, dass die Standardbibliothek für Ihren Compiler möglicherweise für das jeweilige Ziel optimiert ist. Es ist unwahrscheinlich, dass das Schreiben einer eigenen Version dieser Funktionen Platz spart. Eher wird es das Gegenteil tun.
Lundin
2
@ Lundin das ist wahr. Das heißt, wenn ich strfmttime verwende, sehe ich eine große Zunahme der Größe gegenüber der Verwendung von gmtime usw. Ich stimme jedoch nicht der allgemeinen Aussage zu, dass das Schreiben eigener Bibliotheken nicht hilfreich ist. Es ist unwahrscheinlich, dass ich eine effizientere Funktion zum Ersetzen von Funktionen erstellen kann. Ich benötige jedoch nur einen kleinen Prozentsatz der bereitgestellten Funktionalität. (Zeitzone usw. Code ist enthalten, da die gmtime usw. dies voraussetzt). Ich konnte eine kleine gezielte Teilmenge der Funktionalität schreiben und 20% der Speicherplatznutzung einsparen. Das Schreiben einer minimalen Teilmenge ist also möglich. Guter Punkt zum Verknüpfen. Danke
Andre