Forum: Mikrocontroller und Digitale Elektronik Wieviel Zeilen Code passt in 64 kB Flash Rom ?


von Bernd O. (predator7)


Lesenswert?

Hallo, kann man generell Sagen wie viel Zeilen Code in 64 kB , 128 kB 
und 256 kB Flash Rom passen?

Gibt es da auch einen Unterschied zwischen den 32 Bit ARM 
Mikrocontrollern von TI (TM4C) und den 8 Bit Mikrocontrollern von AVR 
(ATmega8)?

: Bearbeitet durch User
von Olaf (Gast)


Lesenswert?

Ich bin mir sicher, dass wenn man sich etwas Mühe gibt,
bekommt man mit wenigen Zeilen, jeden Speicher voll.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

42.

von Dummschwaetzer (Gast)


Lesenswert?

nein
ja

von ASM Superprofi (Gast)


Lesenswert?

Ein AVR mit 8 kB Flash fasst genau 4096 Zeilen AVR ASM Code, wenn man 
die paar Befehle nicht einsetzt, die ein doppelwort belegen.

Weiss gar nicht, warum hier nicht einfach die Antwort auf die Frage 
gegeben wird und gut ist?

von murx (Gast)


Lesenswert?

Compilier mal den gleichen Code für unterschiedliche Architekturen und 
dann mal mit und ohne Optimierung, dann schreib mal in eine Zeile 1000 
Befehle mit ; getrennt oder nur einen in je 1000 Zeilen. Dann guck mal 
wieviele Zeilen ASM Code aus deinem C Code gemacht wurden.

von radiostar (Gast)


Lesenswert?

ASM Superprofi schrieb:
> Weiss gar nicht, warum hier nicht einfach die Antwort auf die Frage
> gegeben wird und gut ist?

Weil die Frage Unsinn ist.

von Der Andere (Gast)


Lesenswert?

Mindestens eine Million Leerzeilen, eher mehr.

von awsssxddrt (Gast)


Lesenswert?

ASM Superprofi schrieb:
> Ein AVR mit 8 kB Flash fasst genau 8192 Zeilen AVR ASM Code, wenn
> man
nur NOP verwendet.

awsssxddrt

von klugscheißerlein (Gast)


Lesenswert?

radiostar schrieb:
> Weil die Frage Unsinn ist.

Unsinn ist die Frage nicht, denn für den Entwickler ist das eine enorm 
wichtige Frage bei der Auswahl der Hardware. Nur ist die Frage sehr 
schwer zu beantworten.

von Der Andere (Gast)


Lesenswert?

Sie ist Unsinn, wenn ich z.B. C nehme kann ich mit einer Zeile (Printf 
auf ein double) schon einige kB an programmcode durch importLibs 
generieren.
Das gleiche gilt, wenn ich C++ mit dynamsicher Allozierung benutze.

Wenn ich statt dessen trivialen Code mit vielen Leerzeilen und/oder 
Kommentar habe (oder gar Assembler) dann liegt der Verbrauch ganz 
schnell um mehrere Größenordnungen niedriger.

von Falk B. (falk)


Lesenswert?

@Bernd Olsen (predator7)

>Hallo, kann man generell Sagen wie viel Zeilen Code in 64 kB , 128 kB
>und 256 kB Flash Rom passen?

Nein, das kann man nicht, denn es gibt keinen festen Zusammenhang 
zwischen der Anzahl Codezeilen einer Hochsprache und der daraus 
entstehenden Binärdatei. Das liegt u.a. daran, daß sich hinter einfachen 
Anweisungen sehr große Funktionen verbergen können, welche viel 
Speicherplatz verbrauchen.

>Gibt es da auch einen Unterschied zwischen den 32 Bit ARM
>Mikrocontrollern von TI (TM4C) und den 8 Bit Mikrocontrollern von AVR
>(ATmega8)?

Sicher, denn diese haben undterschiedliche CPUs und damit Befehlssätze.

von Ordner (Gast)


Lesenswert?

klugscheißerlein schrieb:
> radiostar schrieb:
>> Weil die Frage Unsinn ist.
>
> Unsinn ist die Frage nicht, denn für den Entwickler ist das eine enorm
> wichtige Frage bei der Auswahl der Hardware. Nur ist die Frage sehr
> schwer zu beantworten.

