Messen Sie die Verwendung von statischem Speicher für C ++, das auf die eingebettete Plattform portiert wird

8

Ich habe ein kleines Programm als Proof-of-Concept für ein System erstellt, das auf einer Embedded-Plattform implementiert werden soll. Das Programm ist in C ++ 11 mit der Verwendung von Std geschrieben und kompiliert, um auf einem Laptop zu laufen. Das endgültige Programm, das später implementiert werden sollte, ist ein eingebettetes System. Wir haben keinen Zugriff auf den Compiler der eingebetteten Plattform.

Ich würde gerne wissen, ob es einen Weg gibt, einen statischen Speicher eines Programms (die Größe der kompilierten Binaries) in einer vernünftigen und vergleichbaren Weise zu bestimmen, wenn es auf eine eingebettete Plattform portiert werden sollte. Die Anforderung ist, dass die Größe der Binärdatei weniger als 10 KB beträgt. Unsere Binärdatei hat eine Größe von 700 KB, wenn sie mit den folgenden Flags kompiliert und entfernt wird:

%Vor%

Es dauerte 4 MB, bevor wir Strip- und Optimierungsoptionen verwendet haben.

Ich bin immer noch weit weg und es ist nicht wirklich so ein großes Programm. Wie kann ich einen Vergleich mit einem gleichwertigen Programm auf einer eingebetteten Plattform rechtfertigen?

    
CodeTower 29.05.2013, 16:57
quelle

2 Antworten

4

Beachten Sie, dass die Größe der Binärdatei in dem Sinne trügerisch sein kann, dass nicht initialisierte Variablen, die .bss-Abschnitte, nicht notwendigerweise physischen Platz in der Binärdatei belegen, da diese im Allgemeinen nur als vorhanden notiert werden, ohne tatsächlich Platz zu haben ihnen gegeben ... das passiert normalerweise vom OS Loader, wenn es Ihr Programm ausführt.

objdump ( Ссылка ) oder vielleicht elfdump oder die Elfenwerkzeugkette ( Ссылка ) wird Ihnen helfen, die Größe Ihrer verschiedenen Segmente, Daten und Text, sowie die Größe einzelner Funktionen und Globals usw. zu bestimmen. Alle Diese Programme "schauen" in Ihre kompilierte Binärdatei und extrahieren viele Informationen wie die Größe des .text-, .data-Abschnitts, listen die verschiedenen Symbole, ihre Positionen und Größen auf und können sogar den .text-Abschnitt ...

Ein Beispiel für die Verwendung von elfdump in einem ELF-Bild test.elf könnte elfdump -z test.elf > output.txt sein. Dies wird alles dumpen, einschließlich der Demontage von Textabschnitten. Zum Beispiel, von einem elfdump auf meinem System sah ich

%Vor%

So kann ich sehen, wie viel Code (die .text-Abschnitte) und meine schreibgeschützten Daten verbrauchen. Später in der Datei sehe ich dann ...

%Vor%

So kann ich sehen, dass meine Funktion IRemovedThisName 130 Bytes braucht. Ein schnelles Skript würde Ihnen erlauben, Funktionen sortiert nach Größe und Variablen sortiert nach Größe aufzulisten. Dies könnte Sie auf Orte zur Optimierung hinweisen ...

Für ein gutes Beispiel von objdump versuchen Sie Ссылка , speziell den Abschnitt 3, der zeigt Sie erfahren, wie Sie den Inhalt der Abschnittsüberschriften mit der Option -h erhalten.

Wie das Programm auf zwei verschiedenen Plattformen vergleichen wird Ich denke, Sie müssen nur auf beiden Plattformen kompilieren und vergleichen Sie die Ergebnisse, die Sie von Ihrem obj/elfdump auf jedem System erhalten - die Ergebnisse hängen von der System-Anweisung ab, wie gut jeder Compiler optimieren kann, allgemeine Unterschiede in der Hardwarearchitektur usw.

Wenn Sie keinen Zugriff auf das eingebettete System haben, können Sie versuchen, einen Cross-Compiler zu verwenden, der für Ihr eventuelles Ziel auf Ihrem Laptop konfiguriert ist. Dadurch erhalten Sie eine Binärdatei, die für die eingebettete Plattform und die Tools zum Analysieren der Datei geeignet ist (d. H. Die plattformübergreifende Version von objdump ). Dies würde Ihnen einige Ball-Park-Zahlen dafür geben, wie das Programm auf dem eventuellen eingebetteten System aussehen würde.

Hoffe, das hilft.

EDIT: Dies wird auch helfen, Wie die Größe eines zu bekommen C-Funktion aus einem C-Programm oder mit Inline-Assembly?

    
Jimbo 29.05.2013, 17:12
quelle
1

Es stellte sich heraus, dass die enthaltenen Bibliotheken sehr viel Platz beanspruchten (wie im Kommentar erwähnt wurde) und durch das Entfernen dieser konnte die Größe in Kombination mit den folgenden Flags auf fast nichts reduziert werden:

%Vor%

Und entfernen Sie unnötigen Code mit:

%Vor%

Die 4MB könnte auf 9.4kb reduziert werden, was unter unserer Grenze liegt.

Zusammengefasst benötigt std eine enorme Menge an Speicherplatz.

    
CodeTower 29.05.2013 20:29
quelle

Tags und Links