Guten Tag,
ich habe eine Frage zu der Programmgröße. Bislang habe ich nur 8051
programmiert. Nun möchte ich auf ARM umsteigen/einarbeiten. Beim 8051
kann ich mitlerweile gut abschätzen wieviel Flash Speicher ist benötige.
Kann man jetzt sagen das ein ARM im ARM-Mode ungefähr 4x mehr Speicher
benötigt als ein 8051 (4 Byte pro Befehl) oder kann man das garnicht
abschätzen?
Zunächst möchte ich auf einem grafischen Display (128x64) analoge Werte
anzeigen und diese über UART verschicken. Was recht einfaches also.
Dafür würde ich gerne ein LPC2103 nutzen mt 32KB Flash. Das sollte doch
dicke langen oder? Gibt es irgendwelche Anhaltspunkte zum abschätzen?
Wie groß sind eure Programme so?
thx
ARM hat einen Grundballast, der je nach Umgebung und ob ARM oder Thumb
zwischen 1KB und 20KB Code liegt. Letzterem Wert nähert man sich
schnell, wenn man die GCC-newlib verwenden, also printf, malloc, ...
Andere ARM-Umgebungen sind in dieser Frage u.U. deutlich sparsamer als
WinARM/GnuARM/Yagarto.
Jenseits dieses Grundballasts ist der Code insbesondere im Thumb-Mode
kaum platzraubender als bei 8bittern. RAM wird allerdings deutlich mehr
benötigt, Faktor 2-4 bezogen auf Einzelvariablen. Irgendwelche
Pufferspeicher sind natürlich gleich.
Ich glaube die Relation zwischen 8051 und einem ARM kannst Du nur
über Deine Erfahrungswerte ermitteln. Auch je nach Programmiersprache.
Beim ARM gibt es 2 Befehlsmodi:
Thumb Befehlssatz
Und der Normale
Sie Unterscheiden sich in Ausführungsgeschwindigkeit, Befehlsumfang,
Datenbreite
Außerdem kann der ARM im Verhältnis zu 8051 versch. Operationen mit
einem
ganz anderem Befehlsumfang erledigen.
Vergleiche man nur mal mathematische Operationen wie multiplikation oder
division, schiebebefehle etc.
Probiere es einfach aus.
Danke schonmal!
Ich wollte den Keil C nutzen .. klar, ab 16Bit operationen braucht der
8051 direkt wesentlich mehr Operationen als der ARM.
Was mir jetzt nicht klar ist .. warum braucht der ARM wesentlich mehr
RAM speicher? Wenn ich doch ein Byte als Variable haben ist die doch
immer 8Bit groß bei ARM und 8051. Oder hat das damit nichts zu tun?
Unterscheiden sich Thumb und ARM-Mode 'nur' in Codegröße oder auch in
Geschwindigkeit etc. voneinander ??
newbee wrote:
> Kann man jetzt sagen das ein ARM im ARM-Mode ungefähr 4x mehr Speicher> benötigt als ein 8051 (4 Byte pro Befehl) oder kann man das garnicht> abschätzen?
So etwa 4..10 mal mehr Flash dürfte hinkommen.
Der ARM ist ein RISC, d.h. alles muß über Register gehen.
Direkte Zugriffe auf SRAM und SFRs, wie beim 8051, kann er nicht.
Hinzu kommt, daß SRAM und SFRs 32Bit Adressen haben (8051: 8 Bit).
Auch wenn 32Bit-Algorithmen vielleicht etwas effizienter sind, wirkt
sich das kaum auf die gesamte Codegröße aus, da ja Bibliotheksfunktionen
nur einmal eingebunden werden.
Nur konstante Daten (Strings, Tabellen) sind natürlich gleich groß wie
beim 8051.
> Dafür würde ich gerne ein LPC2103 nutzen mt 32KB Flash.
Dürfte in etwa nem AT89C51 (4kB Flash) entsprechen.
Peter
> So etwa 4..10 mal mehr Flash dürfte hinkommen.
1KB 8051 => 10KB ARM glaube ich gern.
40KB 8051 => 160-400KB ARM wohl kaum.
Mal ein kleines Beispiel. Eine vereinfachte printf Implementierung,
GCC/Keil.
AVR: 778 Bytes
MSP430: 488 Bytes
ARM native: 588 Bytes
ARM thumb: 322 Bytes
Keil C51: 458 Bytes
Hat hier nichts mit Algorithmen zu tun, Konvertierungsfunktionen sowie
Library sind hier nicht mitgerechnet.
Ist natürlich nur ein Beispiel. Beliebig andere Relationen finden sich
auch. Hängt stark davon ab, was man macht. Hat man bei den Daten
ausschliesslich mit Bytes zu tun, bereitet der 8051 keine Probleme.
Darüber schon.
> Direkte Zugriffe auf SRAM und SFRs, wie beim 8051, kann er nicht.
Was die SFRs angeht spielt das eine umso geringere Rolle, je grösser das
Programm ist, da weite Teile eines grösseren Programms garnicht in
Kontakt mit SFRs kommen. Bei RAM ist das sehr wohl ein Thema, hängt aber
auch von der Programmiertechnik ab - beispielsweise wenn mit dem 8051 im
Kopf ARM Code schreibt.
> Dass ARM Code grösser ist als Thumb Code ist klar. Aber warum Daten?
Ich hab leider die Testfiles nicht mehr, aber vielleicht kann der IAR
Compiler globale Variable im Thumb Modus anders anordnen (alignment).
Oder ich hab mich im Auswerten geirrt ;-(
Der Vergleich ist sowieso mit Vorsicht zu genießen,
da z.B. bei hauptsächlich 32Bit Variable, m.E. der ARM Compiler von ARM
am Besten optimiert.
Hier noch ein Vergleich IAR 4.20 ARM/THUMB, maximale Optimierung:
76 024 bytes in segment CODE
4 bytes in segment DATA_AC
36 bytes in segment DATA_AN
3 497 bytes in segment DATA_C
1 975 bytes in segment DATA_I
1 975 bytes in segment DATA_ID
228 bytes in segment DATA_Z
24 bytes in segment INITTAB
74 604 bytes of CODE memory (+ 1 444 bytes shared)
5 472 bytes of CONST memory (+ 4 bytes shared)
2 203 bytes of DATA memory (+ 36 bytes shared)
56 270 bytes in segment CODE
4 bytes in segment DATA_AC
36 bytes in segment DATA_AN
3 497 bytes in segment DATA_C
519 bytes in segment DATA_I
519 bytes in segment DATA_ID
1 696 bytes in segment DATA_Z
24 bytes in segment INITTAB
54 138 bytes of CODE memory (+ 2 156 bytes shared)
4 016 bytes of CONST memory (+ 4 bytes shared)
2 215 bytes of DATA memory (+ 36 bytes shared)