Nee die ist simpel zu beantworten. Bringt aber nix weil die eigenetliche 
Frage: "Passt meine Programm in den uC" nicht beantwortet wird, weil es 
keine Umrechnung für  lines_of_code  = F(Problemstellung) gibt. Oder 
kann einer sagen wieviel lines of code besoielsweise für eine simple 
Lötstation wie diese braucht?


http://www.elv.de/elv-80-w-komfortloetstation-at-80d.html

Und welche verkaufsfürdernde Konfortfeatures man einbauen muss um den 
Absatz zu erhöhen oder Kosten bei der Produktion zu sparen. Und ob 
dieser Absatzsteiegerung die Kosten für größeren Code rechtfertigt. Oder 
ob Kosteneinsparung durch Reduzierung Programcode und downgrad auf 
kleineren µC nicht wieder potentielle Kunden vergrault und so als Schuß 
ins eigene Knie endet.

von murx (Gast)


Lesenswert?

Entweder man hat Erfahrungswerte oder man nimmt mal ein Evaluierungs 
Board mit viel Flash und beschafft sich so Erfahrungswerte.

Die Frage ist aber trotzdem Unsinn denn um Sinn zu machen müsste sie 
genau spezifiziert sein auf CPU, und Programmiersprache wobei als 
Programmiersprache nur Assembler dafür taugt und wie schon gesagt wurde 
auch nicht von der Anzahle der möglichen Befehle auf eine Problemlösung 
zurückgeführt werden kann oder es müssten zuerst Statistiken erstellt 
werden was die durchschnittliche Programmgröße für bestimmte 
Programmiersprachen und Aufgaben ist.

von Hp M. (nachtmix)


Lesenswert?

Bernd O. schrieb:
> Hallo, kann man generell Sagen wie viel Zeilen Code in 64 kB , 128 kB
> und 256 kB Flash Rom passen?

Ziemlich viele.
Bei Briefen haben wir früher mit etwa 2000 Zeichen pro Seite gerechnet.

Aber du willst ja vermutlich nicht den Sourcecode im Flash speichern.
Falls doch, böte es sich an den Text vorher zu komprimieren.

von Ordner (Gast)


Lesenswert?

Hp M. schrieb:
> Aber du willst ja vermutlich nicht den Sourcecode im Flash speichern.
> Falls doch, böte es sich an den Text vorher zu komprimieren.

Und wohin willst du beim AVR den komprimierten code entpacken???

von ASM Superprofi (Gast)


Lesenswert?

Achso ich vergass, dass hier keiner mehr richtig in Assembler 
programmiert. Da ist die Frage nämlich banal und einfach zu beantworten.

von spess53 (Gast)


Lesenswert?

Hi

>Da ist die Frage nämlich banal und einfach zu beantworten.

Weder banal, noch einfach zu beantworten.

Und ich programmiere noch in Assembler.

MfG Spess

von ASM Superprofi (Gast)


Lesenswert?

spess53 schrieb:
> Weder banal, noch einfach zu beantworten.

Begründung?

von ASM Superprofi (Gast)


Lesenswert?

Ich sagte bereits weiter oben, dass man sich auf Befehle beschränken 
muss, die nur ein Wort belegen. Während man auf call und jmp meistens 
gut verzichten kann, muss man bei lds und sts jedoch zwei Datenworte 
einkalkuieren. Alle anderen AVR Befehle kommen mit 2 Byte aus, also 
banal.

von Peter II (Gast)


Lesenswert?

ASM Superprofi schrieb:
>> Weder banal, noch einfach zu beantworten.
>
> Begründung?

Kommentare, Labels, nops, Leerzeilen.

von Mark B. (markbrandis)


Lesenswert?

ASM Superprofi schrieb:
> Achso ich vergass, dass hier keiner mehr richtig in Assembler
> programmiert. Da ist die Frage nämlich banal und einfach zu beantworten.

Nur wenn jeder Befehl auf dem Prozessor die gleiche Menge an Bytes zur 
Kodierung benötigt. Es gibt Prozessoren bei denen dies der Fall ist, 
aber das sind bei weitem nicht alle.

Siehe auch:
https://en.wikipedia.org/wiki/Instruction_set#Instruction_length

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Ich sagte bereits weiter oben, dass man sich auf Befehle beschränken
>muss, die nur ein Wort belegen. Während man auf call und jmp meistens
>gut verzichten kann, muss man bei lds und sts jedoch zwei Datenworte
>einkalkuieren.

Wenn man nur Spielzeugprogramme, die auf Call und Jmp verzichten können, 
programmiert, magst du Recht haben. Meine Programme sind im allg. 
größer.

MfG Spess

von radiostar (Gast)


Lesenswert?

ASM Superprofi schrieb:
> Ich sagte bereits weiter oben, dass man sich auf Befehle beschränken
> muss, die nur ein Wort belegen. Während man auf call und jmp meistens
> gut verzichten kann, muss man bei lds und sts jedoch zwei Datenworte
> einkalkuieren. Alle anderen AVR Befehle kommen mit 2 Byte aus, also
> banal.

Das ist ja alles schön und richtig - nur, was bringt uns dieses Wissen? 
Deswegen wissen wir noch lange nicht, ob ein bestimmtes Problem sich mit 
der angebotenen Speichermenge lösen lässt. Und deshalb meinte ich weiter 
oben, daß die Frage Unsinn ist.

von Mark B. (markbrandis)


Lesenswert?

ASM Superprofi schrieb:
> Ein AVR mit 8 kB Flash fasst genau 4096 Zeilen AVR ASM Code, wenn man
> die paar Befehle nicht einsetzt, die ein doppelwort belegen.
>
> Weiss gar nicht, warum hier nicht einfach die Antwort auf die Frage
> gegeben wird und gut ist?

Er hat aber nicht nur nach AVR gefragt, sondern auch nach ARM.

Es bleibt dabei: So wie die Frage gestellt ist, ergibt sie nicht viel 
Sinn. Einen 32-Bit ARM Mikrocontroller programmiert heutzutage auch 
praktisch niemand mehr in reinem Assembler. Bei einem kleinen 8-Bitter 
mag das noch anders aussehen.

von Der Andere (Gast)


Lesenswert?

ASM Superprofi schrieb:
> Achso ich vergass, dass hier keiner mehr richtig in Assembler
> programmiert. Da ist die Frage nämlich banal und einfach zu beantworten.

Schön, dein Hobby ist also Fragen zu beantworten, die so nie gestellt 
wurden.
Wenig sinnvoll, aber das muss ein Hobby ja auch nicht sein :-)

Oder wo stand in der Frage das Wörtchen "Assembler"?

von S. R. (svenska)


Lesenswert?

Davon abgesehen gibt es auch Makroassembler, mit denen man in wenig Code 
viel Flash verbraten kann.

von Joachim B. (jar)


Lesenswert?

Bernd O. schrieb:
> Hallo, kann man generell Sagen wie viel Zeilen Code in 64 kB , 128 kB
> und 256 kB Flash Rom passen?

Nein

ich fange jetzt nicht an Codezeilen zu zählen, aber in meinem NETIO von 
Pollin mit m1284p stecken 66KB Code aus etlichen *.o Files.

: Bearbeitet durch User
von Ordner (Gast)


Lesenswert?

Der Andere schrieb:
> Oder wo stand in der Frage das Wörtchen "Assembler"?

Da steht da zwar nicht, aber wenn man gewillt ist der Fragen einen Sinn 
zuzugestehen dann ist die Schlußfolgerung Lines of code (Code zeilen) = 
Assembler zwangsläufig.

Bei anderen Programmiersprachen macht die Frage nach der 
Programmspeicherkapazität gemessen in "lines of code" keinen Sinn, weil 
es keinen festen Umrechnungsfactor zwischen Codezeile (bspw  C++) und 
dem machine-code (in dem das Prog letzlich angespeichert wird), gibt!

Bspw. ein einzeiliger Methodenaufruf in einer OOP-Syntax metasiert 
ruckzuck zu einer wahren POP/PUSH Orgie.

von Nop (Gast)


Lesenswert?

Also mal so als Anhaltpunkt einer Größenordnung, ich hab ein Projekt mit 
20.000 Zeilen Code. Dabei sind nur die C-Files berücksichtigt, nicht die 
Includefiles. Kommentarzeilen und Leerzeilen sind auch rausgerechnet.

Bibliotheken habe ich keine drin, auch nicht die C-Runtime - natürlich 
kann man sich mit Bibliotheken das Binary nahezu beliebig aufblähen.

Auf STM32 schmeißt GCC am Ende etwa 128kB an Binärcode raus, optimiert 
auf Geschwindigkeit, nicht auf Größe. Das eigentliche Image ist noch 
deutlich größer, aber das sind inkludierte Binärdaten und kein Code.

Einige kB kann man noch abziehen, das sind Lookuptabellen, die ja auch 
Daten und kein Code sind, das sind geschätzt etwa 10kB.

Unterm Strich geben also 20.000 Zeilen C-Quelltext dann 118kB Binärcode.

Hängt aber auch sehr davon ab, WIE man codiert - ich selber bevorzuge 
einen Stil mit recht simplen Anweisungen pro Zeile, d.h. ich splitte 
komplexe Anweisungen lieber auf mehrere Zeilen. Außerdem setze ich die { 
und } jeweils in eigene Zeilen.

Man könnte von meinen Zeilen oftmals auch zwei, drei Zeilen in eine 
komplexere Zeile gießen, das wäre dann kompakter, aber für meinen 
Geschmack schlechter lesbar.

von Yalu X. (yalu) (Moderator)


Lesenswert?

ASM Superprofi schrieb:
> Achso ich vergass, dass hier keiner mehr richtig in Assembler
> programmiert.

Auch in Assembler lassen sich mehrere Instruktionen in eine Zeile packen
(zumindest beim GNU-Assembler geht das mit "$" als Trennzeichen).

Auch in Assembler kann ein Aufruf einer Bibliotheksfunktion (1 CALL-
Instruktion) nahezu beliebig langen Bibliothekscode nach sich ziehen.

> Da ist die Frage nämlich banal und einfach zu beantworten.

Richtig, nämlich folgendermaßen (und das sogar unabhängig von der
verwendeten Programmiersprache):

Bernd O. schrieb:
> Hallo, kann man generell Sagen wie viel Zeilen Code in 64 kB , 128 kB
> und 256 kB Flash Rom passen?

Nein.

> Gibt es da auch einen Unterschied zwischen den 32 Bit ARM
> Mikrocontrollern von TI (TM4C) und den 8 Bit Mikrocontrollern von AVR
> (ATmega8)?

Ja.

von W.A. (Gast)


Lesenswert?

klugscheißerlein schrieb:
> Unsinn ist die Frage nicht, denn für den Entwickler ist das eine enorm
> wichtige Frage bei der Auswahl der Hardware.

Unsinn ist es, den Speicherbedarf anhand eines unbekannten und von den 
Schreibgewohnheiten des Programmierers abhängigen und damit hier im 
Forum unbekannten Skalierungsfaktors aus der Zeilenzahl des Codes 
bestimmen zu wollen. Insbesondere, da wenn weder Programmiersprache noch 
Optimierbarkeit des Codes bekannt sind, sieht es ganz finster mit der 
Prognose aus.

von Heinz L. (ducttape)


Lesenswert?

Hoffen wir mal, dass Ihr Bernd noch nicht ganz vergrault habt...

Die Frage wieviel Code in XX Kilobyte Speicher paßt ist schwer zu 
beantworten, wenn Du in C oder einer anderen Hochsprach entwickelst. In 
Assembler ist es halbwegs einzuschätzen, weil Du ja sogar GANZ genau 
weißt, wieviel Platz jede einzelne Codezeile belegt (was jetzt 
allerdings nicht heißt, dass Du vor Beginn des Projekts wirklich wissen 
kannst, wieviel Du wirklich brauchen wirst).

In C kannst Du relativ viel Logik in relativ wenig Text packen, da ist 
es schwer bis unmöglich, Dir da jetzt eine sinnvolle Antwort zu geben. 
Mit der Zeit kriegt der Entwickler halbwegs 'n Gefühl dafür, was er für 
'n Prozessor braucht um seinen Code unterzubringen, nur hat das halt 
mehr mit Erfahrung als mit fixen Werten zu tun.

Und selbst da greifst oft genug daneben weil sich da teilweise 
Überraschungen ergeben.

Ich möchte es so ausdrücken: Anfangsprojekte, die die 64k Code sprengen 
sind sogar in C (und mit dem saumäßig optimierenden AVR Studio) schwer 
zu erstellen, wenn man nicht irgendwelche Wahnsinnsbibliotheken 
verwenden will/muss. In ASM sind 64k geradezu unheimlich viel. Man 
bedenke, dass der C64 grad mal so viel Platz für Programm, Code und 
Grafik insgesamt hatte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.