Forum: Mikrocontroller und Digitale Elektronik Ich suche einen "etwas anderen" C-Compiler


von Peter Hofbauer (Gast)


Lesenswert?

Ich suche einen "etwas anderen" C-Compiler

Meine Controller programmiere ich seit einigen Jahrzehnten nur in Asm. 
Ich hatte mehrmals meine Programmierung mit C angefangen, aber aus 
diversen Gründen wieder verworfen.
Meine Anwendungen sind oft zeitkritisch, ich ersetze Hardware gerne 
durch Software wann immer das geht.
Jetzt suche ich einen C-Compiler, der etwas anders arbeitet als zB 
AVR-GCC. Normale C-Compiler behandeln -logisch- vozugsweise die Sprache 
C und nur als ungeliebten Zusatz Asm.
Ich hätte das aber gern umgekehrt.
Ideal wäre eine Software mit 2-Fenster-Technik, links C und rechts Asm. 
Als Ergebnis ein Asm-Code, den ich dann mit dem Assembler endgültig 
übersetze. So eins habe ich schon mal kurz getestet, für den 8051, ich 
weiß aber nicht mehr was das war. Ist schon etwa 30 Jahre her und 
vermutlich untergegangen.
Inzwischen arbeite ich vorzugsweise mit ATMEGAs.

Gibt es so ein Compiler?

Vielen Dank im Voraus.
Gruß Peter

: Gesperrt durch Moderator
von Peter II (Gast)


Lesenswert?

Peter Hofbauer schrieb:
> Gibt es so ein Compiler?

nein, denke ich nicht. Macht auch überhaupt keinen Sinn.

Schreib das Programm einfach ein C und die paar stellen wo du wirklich 
mit der Geschwindigkeit von C Probleme bekommt (was seeehr selten sein 
sollte) schreibst du einfach ein ASM.

von innerand i. (innerand)


Lesenswert?

Man kann GCC grundsätzlich Assembler ausspucken lassen. Aber (afaik) 
halt auch immer nur beim Bauen.

von Amateur (Gast)


Lesenswert?

Wenn Du es chronisch Eilig hast: Warum nicht Assembler und C mischen.

Der GNU-Compiler hat damit keine Probleme.

Auf diese Weise kannst Du die Funktionalität von C mit ein paar Quickes 
aus der Assemblerkiste mischen. Ist vor allem sinnvoll, wenn Du der 
Fließkommaarithmetik nicht aus dem Wege gehen kannst.

von c-hater (Gast)


Lesenswert?

Peter II schrieb:

> Macht auch überhaupt keinen Sinn.

Doch, macht es. Viele mögliche Asm-Optimierungen kollidieren mit den 
Anforderungen der normalen C-Laufzeitumgebung.

Ich ahne, was dem TO vorschwebt: die Möglichkeit, zumindest einige 
Register (ggf. soviel wie irgend möglich) dem Zugriff des C-Compilers 
komplett zu entziehen. Darauf wird's wohl im Wesentlichen hinauslaufen.

Ganz klar: der C-Code würde umso ineffizienter, je weniger Register er 
benutzen kann. Das stört aber niemanden, weil man C ja sowieso nur für 
den unwichtigen Kram einsetzt, bei dem Geschwindigkeit keine oder nur 
eine untergeordnete Rolle spielt.

von kopfkratzer (Gast)


Lesenswert?

kopfkratz
Also suchst Du eine IDE die Deinen C-Code zeitgleich in ASM umsetzt und 
anzeigt ?
Ließe sich mit GCC realisieren wenn es NICHT in Echtzeit passieren soll.
Gut könnte man auch dauernd laufen lassen macht aber wenig Sinn.
Die eigentliche Frage ist was willst Du erreichen ?
Das Du siehst wie der C Compiler die Anweisungen in ASM umsetzt und den 
dann ggf. optimieren ?
Inline ASM geht auch sehr gut wie schon erwähnt.
Oder Du bleibst halt bei reinem Assembler ;-)

von BastiDerBastler (Gast)


Lesenswert?

Außerdem ist es ja auch so, dass der Compiler viele Optimierungen noch 
gar nicht einsetzen kann, bevor er nicht den größeren Kontext 
analsysieren kann. Daher würdest Du riesige ASM-Sprünge sehen, weil Du 
hier und dort nur eine Zeile änderst und er auf die Idee kommt, dass er 
jetzt hier inlinen kann, dort irgendwas lustiges mit Zeiger-Aliasen 
machen kann, hier eine Schleife unfolden sollte etc...
Ansonsten können die gängigen IDEs aber veränderte Dateien automatisch 
neu laden... wenn Du also beim Bauen Asm ausgeben lässt, und die 
entsprechene Assembly-Datei im Splitscreen offen ist, wird er sie wohl 
updaten... Ist das nicht nah dran? :)

von Reinhard Kern (Gast)


Lesenswert?

Peter Hofbauer schrieb:
> Ideal wäre eine Software mit 2-Fenster-Technik, links C und rechts Asm.

Wieso das denn, ich habe IDEs, da sind im linken Fenster die Source 
Files (Module) aufgeführt (.c, .h, .asm usw.) und rechts wird editiert - 
sowohl C als auch Assembler, das ist doch alles gleichberechtigt. Der 
Editor weiss natürlich was C und was ASM ist und färbt das alles schon 
entsprechend ein. Ich denke, das ist auch der normale Weg. Auch 
Resourcenfiles und ähnliches wird da mitverwaltet.

Wenn man das nötige KnowHow hat, kann man nicht nur Assembler-Funktionen 
von C aus aufrufen oder ISRs in Assembler schreiben, sondern ebenso 
C-Funktionen aus einem Assembler-Programm aufrufen, z.B. um eine 
Fliesskommaberechnung durchzuführen. Für Profis ist eigentlich eine 
mehrsprachige Entwicklung eine bare Selbstverständlichkeit, ich finde 
daher die Diskussion C oder ASM geradezu albern und nur was für geistig 
beschränkte. Für mich lautet die Antwort auf die Frage C oder ASM 
schlicht Ja. Manchmal auch noch Pascal dazu.

Gruss Reinhard

von Peter Hofbauer (Gast)


Lesenswert?

Danke für die schnellen Antworten!

Leider existiert so ein Compiler wohl nicht, schade!
Ich wollte mir nur Schreibarbeit sparen und im logischen Ablauf einen 
übersichtligeren Kode haben.
Bei meinen Anwendungen sind übrigens keineswegs zeitkritische 
Programmteile "seeehr selten", sondern leider die Regel.
Die parallele Programmierung mit C und Asm in 2 Fenstern meines Editors 
habe ich versuchsweise mal getestet. Der von GCC erzeugte Asm-Code ist 
dazu ungeeignet. Besser gesagt eine Katastrophe! Das scheint am Versuch 
des Compilers zu liegen, den Code zu optimieren. Und dann den Asm-Teil 
selber verbessern? Das könnte in die Hose gehen.
Ich hatte mir von einem "Asm-orientierten" C-Compiler einen besseren 
Asm-Code versprochen. Für den 8051 hatte ich so einen mal Testweise. 
Dessen Asm-Code war brauchbar.
Übrigens benötige ich die Lib von C nicht. Ich habe alles was ich 
benötige in Asm, auch Fließkommaarithmetik. Stammt noch aus meiner 
8051-Zeit. Das war nicht so kompliziert wie es scheint. Man muß es nur 
machen, soviel Fleiß muß sein!
Werde mich jetzt doch mal mit "nur C" beschäftigen.

Gruß Peter

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Peter Hofbauer schrieb:
> Bei meinen Anwendungen sind übrigens keineswegs zeitkritische
> Programmteile "seeehr selten", sondern leider die Regel.

Wieso dann nicht einen µC nehmen, der gleich mehr unter der Haube hat?
Heutzutage gibt es viele Hersteller mit Cortex-Mx Kern, bis zu 180MHz.
Außerdem kann der C-Compiler einen viel effizienteren Code erzeugen, da 
der µC bereits mit 32 Bit rechnet.
Somit sind Programmteile in Assembler eher die Ausnahme und man hat 
genügend Reserve für Erweiterungen.
Die Bekanntesten können hier nachgelesen werden:
- STM32
- LPC1xxx
- ARM

: Bearbeitet durch User
von markusDerBastler (Gast)


Lesenswert?

Markus Müller schrieb:
> Wieso dann nicht einen µC nehmen, der gleich mehr unter der Haube hat?

War ja klar dass du wieder hier auftauchst..

Antwort: Weil er mit ATmega programmiert.
Und weil der ATmega sauschnell ist.
Und wenn mir die Programmiersprache die Performance verhunzt, ändere ich 
nicht den Prozessor sondern die Sprache.
Und weil  zwischen STM und AVR ein himmelweiter Unterschied ist.
Und weil für Hobbybastler der STM monatelange Einarbeitung erfordert.
Und weil der 100mal komplizierter ist.
Und wer hier was gegenteiliges behauptet, der lügt!

So!

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Peter Hofbauer schrieb:
> Meine Anwendungen sind oft zeitkritisch,

hast du mal ein Beispiel "aus der Praxis" ?

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

markusDerBastler schrieb:
> Und wenn mir die Programmiersprache die Performance verhunzt, ändere ich
> nicht den Prozessor sondern die Sprache.

Na dann viel Spass - als ob C so schlecht wäre und es so viele besser 
gibt.

> Und weil  zwischen STM und AVR ein himmelweiter Unterschied ist.
> Und weil der 100mal komplizierter ist.

Ja genau, die Peripherie in einem LPC1xxx und STM32 ist viel moderner 
mit der sich dank DMA und viel mehr eigener Intelligenz ein noch 
effizienteren Code erzeugen lässt. Damit werden zeitkritische 
Anwendungen viel leichter umgesetzt - und man spart sogar Zeit, die man 
bei einem AVR hinein stecken muss um zusätzlich was in Assembler 
zusammen zu basteln.

Außerdem war meine Frage an Peter Hofbauer gerichtet.

: Bearbeitet durch User
von Michael L. (michaelx)


Lesenswert?

Peter Hofbauer schrieb:
> Leider existiert so ein Compiler wohl nicht, schade!

Hast du mal überlegt, wie das gehen soll? Ein bissel C-Code hinwerfen, 
dann im entstandenen ASM-Code rumhacken. Anschließend wieder im C-Code 
ändern, wobei der Compiler natürlich "wissen" soll, was du dir bei 
deinen Änderungen im ASM-Code "gedacht" hast, dies "intelligent 
einflechten", und womöglich am Ende gar "selbst lernend" deine 
"ASM-Code-Verbesserungen" in künftigen Programmen berücksichtigen. - 
Klar wär das toll.

Aber mal realistisch betrachtet würde das allenfalls ohne "intelligent 
einflechten" und "selbst lernend" einigermaßen funktionieren, und nur 
mit einem C-Compiler ohne die geringste Optimierung. Dein ASM-Code würde 
durch C-Code-Änderungen wohl trotz dem immer wieder ungewollt Schaden 
nehmen. Mag sein, dass es so etwas mit den genannten Beschränkungen vor 
30 Jahren mal gegeben hat.

> Ich wollte mir nur Schreibarbeit sparen und im logischen Ablauf einen
> übersichtligeren Kode haben.

Klar, wollen kann man vieles. Aber du wirst wohl keine IDE finden, die 
deinen ASM-Code "versteht", und als logischen Ablauf in C-Code umsetzt.

Du kannst aber in ASM modular programmieren, Macros verwenden und 
wiederverwendbaren ASM-Code erstellen. Das spart auch Schreibarbeit. 
Bibliotheken sind ebenso mit ASM möglich, genau so gemischt-sprachige 
Programmierung, wie schon beschrieben.

;-)

Edit: Tippfehler

: Bearbeitet durch User
von Achim_42 (Gast)


Lesenswert?

Peter Hofbauer schrieb:
> Meine Anwendungen sind oft zeitkritisch,

hast du mal ein Beispiel "aus der Praxis" ?

von Kein Name (Gast)


Lesenswert?

>Dessen Asm-Code war brauchbar.

Augenblick mal - der Compiler machte aus optimierten C-Code lesbaren 
ASM-Code.

Heutzutage wollen die meisten Programmierer einen Compiler, der aus 
Quick&Dirty C-Code trotzdem schnellen und kleinen ASM-Code erzeugt.

Für dich und Steve Wozniak mag das ein Nachteil sein. Für die große 
Masse, die überhaupt nicht weiß, wie man Programmcode optimiert, ist es 
eher ein Vorteil.

von Wilhelm F. (Gast)


Lesenswert?

Peter Hofbauer schrieb:

> Ich hatte mir von einem "Asm-orientierten" C-Compiler einen besseren
> Asm-Code versprochen. Für den 8051 hatte ich so einen mal Testweise.
> Dessen Asm-Code war brauchbar.

Also mit dem Freeware SDCC für 8051 komme ich inzwischen gut klar, 
sowohl mit Inlining als auch mit externen separaten reinen 
Assemblerfiles, die aus C gerufen werden.

Der 8051 braucht hin und wieder einen Assemblerfetzen, z.B. wenn man den 
Timer 0, der im 16-bit-Mode kein Autoreload hat, manuell nach laden muß, 
und dafür Takte zählen muß. Die beiden Bytes werden ja nacheinander 
wieder in den Timer geschrieben, und da darf kein Übertrag genau an 
dieser Stelle statt finden. Wenn man das richtig macht und auch kann, 
ist das aber gar kein Thema.

Ich war aber auch schon genötigt, eine größere zeitkritische Funktion in 
Assembler zu schreiben und zu optimieren, weil C das absolut nicht 
packte. Z.B. mal FIFOs für den UART. In ASM bekam ich die Baudrate auf 
115.200, bei C noch nicht mal auf die Hälfte.

Meine Priorität im Hobby liegt ja darin, das zu optimieren, was ich 
besitze, und nicht ständig neu kaufen, doppelt so groß und doppelt so 
schnell. Als Profi in der industriellen Entwicklung kann man das gerne 
machen.

Als Oberfläche und Editor verwende ich Geany, da hat man aber auch alle 
Fenster von Dateien offen, die man möchte. Ich schmökere ja auch mal 
gerne im ASM-Code herum, den der C-Compiler macht. Ein Fenster läßt sich 
auch noch teilen, aber nee, das geht meiner Meinung nach zur 
vernünftigen Ansicht nicht. Vielleicht mit größerem Monitor oder zwei 
Monitoren.

von Brüder Grimm (Gast)


Lesenswert?

Glaubt ihr immer noch an das Märchen, daß ihr mit Assembler schnelleren 
Code zusammengefriemelt bekommt, als ein C-Compiler?

Träumt weiter.

von Peter II (Gast)


Lesenswert?

Wilhelm F. schrieb:
> Ich war aber auch schon genötigt, eine größere zeitkritische Funktion in
> Assembler zu schreiben und zu optimieren, weil C das absolut nicht
> packte. Z.B. mal FIFOs für den UART. In ASM bekam ich die Baudrate auf
> 115.200, bei C noch nicht mal auf die Hälfte.

eventuell kannst du aber C nicht so gut wie ASM. Man kann C auch so 
schreiben das der Optimierer es einfach hat. Und mit dem ASM wissen 
welches du hast sollte man eigentlich sehr guten C-Code schreiben 
können.

Mir würde auch ein Beispiel interessieren.

von Wilhelm F. (Gast)


Lesenswert?

Peter II schrieb:

> Mir würde auch ein Beispiel interessieren.

Eines nannte ich schon, wofür man ASM braucht: Die Nachladung von Timer 
0 im Timer-Interrupt selbst.

von Peter II (Gast)


Lesenswert?

Wilhelm F. schrieb:
> Eines nannte ich schon, wofür man ASM braucht: Die Nachladung von Timer
> 0 im Timer-Interrupt selbst.

warum sollte das in C nicht genauso gehen? Es wird zwar standardmäßig 
SREG auf dem Stack gesichert aber das kann bei bedarf abschalten. Und 
die Zuweisung geht auch in C.

von Dr. Sommer (Gast)


Lesenswert?

Der GCC hat eine recht komplexe Syntax um inline-ASM mit C zu verbinden, 
d.h. Variableninhalte auszutauschen etc. Wie gut das bei AVR 
funktioniert weiß ich nicht; bei ARM und x86 funktioniert es.

Aber das braucht man natürlich nur wenn man etwas in C oder C++ gar 
nicht abbilden kann; in 99.9% der Fälle muss man es nur richtig 
schreiben...

von Wilhelm F. (Gast)


Lesenswert?

Peter II schrieb:

> warum sollte das in C nicht genauso gehen?

Weil C nicht korrekt auf den Taktzyklus genau eine 16-bit-Konstante auf 
den aktuellen unbekannten Timerwert aufaddieren kann, ohne daß es zu 
Fehlern kommt.

von Kein Name (Gast)


Lesenswert?

Eine kurze Zwischenfrage. Hat einer aus der ARM Fraktion mal 
nachgeschaut, ob bei der "Standard Peripheral Library" solche Sachen in 
Assembler codiert werden?

von Jojo S. (Gast)


Lesenswert?

Wilhelm F. schrieb:
>> Mir würde auch ein Beispiel interessieren.
>
> Eines nannte ich schon, wofür man ASM braucht: Die Nachladung von Timer
> 0 im Timer-Interrupt selbst.

und dafür soll ein Hersteller den Aufwand treiben eine neue, komplexe 
IDE zu entwickeln? Vielleicht könnte man ein Eclipse Plug-In bauen das 
den kompilierten C-Code einfacher in Projekte einbaut, aber für ein paar 
Zeilen Inline Asm lohnt sich auch das nicht.
Ansonsten finde die Vorstellung gruselig so einen Misch-Masch zu warten. 
Packe das mal nach ein paar Jahren wieder an und versuche den bis in die 
Haarspitzen optimierten Maschinencode noch zu verstehen.

von Dr. Sommer (Gast)


Lesenswert?

Kein Name schrieb:
> Hat einer aus der ARM Fraktion mal
> nachgeschaut, ob bei der "Standard Peripheral Library" solche Sachen in
> Assembler codiert werden?
Die Standard Peripheral Library gehört speziell zu ST, nicht allgemein 
zu ARM. Und da ARM 32bit ist, sind solche Frickeleien für bis zu 
32bit-Counter natürlich unnötig. Und falls man 64bit Counter hat (hätte) 
wüsste ich nicht wieso man Assembler benötigen würde; höchstens müsste 
man außendrum Interrupts abschalten. Aber allein mit 32bit-Countern kann 
man ja schon bis zum St. Nimmerleins Tag zählen...

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Die CMSIS macht Spezial ASM Befehle einfach in C nutzbar. Wie z.B. 
Shiften, oder Byte/Word Swap. Dafür gibt es extra ASM Befehle, der 
jedoch in der Standard C Definition so nicht enthalten ist.

Ansonsten ist die LIB ASM Frei.

von Kein Name (Gast)


Lesenswert?

Hay Jojo, mag ja sein, dass Peter so etwas auch in Jahrzenten noch 
versteht. Der springende Punkt: für die paar Programmier, die so etwas 
noch können, entwickelt kein BWLer eine passende IDE.

von Wilhelm F. (Gast)


Lesenswert?

Jojo S. schrieb:

> Wilhelm F. schrieb:
>>> Mir würde auch ein Beispiel interessieren.
>>
>> Eines nannte ich schon, wofür man ASM braucht: Die Nachladung von Timer
>> 0 im Timer-Interrupt selbst.
>
> und dafür soll ein Hersteller den Aufwand treiben eine neue, komplexe
> IDE zu entwickeln?

Das war doch jetzt gar nicht die Frage.

> Ansonsten finde die Vorstellung gruselig so einen Misch-Masch zu warten.
> Packe das mal nach ein paar Jahren wieder an und versuche den bis in die
> Haarspitzen optimierten Maschinencode noch zu verstehen.

Kein Problem, da ich den Code immer sehr ausführlich direkt am Ort 
dokumentiere. Ob man sich jetzt für jede Funktion ein separates ASM-File 
macht, oder alles in ein ASM-File knallt, ist auch jedem selbst 
überlassen.

Jedenfalls komme ich sehr gut zurecht.

von Dr. Sommer (Gast)


Lesenswert?

Markus Müller schrieb:
> Wie z.B.
> Shiften, oder Byte/Word Swap. Dafür gibt es extra ASM Befehle, der
> jedoch in der Standard C Definition so nicht enthalten ist.
Braucht man aber natürlich nicht, denn optimierende Compiler wie GCC 
generieren die entsprechenden Befehle automatisch...

von Tim  . (cpldcpu)


Lesenswert?

Dr. Sommer schrieb:
> Markus Müller schrieb:
>> Wie z.B.
>> Shiften, oder Byte/Word Swap. Dafür gibt es extra ASM Befehle, der
>> jedoch in der Standard C Definition so nicht enthalten ist.
> Braucht man aber natürlich nicht, denn optimierende Compiler wie GCC
> generieren die entsprechenden Befehle automatisch...

Mit SWAP und ROL tun sich die meisten Compiler schwer, da sich diese 
Operationen in C nur sehr mühselig beschreiben lassen. Das ist aber 
selten ein Problem.

von Dr. Sommer (Gast)


Lesenswert?

Tim    schrieb:
> Mit SWAP und ROL tun sich die meisten Compiler schwer, da sich diese
> Operationen in C nur sehr mühselig beschreiben lassen.
Ja in C siehts etwas hässlich aus. Aber ich meine mich daran zu erinnern 
dass der GCC das hinbekommt.

von Wilhelm F. (Gast)


Lesenswert?

Dr. Sommer schrieb:

> Tim    schrieb:
>> Mit SWAP und ROL tun sich die meisten Compiler schwer, da sich diese
>> Operationen in C nur sehr mühselig beschreiben lassen.
> Ja in C siehts etwas hässlich aus. Aber ich meine mich daran zu erinnern
> dass der GCC das hinbekommt.

Noch nicht mal Assemblerprogrammierer bekommen es immer richtig hin, 
vielleicht ist der Kopf noch bei der letzten Party am Wochenende.

In einem Code für den 8051 fand ich da schon mal vier mal ein Byte mit 
RL A links rotiert, anstatt ein mal ANL A, #0F0h und danach SWAP A. Oder 
XRL A, #0FFh, anstatt CPL A. Beides waren bei mir mal Knackpunkte in 
einer Speed-Optimierung. Den Assembler sollte man schon gut können, wenn 
man darin auch optimiert.

von Tim  . (cpldcpu)


Lesenswert?

Wilhelm F. schrieb:
> In einem Code für den 8051 fand ich da schon mal vier mal ein Byte mit
> RL A links rotiert, anstatt ein mal ANL A, #0F0h und danach SWAP A. Oder
> XRL A, #0FFh, anstatt CPL A. Beides waren bei mir mal Knackpunkte in
> einer Speed-Optimierung. Den Assembler sollte man schon gut können, wenn
> man darin auch optimiert.

So etwas bekommt ein guter C-Compiler aber dafür hin.

von Jojo S. (Gast)


Lesenswert?

Wilhelm F. schrieb:
>> und dafür soll ein Hersteller den Aufwand treiben eine neue, komplexe
>> IDE zu entwickeln?
>
> Das war doch jetzt gar nicht die Frage.

Doch, der TO sucht so etwas wenn ich das richtig verstanden habe. Dein 
Beispiel zeigt das man auch Asm in einer C Umgebung brauchen kann, aber 
so ein paar Zeilen lassen sich besser mit Inline abfrühstücken.
Was wäre jetzt ein Bespiel für eine aufwändigere Funktion die man lieber 
in Asm bauen wollte? Ich wüsste ad hoc keines, die C Compiler sind doch 
mittlerweile so gut das man sich Mühe geben muss ineffizienten 
Maschinencode zu produzieren.
Vielleicht kann man etwas optimieren wenn man spezielle Befehle einsetzt 
die der Compiler nicht mag, soetwas wie SIMD vielleicht. Aber die hat 
der alte ATMega ja nicht, also noch ein K.O. für so eine Anwendung.
Auch wenn man sich so eine wilde Mathe Lib wie die DSP Lib für die 
Cortexe ansieht findet man nur C + Inline Macros für die speziellen 
Befehle. Bevor ich da Stunden an Arbeit dem Performancegott opfere würde 
ich auch eher über den Tellerrand gucken und die passende Hardware 
suchen. Eine schnelle FFT z.B. kriegt man auf einem ATMega hin, aber 
dann fehlt dem der Speicher und beim Cortex z.B. habe ich auch gleich 
DMA für den AD-Wandler.

von heinz (Gast)


Lesenswert?

>Glaubt ihr immer noch an das Märchen, daß ihr mit Assembler schnelleren
>Code zusammengefriemelt bekommt, als ein C-Compiler?

    88a8:  e3510000   cmp  r1, #0
    88ac:  13a01000   movne  r1, #0
    88b0:  03a01001   moveq  r1, #1
    88b4:  15821000   strne  r1, [r2]
    88b8:  05821000   streq  r1, [r2]
    88bc:  159f203c   ldrne  r2, [pc, #60]
    88c0:  059f203c   ldreq  r2, [pc, #60]
    88c4:  13a01801   movne  r1, #65536  ; 0x10000
    88c8:  03a01801   moveq  r1, #65536  ; 0x10000

Wenn ich seh was gcc (-O2) so macht - ist die Antwort Ja

Inline Assembler ist schlecht, weil der Compiler Probleme mit der 
Optimierung bekommt.

von Peter II (Gast)


Lesenswert?

heinz schrieb:
> Wenn ich seh was gcc (-O2) so macht - ist die Antwort Ja

und wie sieht der C code dafür aus?

von Dr. Sommer (Gast)


Lesenswert?

heinz schrieb:
> Wenn ich seh was gcc (-O2) so macht - ist die Antwort Ja
Welche Version?
> Inline Assembler ist schlecht, weil der Compiler Probleme mit der
> Optimierung bekommt.
Dafür gibt es die entsprechenden Constraints, geht, ist aber etwas 
fummelig

von heinz (Gast)


Lesenswert?

4.7.4

  if (t){
    t=0;
    GPSET0 = 1<<16;
  }
  else{
    t=1;
    GPCLR0 = 1<<16;
  }

Ist nur ein Ausschnitt. Sorry nicht  -O2 sondern -O3

von Tim  . (cpldcpu)


Lesenswert?

Und die Variablendefinitionen? Alles volatil?

von A. B. (funky)


Lesenswert?

Peter Hofbauer schrieb:
> Ich wollte mir nur Schreibarbeit sparen und im logischen Ablauf einen
> übersichtligeren Kode haben.

ähh...warum benutzt du dann ASM? ;-)

von Wilhelm F. (Gast)


Lesenswert?

Also hier mal die Timernachladung 16 bit im Timerinterrupt des 8051:
1
_t0_reload::
2
  mov     r0, dpl                   ; Variable 1
3
  mov     dptr, #_t0_reload_PARM_2  ; Adresse Variable 2
4
  movx    a, @dptr
5
  mov     r1, a                     ; Variable 2
6
7
; Das war die Parameterübergabe des Compilers, die ich hier
8
; in die Register R0 und R1 verfrachtete.
9
10
  clr     EAL
11
  clr     TR0
12
  mov     a, r0
13
  add     a, TL0
14
  mov     TL0, a
15
  mov     a, r1
16
  addc    a, TH0
17
  mov     TH0, a
18
  setb    TR0
19
  setb    EAL
20
  ret

Was will ein C-Compiler denn hier optimieren können? Und vor allem: 
Bekommt der das genau exakt so hin?

Der Timer wird hier für die Nachladung exakt genau 7 Maschinenzyklen 
lang gestoppt, die exakte Berechnung durch geführt, mit den sieben 
stehen gebliebenen Zyklen wieder aufaddiert, (ist in einer 
Konstantendefinition in Main.h) und dann wieder gestartet.

von heinz (Gast)


Lesenswert?

Ja -alles volatile. Wobei das t eigentlich nur static sein müsste.

Habe ich gleich ausprobiert und ändert nix

von petar (Gast)


Lesenswert?

Peter Hofbauer schrieb:
> Meine Anwendungen sind oft zeitkritisch, ich ersetze Hardware gerne
> durch Software wann immer das geht.
Widerspricht sich das nicht? Hardware ist fast immer schneller als 
Software.

Peter Hofbauer schrieb:
> Ideal wäre eine Software mit 2-Fenster-Technik, links C und rechts Asm.
Mmhh, kann das nicht die TI Entwicklungsumgebung (Code Composer) für 
ihre DSP-Familie? Wobei der imho nur den Assembler anzeigt und man den 
nur über den C-Code beeinflussen kann.
Das es so etwas für AVR gibt wäre mir neu... und was generisches wirst 
du kaum finden.

von Tim  . (cpldcpu)


Lesenswert?

Wilhelm F. schrieb:
> Was will ein C-Compiler denn hier optimieren können? Und vor allem:
> Bekommt der das genau exakt so hin?

Die Frage ist eher:

- Wie groß ist der Anteil des kritischen Codes an Deinem Projekt?
- Reicht es nicht, eine Funktion als Assemblersource in das Projekt 
einzubunden?

Bloß weil der C-Compiler in 3% des Codes nicht das macht, was man will, 
heisst es nicht dass man für die übrigen 97% etwas anderes braucht.

: Bearbeitet durch User
von Wilhelm F. (Gast)


Lesenswert?

Tim    schrieb:

> - Wie groß ist der Anteil des kritischen Codes an Deinem Projekt?
> - Reicht es nicht, eine Funktion als Assemblersource in das Projekt
> einzubunden?

1 Prozent des gesamten Codes. Und das stört nun wirklich gar nicht 
weiter.

Meine Frage, wie man das hier

Beitrag "Re: Ich suche einen "etwas anderen" C-Compiler"

in C macht, ist noch nicht beantwortet.

von Tim  . (cpldcpu)


Lesenswert?

Wilhelm F. schrieb:
> Meine Frage, wie man das hier
>
> Beitrag "Re: Ich suche einen "etwas anderen" C-Compiler"
>
> in C macht, ist noch nicht beantwortet.

Vielleicht geht es, vielleicht auch nicht. C hat überhaupt nicht den 
Anspruch, 100% deterministischen Zugriff auf das "Bare Metal" zu 
ermöglichen. Dazu kommt noch, dass der 8051 uralt ist und nicht auf 
Hochsprachen optimiert wurde. Auf dem 6502 fällt es noch viel leichter, 
eine vermeintliche Untauglichkeit von C nachzuweisen.

: Bearbeitet durch User
von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

garnicht..entweder machst du markierst du einen c-funktion als naked und 
schreibst dort inline-asm oder du schiebst die Funktion in eine 
.S-file...

übrigends, auf halbwegs neuen architekturen mit pipeline kannst du sowas 
wie instruktionen/takte zählen vergessen...je nachdem was da im 
hintergrund abgeht, wird die code-exekution verzögert... ähnliches kann 
dir bei DMA übertragungen im hintergrund passieren...

compiler sind heutzutage 1. schlau und 2. ziemlich flexibel... die 
übersetzung von funktionen und variablen können mit diversen flags 
manipuliert werden...

ich habe vor kurzem einen taskswitcher komplett in c++ geschrieben... 
bis auf ein paar intrinsics die man eben bei der architektur braucht 
gibts auch keinen asm-code...
bevor der stack usw steht muss man halt variablen als register 
definieren.. geht super und man kann mit einer gewöhnlichen for-schleife 
den sram initialisieren... also auch das startup-file ist c++... lang 
lebe die const static member-function ;)


73

von Peter Hofbauer (Gast)


Lesenswert?

Danke für die rege Beteiligung!

Einige wollten mal ein Beispiel über zeitkritische Anwendungen.
Ok, jetzt mal ein paar Beispiele aus meiner Praxis. Ich fange mal mit 
den ersten Versuch eines Umstiegs auf C an. Kleinste Deatils verschweige 
ich hier mal, das wird sonst zu lang.

1. Fall
Die Anforderung (eine Maschine mit Meßeinrichtungen): permanete 
Berechnungen während ein Motor davonrast. Um mir die Arbeit zu 
erleichtern hatte ich mir einen C-Compiler gekauft. Übrigens für über 
2000DM. Dann habe ich an einen Testaufbau die Zeiten mit den Skop 
gemessen. Das war es dann. Den Compiler habe ich nie wieder verwendet. 
Die Zeiten der Rechenroutinen waren alle viel zu lang. Dann habe ich 
einen Satz Rechenroutinen in Asm entwickelt. Auch Fließkommaarithmetik. 
Damit gings.
2. Fall
Für die Entwicklung von Steuerungen für umfangreiche Maschinen habe ich 
für den 8051 so etwas ähnliches wie eine Programmiersprache entwickelt. 
Alle (!) Abläufe wurden in Tabellen eingetragen. Mehrere gleichzeitige 
Abläufe bekamen eine eigene Tabelle. Darüber trohnte eine Mastertabelle, 
in der standen alle beteiligten Tabellen. Der Controller mußte alle 
Tabellen fortlaufend abarbeiten. Das war selbst in Asm grenzwertig was 
die Durchlaufzeit angeht. In C wäre das -zumindest für einen 8051- kaum 
möglich.
3.Fall
Ein etwas neuerer Fall: ein Farb-LCD-Modul mit ATMEGA128 wurde mit 
fertigen C-Programmstücken gliefert. Darum habe ich das ganze mit GCC 
angefangen. Es zeigte sich eine verzögerte Reaktion auf Tastendrücke 
weil das Programm zu lange in der C-Routine fürs LCD drin bleibt. Darauf 
habe ich alles in Asm umgeschrieben. Allerdings lag das auch an der 
ungünstigen Konstruktion des mitgelieferten Kodes. Inzwischen habe ich 
mal die Codelänge des heute fertigen Projektes mit den C-Teil 
verglichen. Der C-Teil ist 50 (in Worten: fünzig) mal so lang.
4.Fall
Eine Messplatine sollte 8 (!) verschieden serielle Schnittstellen mit 
zum Teil irren Baudraten bekommen. Der Prozessor (ein 8051-Ableger von 
Philips, Typ habe ich vergessen) hatte aber nur 2 integriert. Das geht 
nur zu Fuß in Asm.
5.Fall
Ein Controller (ATMEGA2561) für einen HF-Spektrunanalyzer. Die 
Darstellung muste auf einer Oszi-Bildröhre erfolgen. Deren Ablenkung muß 
halt Zeitlinear erfolgen sonst wird das sichtbar. Außerdem mußten die 
Messungen in exakt zeitlichen Abläufen erfolgen.
6.Fall
Eine Meßplatine mit USB. Für den Controller (CY7C...) hatte ich einen 
C-Compiler, der mir eigentlich gut gefallen hatte. Trotzdem habe ich 
alles, auch wegen der USB-Schei*e, vorsichtshalber in Asm geschrieben. 
Das hat sich später ausgezahlt. Die Entwicklung erfolgte noch mit Win2k. 
Unter XP war noch alles OK. Dann kam Win7. Die Programme auf dem PC 
stiegen nach unterschiedlichen Zeiten manchmal -nicht immer- aus. Diese 
PC-Programme wurden übrigens in Indien geschrieben. Dann schafften es 
die Soft-Ings in Indien und etwa 3 Ings in D auch nach 2 Jahren nicht, 
den Fehler zu finden. Das habe ich in einer Woche erledigt. Weil alles 
in Asm war. Das ist noch ein wichtger Punkt: die Fehlersuche.

Ich hätte noch mehr, aber es wird langweilig.

Ich habe absolut nichts gegen C! Deshalb suche ich ja nach einen für 
mich richtigen Weg.
Natürlich kann man auch in C schnelle Programme schreiben. Es ist aber 
schwer möglich, die Zeiten in einer C-Routine zu berechnen. Geht nur mit 
messen.

Was mich wundert: die C-Schreiber hier im Forum reagieren auf Asm 
irgentwie wütend. Worum?

Ich werde mich jetzt mal überwinden und mir GCC reinziehen, allen 
Abneigungen zum Trotz. Beim folgenden Projekt, eine Steuerung für eine 
Senk-Erodiermaschine.

Gruß Peter

von Dr. Sommer (Gast)


Lesenswert?

heinz schrieb:
> 4.7.4
>
>   if (t){
>     t=0;
>     GPSET0 = 1<<16;
>   }
>   else{
>     t=1;
>     GPCLR0 = 1<<16;
>   }
>
> Ist nur ein Ausschnitt. Sorry nicht  -O2 sondern -O3
Da fehlen aber noch 2 "str" im ASM-Code. Der generierte Code müsste 
maximal Zeit-Effizient sein, eventuell nicht maximal Platz-Effizient. 
Die Frage ist aber, geht es in ASM überhaupt kompakter? Da bin ich mir 
grad nicht so sicher!

PS: Es gibt schon GCC Version 4.8.2 ...

von Tim  . (cpldcpu)


Lesenswert?

Peter Hofbauer schrieb:

So etwas nennt man im Englischen "anecdotal evidence".

Deine Beispiele haben gemeinsam:
- Keine konkreten Fakten. Woran hat es gehakt? War es nur eine 
Kleinigkeit im kritischen Pfad, oder lag es wirklich an der gesamten 
Softwarearchitektur?
- Sie setzen alle auf 8051 und AVR, für C nur bedingt geeignete 
Architekturen.
- Du erwähnst häufig, dass Du auch Algorithmen verändert hast. Einen 
Unterschied in der Ausführungszeit um einen Faktor 50 lässt sich anders 
auch nicht erklären.

Verstehe ich Beispiel 6 richtig: Du hast etwas in Assembler geschrieben 
und andere haben anschließend einen Fehler nicht finden können, bis Du 
den Assemblercode selbst korrigiert hast?

von Bla (Gast)


Lesenswert?

>   if (t){
>     t=0;
>     GPSET0 = 1<<16;
>   }
>   else{
>     t=1;
>     GPCLR0 = 1<<16;
>   }

Versuche mal (sofern deine Programmlogik mit den Nebenwirkungen leben 
kann; "uint8_t" natürlich anpassen):
1
uint8_t tt = t;
2
if (tt){
3
  tt=0;
4
  GPSET0 = 1<<16;
5
}
6
else {
7
  tt=1;
8
  GPCLR0 = 1<<16;
9
}
10
t = tt;

von Wilhelm F. (Gast)


Lesenswert?

Tim    schrieb:

> Dazu kommt noch, dass der 8051 uralt ist und nicht auf
> Hochsprachen optimiert wurde. Auf dem 6502 fällt es noch viel leichter,
> eine vermeintliche Untauglichkeit von C nachzuweisen.

Ja das ist völlig klar. Der 8051 entstand noch lange vor C. Der 
Vorgänger 8048 lebte in Assembler, ich glaube da gibt es bis heute 
keinen C-Compiler für.

von Tim  . (cpldcpu)


Lesenswert?

Peter Hofbauer schrieb:

> Natürlich kann man auch in C schnelle Programme schreiben. Es ist aber
> schwer möglich, die Zeiten in einer C-Routine zu berechnen. Geht nur mit
> messen.

Das geht auf den neuen Microcontroller auch mit Assembler nicht mehr:
-Flash Waitstates
-DMA
-Instruction cache (z.B. im STM32F4)

von Arc N. (arc)


Lesenswert?

Wilhelm F. schrieb:
> Tim    schrieb:
>
>> Dazu kommt noch, dass der 8051 uralt ist und nicht auf
>> Hochsprachen optimiert wurde. Auf dem 6502 fällt es noch viel leichter,
>> eine vermeintliche Untauglichkeit von C nachzuweisen.
>
> Ja das ist völlig klar. Der 8051 entstand noch lange vor C.

C kam 1972 raus... C++ 1983.
Die 8051er 1980, selbst der 8048 kam erst nach C auf den Markt.

von Peter II (Gast)


Lesenswert?

Peter Hofbauer schrieb:
> Ein etwas neuerer Fall: ein Farb-LCD-Modul mit ATMEGA128 wurde mit
> fertigen C-Programmstücken gliefert. Darum habe ich das ganze mit GCC
> angefangen. Es zeigte sich eine verzögerte Reaktion auf Tastendrücke
> weil das Programm zu lange in der C-Routine fürs LCD drin bleibt. Darauf
> habe ich alles in Asm umgeschrieben. Allerdings lag das auch an der
> ungünstigen Konstruktion des mitgelieferten Kodes. Inzwischen habe ich
> mal die Codelänge des heute fertigen Projektes mit den C-Teil
> verglichen. Der C-Teil ist 50 (in Worten: fünzig) mal so lang.

sorry das glaub dir niemand. Bei den meisten Display Ansteuerungen sind 
sogar Wartezeiten im code damit das Display hinterher kommt.

Auch willst du behaupten das die Zeilenanzahl von C 50mal so groß ist 
wie der ASM code? Und das bestimmt bei gleicher Funktionalität.

Das ist auch schwer zu glauben.

von Tim  . (cpldcpu)


Lesenswert?

Arc Net schrieb:
> Wilhelm F. schrieb:
>> Tim    schrieb:
>>
>>> Dazu kommt noch, dass der 8051 uralt ist und nicht auf
>>> Hochsprachen optimiert wurde. Auf dem 6502 fällt es noch viel leichter,
>>> eine vermeintliche Untauglichkeit von C nachzuweisen.
>>
>> Ja das ist völlig klar. Der 8051 entstand noch lange vor C.
>
> C kam 1972 raus... C++ 1983.
> Die 8051er 1980, selbst der 8048 kam erst nach C auf den Markt.

Das Argument zieht nicht. Damals war man froh, dass man überhaupt einen 
Microprozessor auf einem Chip hinbekam. An Hochsprachen war dabei nicht 
zu denken.

Anders beim 68000 und x86.

von Wilhelm F. (Gast)


Lesenswert?

Arc Net schrieb:

> C kam 1972 raus... C++ 1983.
> Die 8051er 1980, selbst der 8048 kam erst nach C auf den Markt.

Sorry, aber ein Unternehmen konnte ja einen C-Compiler für 3000 DM 
kaufen, nicht ein Hobbybastler.

von Tim  . (cpldcpu)


Lesenswert?

Wilhelm F. schrieb:
>> C kam 1972 raus... C++ 1983.
>> Die 8051er 1980, selbst der 8048 kam erst nach C auf den Markt.
>
> Sorry, aber ein Unternehmen konnte ja einen C-Compiler für 3000 DM
> kaufen, nicht ein Hobbybastler.

?? 1982 konnte man für 3000 DM noch nicht einmal einen Computer kaufen, 
der einen C-Compiler ausführen konnte.

von Peter Hofbauer (Gast)


Lesenswert?

Hallo Tim,

wie ich erwähnt habe, sind Details weggelassen. Das wird zu lang. 
Vielleicht ist auch einiges nicht genau geschrieben worden.
Mit 50 mal ist die Codelänge (der Hex-Code) gemeint, nicht die 
Geschwindigkeit.
Ich habe die Algorithmen nicht verändert, meinst Du damit die 
Rechenroutinen? Die habe ich komplett in Asm geschrieben und nicht aus 
den C-Übersetzung generiert. Da würde ich auch nicht durchfinden.
Beispiel 6:
Das war ein Beispiel für die Vorteile von Asm bei einer tiefgehenden 
Fehlersuche. Die erwähnten Kollegen hatten den Soucecode meiner Firmware 
und alle Infos. Ich war zu dem Zeitpunkt nicht mehr in der Firma. Die 
haben mich privat kontaktiert. Der Assemblercode hatte keinen Fehler, 
ich mußte den Prozessor in die USB-Sache reingehen und austricksen. Das 
geht nur in Asm! Die Ursache lag übrigens bei Microsoft, die hatten ohne 
Grund und ohne Infos den Ablauf an jenen Stellen geändert, der nicht im 
USB-Protokoll zwingend definiert ist.

Natürlich kann man fast alle Aufgaben auch in C ausführen. Dazu muß man 
aber trotzdem Asm können. Mit C programmieren indem man den Compiler in 
Richtung "schneller" steuert und dabei Asm im Kopf?
Und ein Wechsel auf einen anderen Prozessor kommt wegen der 
erforderlichen Anschaffungen (Emulator) nicht in Frage.

Gruß Peter

von Esteem (Gast)


Lesenswert?

Peter Hofbauer schrieb:

> Und ein Wechsel auf einen anderen Prozessor kommt wegen der
> erforderlichen Anschaffungen (Emulator) nicht in Frage.

Das sehe ich auch so. Bei einem Wechsel auf ein anderes System (STM32), 
hat allein der Emulator 20 Euro gekostet.

von Peter Hofbauer (Gast)


Lesenswert?

Hallo,
also eine richtigen(!) Emulator bekommt man nicht für 20 Euro. Wenn ja, 
habe ich Interesse. Mein Emu für den ATMEGA hat über 300 Euro gekostet.
Gruß Peter

von Peter II (Gast)


Lesenswert?

Peter Hofbauer schrieb:
> Hallo,
> also eine richtigen(!) Emulator bekommt man nicht für 20 Euro. Wenn ja,
> habe ich Interesse. Mein Emu für den ATMEGA hat über 300 Euro gekostet.
> Gruß Peter

was ist ein richtiger Emulator? Was ist falsch an dem von Atmel oder dem 
AVRemu?

von Wilhelm F. (Gast)


Lesenswert?

Tim    schrieb:

> ?? 1982 konnte man für 3000 DM noch nicht einmal einen Computer kaufen,
> der einen C-Compiler ausführen konnte.

Na siehste. Soviel zu unseren Alleswissern hier.

von USB (Gast)


Lesenswert?

Peter Hofbauer schrieb:
> Die Ursache lag übrigens bei Microsoft, die hatten ohne
> Grund und ohne Infos den Ablauf an jenen Stellen geändert, der nicht im
> USB-Protokoll zwingend definiert ist.

Das heißt, die URSACHE lag in deiner Firmware, die falsche Annahmen über 
den USB-Standard machte und nur zufällig auf der MS-Implementation 
funktionierte.

von Peter Hofbauer (Gast)


Lesenswert?

Hallo PeterII
welche Emus genau meinst Du? Meiner (für >300) ist von ATMEL.
Gruß Peter

von Tim  . (cpldcpu)


Lesenswert?

Peter Hofbauer schrieb:
> Hallo PeterII
> welche Emus genau meinst Du? Meiner (für >300) ist von ATMEL.
> Gruß Peter

Für moderne MCUs nutzt man keinen Emulator mehr. Die haben alle 
Debugfunktionen eingebaut (z.B. SWD für ARM). Die dafür notwendig 
Hostadapter gibt es ab 20 EUR nachgeworfen.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Bei den Cortex-Mx ist das mit auf dem Chip drauf.

Dazu gibt es den ST-Link mit dem kann man mit 2 Pins den STM32 laden und 
debuggen.

Wenn man es professioneller haben will, dann kauft man sich einen 
J-LINK. Der ist schneller. Als Firma kostet der incl. Trace Feature 
schon etwas mehr - braucht nur so gut wie niemand.

Für den "Hausgebrauch" reichen somit 20 EUR - so viel kostet das 
STM32F4DISCOVERY Borad, bei dem ein ST-LINK schon gleich mit drauf ist.

ATMEGA ist schon ziemlich alt und heute gibt es viel moderneres,
z.B. PIC18, PIC24, PIC32, STM32, LPC1xxx, MSP430 - alles moderne Chips.

Und wenn man einen STM32 einfach nur bespielen will, so stöpselt man den 
per USB an den PC und mittels internem Bootloader kann der bespielt 
werden - kostet nix.

Hier ein Artikel zum lesen:
STM32 für Einsteiger
LPC1xxx für Umsteiger

Hier ein Beispiel für eine kostenlose IDE:
STM32 CooCox Installation

: Bearbeitet durch User
von Peter Hofbauer (Gast)


Lesenswert?

Hallo USB

USB schrieb:

> Peter Hofbauer schrieb:
>> Die Ursache lag übrigens bei Microsoft, die hatten ohne
>> Grund und ohne Infos den Ablauf an jenen Stellen geändert, der nicht im
>> USB-Protokoll zwingend definiert ist.
>
> Das heißt, die URSACHE lag in deiner Firmware, die falsche Annahmen über
> den USB-Standard machte und nur zufällig auf der MS-Implementation
> funktionierte.

Eben nicht, im USB-Standard sind freiheiten, z.B. nur die Bandbreite ist 
einzuhalten. Die "falschen Annahmen" hatte der Controller-Hesteller 
(Cypress). Der Controller benötigte intern im USB-Teil zwischen 2 
Control-Transfers etwas mehr Zeit. Microsoft hatte diese Zeit um 92% 
verkürzt. Das konnte ich austricksen weil der Controller den normalen 
Arbeitsspeicher auch intern verwendet.
Ich hoffe diesen Vorgang geklärt zu haben. Es ist nicht OK, meine 
Angaben ohne Wissen zu bezweifeln.

Gruß Peter

von heinz (Gast)


Lesenswert?

>Der generierte Code müsste maximal Zeit-Effizient sein,
    88b4:  15821000   strne  r1, [r2]
    88b8:  05821000   streq  r1, [r2]
.
.
    88c4:  13a01801   movne  r1, #65536  ; 0x10000
    88c8:  03a01801   moveq  r1, #65536  ; 0x10000

str  r1, [r2]
mov  r1, #65536

2 Takte weniger und kleiner ;)

von Peter Hofbauer (Gast)


Lesenswert?

Tim    schrieb:

> Peter Hofbauer schrieb:
>> Hallo PeterII
>> welche Emus genau meinst Du? Meiner (für >300) ist von ATMEL.
>> Gruß Peter
>
> Für moderne MCUs nutzt man keinen Emulator mehr. Die haben alle
> Debugfunktionen eingebaut (z.B. SWD für ARM). Die dafür notwendig
> Hostadapter gibt es ab 20 EUR nachgeworfen.

OK, das ist jetzt geklärt.
Ich werde aber trotzdem nicht wechseln, später vieleicht.

Gruß Peter

von USB (Gast)


Lesenswert?

Peter Hofbauer schrieb:
> Es ist nicht OK, meine Angaben ohne Wissen zu bezweifeln.

Ähm bitte was?

von Tim  . (cpldcpu)


Lesenswert?

Peter Hofbauer schrieb:
> Ideal wäre eine Software mit 2-Fenster-Technik, links C und rechts Asm.
> Als Ergebnis ein Asm-Code, den ich dann mit dem Assembler endgültig
> übersetze. So eins habe ich schon mal kurz getestet, für den 8051, ich
> weiß aber nicht mehr was das war. Ist schon etwa 30 Jahre her und
> vermutlich untergegangen.

Eigentlich ist das doch nichts anderes als ein moderner debugger?

http://www.coocox.org/images/CoDebugger_screen_shot19.gif

von Dr. Sommer (Gast)


Lesenswert?

heinz schrieb:
> 2 Takte weniger und kleiner ;)
Und wo lädst du die Adresse von GPSET0 bzw. GPCLR0? r2 enthält ja hier 
noch die von "t"... Aber vermutlich könnte man es tatsächlich so machen:
1
    88a8:  e3510000   cmp  r1, #0
2
    88ac:  13a01000   movne  r1, #0
3
    88b0:  03a01001   moveq  r1, #1
4
    88b4:  15821000   strne  r1, [r2]
5
    88b8:  05821000   streq  r1, [r2]
6
    88bc:  159f203c   ldrne  r2, [pc, #60]
7
    88c0:  059f203c   ldreq  r2, [pc, #60]
8
    88c4:  13a01801   mov  r1, #65536  ; 0x10000
9
    str r1, [r2]
Das würde 2 Instruktionen, aber keinen Takt sparen... Der Compiler mag 
vermutlich nicht die eigentliche store-Instruktion verschieben weil 
volatile.

von Helmut L. (helmi1)


Lesenswert?

Peter Hofbauer schrieb:
> Der Controller benötigte intern im USB-Teil zwischen 2
> Control-Transfers etwas mehr Zeit. Microsoft hatte diese Zeit um 92%
> verkürzt. Das konnte ich austricksen weil der Controller den normalen
> Arbeitsspeicher auch intern verwendet.

Und was hat das jetzt mit der Verwendung von C oder ASM zu tun? 
Nichts,reine Timingfrage der Hardware.

von Peter Hofbauer (Gast)


Lesenswert?

Helmut Lenzen schrieb:
> Peter Hofbauer schrieb:
>> Der Controller benötigte intern im USB-Teil zwischen 2
>> Control-Transfers etwas mehr Zeit. Microsoft hatte diese Zeit um 92%
>> verkürzt. Das konnte ich austricksen weil der Controller den normalen
>> Arbeitsspeicher auch intern verwendet.
>
> Und was hat das jetzt mit der Verwendung von C oder ASM zu tun?
> Nichts,reine Timingfrage der Hardware.

Stimmt, aber bei der Fehlersuche war Asm von Nutzen. Wenn das Programm 
in C geschrieben wäre, hätte ich wohl meine Probleme bei der Fehlersuche 
gehabt. Nur darauf wollte ich hinaus.

Halt, da fällt mir noch was ein. Wegen USB durfte ich keinen Timer-Int 
verwenden. Auch wenn in der Interruptroutine kein einziger Befehl (außer 
reti) steht, tritt der USB-Fehler wieder auf. Aber ein Timer war 
unbedingt nötig weil in der Meßkarte Zeiten im 1ms-Raster nötig war. Das 
habe ich ohne Interrupt lösen müssen. Indem alle Routinen in der 
Hauptschleife in genauen Zeiten fertig werden müssen. So etwas geht in C 
überhaupt nicht! Eine andere Hardware war nicht möglich, auch keine 
Änderung, die Karten waren schon einige Zeit in Gebrauch ohne Probleme 
unter XP.

Aber nochmals: ich habe nichts gegen C, ich zweifle nicht an den 
Aussagen der C-Schreiber hier. Meine Anwendungen sind halt sehr 
HW-orientiert.

Gruß Peter

von Holm T. (Gast)


Lesenswert?

@Peter:
Dein Problem ist IMHO , das Du "gewöhnt" bist, aus einer Hardware X das 
maximal mögliche heraus zu kitzeln und dabei zwangsläufig über Fälle 
stolperst, die nur mit Assembler lösbar sind. Da Du ungefähr weisst, was 
Du in Assembler mit einem z.B. 8051 hin bekommst, gehst Du Projekte 
damit an und stellst die auch fertig, so weit so gut.

C soll Assembler nicht ersetzen, sondern soll das programmieren 
komfortabler gestalten (wie jede andere Programmiersprache auch). Obwohl 
die Compiler heute recht gut sind, kostet das zwangsläufig Performance, 
da die Optimizer nun nicht wirklich jeden Fall berücksichtigen können.
Ergo: Du kaufst immer eigentlich zu kleine Schuhe weil Du einen großen 
Schuhanzieher hast.

C ist eine Systemprogrammiersprache für Unix und hatte schon immer die 
Möglichkeit für zeitkritische Sachen Assembler einzubinden. Auch das 
Setup der Maschine an und für sich (crt0.s, crtend.s) gehört zu den 
Fällen, an denen standardmäßig Assemblerprogramme eingesetzt werden. 
Allerdings bestand das Ziel darin, auch mittels Hacks (nicht passende 
Variablenbreiten etc) direkt auf der Hardware herumzumuddeln, der 
Programmierer wird sich dabei schon was gedacht haben. (das ist die 
Stelle auf die die Pascalfreaks immer anspringen, keine Typprüfung, na 
sowas aber auch..)

Am wohlsten fühlen sich C-Compiler auf Maschinen mit Registerfiles und 
vielen möglichen Zeigerregistern. Auf solchen Maschinen ist C auch 
entwickelt worden (PDPs von DEC). Auch wenn diese Maschinen aus heutiger 
Sicht keine Wurschtpelle mehr vom Teller ziehen sind sie doch deutlich 
komfortabler auch in Assembler zu programmieren als ein 8 Bit 
Mikroprozessor wie der AVR. Von Gurkendesigns wie dem 8048 oder 8051 
oder eigentlich allen Intel Prozessoren möchte ich da gar nicht reden 
(ok, ich kenne I860, 960 usw. nicht).

--

Du schreibst Du brauchst die ganzen Bibliotheken nicht...falsch.

Eine Bibliothek ist eine Sammlung von Objektfiles. Was da drin ist, 
entscheidet der, der diese Bibliotheken gebaut hat.
Was zum Teufel hindert Dich daran, Dir selbst passende Bibliotheken für 
die von Dir benötigten Funktionen zusammenzustellen, deren Quelle von 
Dir geschriebene Assemblerfiles sind? Diese Bilbiotheken werden vom 
Compiler an und für sich nicht mehr angefaßt, nur der Lader bindet als 
letztes Deine Dateien an das C-Programm. Das scheint mir hier der Punkt 
zu sein, den Du nicht verstanden hast.

Niemand wird Dich vor den Kopf stoßen, wenn Du z.B. aktiv an der 
Weiterentwicklung des Codegenerators von AVR-GCC mitarbeiten willst,
Fachleute sind da händeringend  gesucht.

Ich habe auch mit Software zu tun die andere Leute geschrieben haben. Da 
war auch so Einer dabei, der keine Standardbibliotheken brauchte. Das 
Ergebnis dessen ist eine Art Pfennigfuchser-Stringverarbeitung die sich 
über mehr als hundert Programmzeilen zieht um eine formatierte Ausgabe 
von Zahlen über eine serielle Schnittstelle zu verwirklichen. Ok, der 
Typ hat sicher Rechenzeit und jede Menge Platz gespart, nur ist der 
Flash des Atmega16 knappe 20% voll und die mit 16Mhz getaktete CPU 
verbringt mehr als 99% ihrer Zeit damit auf einen Tastendruck eines 
Bedieners zu warten um dann eine einzelne Zeile mit 9600 Baud 
auszugeben.
Ob er wohl Geld von Atmel für die Nichtverwendung des ROMs und 
Maschinenzyklen zurück bekommen hat? Ich denke nicht...dafür ist der 
Code aber echt beschissen zu warten..
Ich würde auf den Trichter nicht kommen und lieber das (große) printf 
aus der Standardbibliothek verwenden, weißt Du auch warum? Ich kriege 
meine vertane Lebenszeit nicht zurück.

Gruß,

Holm

von Peter Hofbauer (Gast)


Lesenswert?

Hallo Holm,
im Prinzip gebe ich Dir Recht! Ich wollte nicht auf Libs verzichten, 
sondern zusätzlich meine Eigenen verwenden, was ja unter C geht. Meine 
eignen Rechenroutinen sind etwas gestutzt und deutlich schneller.

Mir fehlt nur ein C-Compiler für den ATMEGA, der "Asm-Orientiert" 
arbeitet.

Ich habe verstanden, das es so einen nicht gibt. Meine Frage ist also 
beantwortet.

Allen Beteiligten meinen herzlichen Dank!

Gruß Peter

von Dr. M. (Gast)


Lesenswert?

markusDerBastler schrieb:
> Markus Müller schrieb:
>> Wieso dann nicht einen µC nehmen, der gleich mehr unter der Haube hat?
>
> War ja klar dass du wieder hier auftauchst..
>
> Antwort: Weil er mit ATmega programmiert.
> Und weil der ATmega sauschnell ist.
> Und wenn mir die Programmiersprache die Performance verhunzt, ändere ich
> nicht den Prozessor sondern die Sprache.
> Und weil  zwischen STM und AVR ein himmelweiter Unterschied ist.
> Und weil für Hobbybastler der STM monatelange Einarbeitung erfordert.
> Und weil der 100mal komplizierter ist.
> Und wer hier was gegenteiliges behauptet, der lügt!
>
> So!

Bis zum letzten Satz dachte ich du meinst das ernst :)
So, Spass beiseite: C-Compiler sind heute mächtige Werkzeuge. Allerdings 
sind sie das nur wenn man ihnen nicht in die Suppe spuckt.
Assembler mag in absoluten Randbedingungen und je nach Fähigkeit des 
Compilers Sonderoptimierungen erlauben die sinnvoll sind. Im Grossen und 
Ganzen wäre eine ständiges Eingreifen in das generierte Assembly aber 
Gift.
Gerade beim 8051 wundert mich das, weil Compiler mangels Stack die 
automatischen Variablen mit Call-Tree-Analyse zusammenfasst und Register 
bzw Datennutzung global optimiert. Das ist ein wenig wie wenn man bei 
der Bohrmaschine mitkurbeln will.

von Dr. M. (Gast)


Lesenswert?

Nachtrag: Wenn es um eine optimierte CRT geht, was ich beim GCC 
verstehen kann, macht es mehr Sinn sich hier eine eigene Version zu 
erstellen. Den meisten Linkern ist es egal woher sie die Implementierung 
einer Funktion einbinden.

von Arc N. (arc)


Lesenswert?

Wilhelm F. schrieb:
> Tim    schrieb:
>
>> ?? 1982 konnte man für 3000 DM noch nicht einmal einen Computer kaufen,
>> der einen C-Compiler ausführen konnte.
>
> Na siehste. Soviel zu unseren Alleswissern hier.

Mittlerweile etwas OT, aber so viel Geschichte muss sein...
Micral N ab Januar 1973 für damals umgerechnet 1300 USD
In der ersten c't wurde ein PL/S-Compiler für 8080 und CP/M für 820 DM 
angeboten...
Motorola hat damals (Oktober 1983) einen 68000-basierten 
Einplatinenrechner für 495 USD verkauft
http://www.classiccmp.org/cini/pdf/Motorola/mecb.pdf

C-Compiler für CP/M-80 gab's ab $49.95 (basierend auf dem 
Small-C-Compiler von 1980, Mindestanforderungen: 8080er, 48 kiB RAM und 
Floppy, einen Cobol-Compiler gab's im Sonderangebot für $29.95...)
https://archive.org/stream/byte-magazine-1983-08/1983_08_BYTE_08-08_The_C_Language#page/n127/mode/2up

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Peter Hofbauer schrieb:
> Ich werde mich jetzt mal überwinden und mir GCC reinziehen, allen
> Abneigungen zum Trotz.

Das solltest Du tun.
Dann wirst Du schnell merken, daß man Assembler wirklich kaum noch 
braucht.

Ich habe diverse Steuerungen in C mit 8051 oder AVR programmiert, aber 
die CPU-Geschwindigkeit war nie ein Problem.
Oftmals laufen die AVRs mit der Werkseinstellung 8MHz / 8 = 1MHz.

Mein I2C-Sniffer schafft nur 230400 Baud bei 14.7456MHz Takt. Liegt aber 
daran, daß der ATtiny85 keine HW-UART hat, ich muß also zu Fuß die Bits 
basteln.

Aber mit HW-UART nichtmal 115200Baud zu schaffen, das glaub ich Dir 
einfach nicht.
Das sind elendig lange 160 Zyklen je Byte, läßt Du den C-Compiler im 
UART-Interrupt etwa noch Schach spielen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Arc Net schrieb:
> Micral N ab Januar 1973 für damals umgerechnet 1300 USD

Und auf dem Ding soll ein C-Compiler ausführbar gewesen sein?

von Jochen Tesch (Gast)


Lesenswert?

Brüder Grimm schrieb:
> Glaubt ihr immer noch an das Märchen, daß ihr mit Assembler schnelleren
> Code zusammengefriemelt bekommt, als ein C-Compiler?
>
> Träumt weiter.

Jaaaaa!!!

Wenn ich in Assembler einen Code schreibe, in dem es keinen 
überflüssigen Befehl gibt, dann kann es C natürlich auch nicht besser. 
Gelegentlich habe ich den von C generierten Code mit Assembler-Code 
verglichen. In den meisten Fällen war der aus C erzeugte Code nicht 
gleichlang, sondern länger.

Bei meiner letzten absolut zeitkritischen Anwendung habe ich mehrere 
Schnittstellen (2 x SSI-Slave, 2 x UART mit hoher Datenrate und eine 
selbst definierte synchrone serielle Schnittstelle) von einem 8-Bit-µC 
mittels priorisiertem Interrupt gleichzeitig bedient. Ich glaube nicht, 
dass ich es auch in C hinbekommen hätte.

von Cyblord -. (cyblord)


Lesenswert?

Jochen Tesch schrieb:
> Gelegentlich habe ich den von C generierten Code mit Assembler-Code
> verglichen. In den meisten Fällen war der aus C erzeugte Code nicht
> gleichlang, sondern länger.

Bisher war es IMMER so: Jemand kommt voller Empörung an und zeigt seinen 
C-Code und den dazugehörigen ASM-Code (vom GCC erzeugt). Dabei 
präsentiert er einen kürzeren ASM Code und moniert, der Compiler wäre ja 
blöd. Nach kurzer Analyse stellt er dann fest, oh, sein ASM Code hat 
diverse Randbedingungen nicht erfasst. Egal, umschreiben, nochmal 
meckern. Gleiches Spiel, geht nicht in 100% aller Fälle. Das Ende vom 
Lied: Der GCC hat wohl doch den optimalen ASM Code erzeugt. UND hätte 
ers selber in ASM gemacht, hätte er sich noch den Code verbuggt und das 
wahrscheinlich lange ohne es zu merken.

Bring doch auch mal ein Beispiel wo der GCC angeblich so schlecht 
arbeitet und DU besser bist.

gruß cyblord

von Jochen Tesch (Gast)


Lesenswert?

cyblord ---- schrieb:
> Bring doch auch mal ein Beispiel wo der GCC angeblich so schlecht
> arbeitet und DU besser bist.

Die Applikation dazu habe ich genannt.

von Cyblord -. (cyblord)


Lesenswert?

Das hier?

> Bei meiner letzten absolut zeitkritischen Anwendung habe ich mehrere
> Schnittstellen (2 x SSI-Slave, 2 x UART mit hoher Datenrate und eine
> selbst definierte synchrone serielle Schnittstelle) von einem 8-Bit-µC
> mittels priorisiertem Interrupt gleichzeitig bedient.
Warum sollte das in C nicht gehen, bzw. schlechter sein als dein ASM? 
Begründung?

> Ich glaube nicht,
> dass ich es auch in C hinbekommen hätte.
Hört sich weniger nach Unzulänglichkeiten beim Compiler an.

Außerdem, selbst WENN es kurze Passage gäbe, wo man ASM unbedingt 
braucht, spricht trotzdem nichts dagegen, den Rest in C zu machen. ASM 
wo unbedingt nötig schreibt jeder C-Programmierer ebenfalls gerne.

Aber ich sehe nur Geschichten und Vermutungen.

code or it didn't happen

: Bearbeitet durch User
von Jochen Tesch (Gast)


Lesenswert?

cyblord ---- schrieb:
> Warum sollte das in C nicht gehen, bzw. schlechter sein als dein ASM?

Die Antwort hast Du Dir doch selbst gegeben. Ein C-Compiler fragt viele 
Randbedingungen ab, auch die, die nie relevant werden können.
Bei einer Applikation, wo es wirklich auf jede (!) Bit-Zeit ankommt, 
sollten natürlich nur die wirklich relevanten Randbedingungen 
berücksichtigt werden. Mittels Assembler kann ich das selbst entscheiden 
und so einen schnelleren Code erzeugen.

von Arc N. (arc)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Arc Net schrieb:
>> Micral N ab Januar 1973 für damals umgerechnet 1300 USD
>
> Und auf dem Ding soll ein C-Compiler ausführbar gewesen sein?

Da ging's mir eher um die bezahlbaren Computer...
Aber gut. Auf dem wahrscheinlich nicht, aber auf dessen Nachfolger aus 
dem Jahr 1975 mit 8080 sollte das möglich gewesen sein
Laut http://www.retrotechnology.com/dri/isis.txt soll es in dem 
Zeitrahmen einen PL/M-Compiler (CP/M 80) gegeben haben, der auf 8080ern 
lief.

Einen C-Compiler der mit 32 kiB RAM auskam, gab's ab 1979 für Z80/8080
http://www.bdsoft.com/resources/bdsc.html
ob es noch frühere C-Compiler für diese Systeme gab entzieht sich meiner 
Kenntnis.

von c-hater (Gast)


Lesenswert?

Brüder Grimm schrieb:
> Glaubt ihr immer noch an das Märchen, daß ihr mit Assembler
> schnelleren
> Code zusammengefriemelt bekommt, als ein C-Compiler?
>
> Träumt weiter.

Das ist weder ein Märchen noch ein Traum, sondern gelebte Realität.

Schaust du z.B. einfach mal in die Quelltexte des des AVR-GCC. Da 
findest du sehr viele Beispiele, bei denen schon die von ihrem Produkt 
überzeugten notorischen C-ler keinen anderen Ausweg wußten, als auf Asm 
zurückzufallen, um eine zumindest akzeptable Performance zu erreichen...

Und glaube ja nicht, daß das bei anderen Architekturen besser wäre. 
Abseits vom Mainstream (im Wesentlichen x86 und ARM) sind die Nachteile 
der Compiler noch sehr viel größer, weil sich dort kaum wer die Arbeit 
macht, solche plattformspezifischen Asm-Optimierungen zu schaffen und in 
den Compiler zu integrieren. Da wird immer nur das Allernötigste 
gemacht, damit der Rotz überhaupt an's Laufen kommt und Leute wie du 
ihren unterirdischen Müll überhaupt produzieren können.

Oder du mußt eine Menge Kohle für kommerzielle Compiler bezahlen. Die 
Kohle gibst du da im Wesentlichen für, tätärä, Asm-optimierte Libs aus, 
die die Performance auf dem Zielsystem ganz offensichtlich massiv 
verbessern können...

von Wilhelm F. (Gast)


Lesenswert?

c-hater schrieb:

> Die
> Kohle gibst du da im Wesentlichen für, tätärä, Asm-optimierte Libs aus,
> die die Performance auf dem Zielsystem ganz offensichtlich massiv
> verbessern können...

Genau das ist es bei C. Die guten Libs bekommt man mit einem teueren 
Kauf-Compiler, die Freeware-Dinger wie SDCC haben das nicht drin, muß 
man selber nach arbeiten, wenn man will.

SDCC: Unterstützt z.B. für den 80C517A keine multiple Datapointer, was 
für z.B. memcpy() ausgezeichnet wäre. Auch nicht die MDU, die sogar für 
Floating Point optimiert ist, und bis zum Faktor 100 schneller rechnen 
kann als Standard-8051.

Nur ein teuerer z.B. Keil-Compiler macht das, Ready-to-Use. Und nur in 
der Vollversion, bei denen fehlen glaube ich in der Demoversion die 
Floating-Point-Libs.

von holm (Gast)


Lesenswert?

@c-hater: Dann schreib doch weiter Basic. Mann Du gehst mir mit Deinem 
ständigem wiederkäuenden Gesabbel bei jeder Gelegenheit auf die Eier.

Gruß,

Holm

von Michael L. (michaelx)


Lesenswert?

Interessanterweise sprechen die gegen C vorgebrachten Argumente doch 
zugleich für C.

von Boris O. (bohnsorg) Benutzerseite


Lesenswert?

Mich überzeugt der ASM-Hang keineswegs. Neben der Taktrate von 20MHz hat 
der AVR ja auch einen Taktteiler, den man auf 1 reduzieren könnte. Mit 
Round-Robbin oder preemptiven Strategien (in C) eine große Zahl von 
Schnittstellen abfragen, deren Taktrate ein Bruchteil der Prozessorrate 
ist, halte ich für keine Kunst.

Allerdings bin ich mir darüber im Klaren, wenn man lange genug in die 
ASM-Datei hineinschaut, sie irgendwann auf einen zurückblickt. (Vulgo: 
wenn man nur die eine Lösung anerkennt, findet man gegen jede passende 
Argumente. So gibt es keinen Grund, die eklatanten Fehlentscheidungen 
der existierenden Compiler im Rahmen von quelloffenen Projekten zu 
beheben, d.h. die Zeit nicht mit tippen hier im Forum sondern 
offensichtlichem Bug Fixing in gcc o.ä zu verbringen.)

von Peter D. (peda)


Lesenswert?

Wilhelm F. schrieb:
> SDCC: Unterstützt z.B. für den 80C517A keine multiple Datapointer, was
> für z.B. memcpy() ausgezeichnet wäre.

Hast Du mal nachgerechnet, was das wirklich ausmacht?
Diese Umschalterei kostet nämlich auch Zeit.
Ich hatte früher mal ne Kopierroutine mit 2 Pointern ohne Umschaltung 
benutzt, die ist wirklich schneller. Ein Pointer ist DPTR und der andere 
ist P2,R0.
Außerdem gilt das nur für langsamen XDATA, da kommt es auf einen Zyklus 
mehr oder weniger eh nicht an.

Dieser 80C517 muß früher mal sehr teuer gewesen sein. Ich hab ihn in 
keinem kommerziellen Produkt finden können. Da waren immer nur normale 
80C31 drin bzw. später 89C51.
Daher wundert es mich garnicht, daß die SDCC-Leute seine speziellen 
Bells and Whistles nicht unterstützen.
Der 80C517 war wohl ein reiner Lern-MC und daher nur auf Eval-Boards 
drauf.

von Helmut L. (helmi1)


Lesenswert?

Peter Dannegger schrieb:
> Dieser 80C517 muß früher mal sehr teuer gewesen sein.

War er, in einer alten Elektor von 1993 ist er mit 44.95DM gelistet.
der kleinerer 80c535 mit 29.95DM

80C31 war da schon mit 5.48DM zu haben.

von Antimedial (Gast)


Lesenswert?

markusDerBastler schrieb:
> Antwort: Weil er mit ATmega programmiert.

Ich kann auch mit einem Hammer Schrauben rausdrehen. Das ist aber kein 
Argument.

> Und weil der ATmega sauschnell ist.

Offensichtlich ja nicht.

> Und wenn mir die Programmiersprache die Performance verhunzt, ändere ich
> nicht den Prozessor sondern die Sprache.

Das müsste erst einmal bewiesen werden. Wer sagt, dass er einfach keinen 
effizienten C-Code auf die Reihe kriegt?

> Und weil  zwischen STM und AVR ein himmelweiter Unterschied ist.

Himmelweit wäre übertrieben.

> Und weil für Hobbybastler der STM monatelange Einarbeitung erfordert.

Das kann ich nicht bestätigen. Die Peripheral Library kann schon sehr 
viel und wird in Zukunft noch bedienungsfreundlicher.

> Und weil der 100mal komplizierter ist.

Nicht wirklich.

> Und wer hier was gegenteiliges behauptet, der lügt!

Troll.

Peter Hofbauer schrieb:
> Einige wollten mal ein Beispiel über zeitkritische Anwendungen.
> Ok, jetzt mal ein paar Beispiele aus meiner Praxis. Ich fange mal mit
> den ersten Versuch eines Umstiegs auf C an. Kleinste Deatils verschweige
> ich hier mal, das wird sonst zu lang.

Also entweder sind das alles Legacy-Anwendungen (dann sind solche Tricks 
durchaus nachvollziehbar) oder der Hardwareentwickler hat gepfuscht, 
weil er auf uralten Kram gesetzt hat, der in keinster Weise der 
Anwendung angemessen ist. Die Softwarekomplexität sinkt gewaltig, wenn 
man intelligent die vorhandene Hardware verwendet. 8 serielle 
Schnittstellen kriegt man heutzutage locker in unter 100 Codezeilen 
unter.

Womit wir beim Punkt wären: Für Uralt-Architekturen entwickelt keiner 
mehr etwas, es ist viel, viel einfacher, eine moderne Architektur mit 
bewährten Werkzeugen zu nutzen. Deshalb wird es eine solche 
Entwicklungsumgebung auch sicher nie geben. Es sei denn die vereinte 
8051er-Fangemeinschaft rafft sich zusammen und entwickelt endlich das 
Tool, das sie alle so dringend benötigen.

von Wilhelm F. (Gast)


Lesenswert?

Peter Dannegger schrieb:

> Wilhelm F. schrieb:
>> SDCC: Unterstützt z.B. für den 80C517A keine multiple Datapointer, was
>> für z.B. memcpy() ausgezeichnet wäre.
>
> Hast Du mal nachgerechnet, was das wirklich ausmacht?
> Diese Umschalterei kostet nämlich auch Zeit.
> Ich hatte früher mal ne Kopierroutine mit 2 Pointern ohne Umschaltung
> benutzt, die ist wirklich schneller. Ein Pointer ist DPTR und der andere
> ist P2,R0.
> Außerdem gilt das nur für langsamen XDATA, da kommt es auf einen Zyklus
> mehr oder weniger eh nicht an.

Ich machte da mit den 8 Datapointern mal was direkt in ASM, FIFOs für 
den UART, und das fluppte so richtig.

Ob ich die MDU noch mal in Angriff nehme, und Libraries anpasse, weiß 
ich nicht. Ich könnte es, wenn ich wollte.



Helmut Lenzen schrieb:

> War er, in einer alten Elektor von 1993 ist er mit 44.95DM gelistet.
> der kleinerer 80c535 mit 29.95DM

Der letzte 80C517A kostete mich 1999 bei Segor 47 DM. Die 80C515A bei 
Holz Elektronik 1993 aber auch so viel.

Versender wie Reichelt hatten auch meistens nicht diese A-Typen.

> 80C31 war da schon mit 5.48DM zu haben.

Standard-8031 NMOS beim Schuricht 1992: 5 DM. Das war aber auch OK, weil 
das das Sprungbrett für mich überhaupt zum Einstieg in µC war.

von Thomas (Gast)


Lesenswert?

cyblord schrieb:
>Bisher war es IMMER so: Jemand kommt voller Empörung an und zeigt seinen
>C-Code und den dazugehörigen ASM-Code (vom GCC erzeugt).
>[]
darum geht es überhaupt nicht Assembler ist immer kürzer als C 
allerdings mit 90% Wahrscheinlichkeit eben auch verbugt da hast du 
recht.

Vergleiche mal GCC Code mit dem Code eines komerziellen Compilers dann 
siehst du gewaltige Unterschiede. Ich habe schon Projekte in SDCC und 
mit Keil gemacht (gleicher Code bis auf die Compilerspez. Unterschiede) 
da sind Größendifferenzen von 30% normal.
Die Codeefizienz ist bei kommerziellen Produkten deutlich besser. Muss 
auch so sein sonst würde das ja niemand kaufen.
Übrigens war beim Keil zwischen den Uralt DOS Versionen und den neuen 
µVision Versionen nur marginal was den Code anging.

Peter Dannegger schrieb:
>Der 80C517 war wohl ein reiner Lern-MC und daher nur auf Eval-Boards
>drauf.
och ich kenne einige komerziellen Maschinensteuerungen wo die Teile 
verbaut waren. 100er Preis war Anfang 90 so um die 18DM netto
Problem bei Siemens war eher die nicht zu kalkulierende Lieferzeit 
weshalb die überall rausgeflogen sind und weil Sie bald 15 Jahre der 
Meinung waren dass Flash in MCUs Teufelszeug ist.
Das war meiner Meinung nach auch der Grund warum die C166er nie 
erfolgreich war.

Thomas

von fondue (Gast)


Lesenswert?

> Ich habe schon Projekte in SDCC und
>mit Keil gemacht (gleicher Code bis auf die Compilerspez. Unterschiede)
>da sind Größendifferenzen von 30% normal.

Toller vergleich, ich dachte es geht um GCC?

Auf AVR und ARM ist der Unterschied zwischen Keil und GCC nicht groß, 
wenn er überhaupt da ist.

von Thomas (Gast)


Lesenswert?

>Auf AVR und ARM ist der Unterschied zwischen Keil und GCC nicht groß,
>wenn er überhaupt da ist.
das ist wahr es gibt gar keinen AVR Compiler von Keil
Schon beim ARM sieht es ganz anders aus...
Arm hat keil nicht umsonst gekauft. Die GCC Editionen von Keil wurden 
nicht mehr gepflegt.
Mir ging es generell auch nicht um GCC oder Keil oder andere sondern 
einfach um den Unterschied zwischen komerziellen Compilern und Free 
Compiler.

Thomas

von fondue (Gast)


Lesenswert?

> das ist wahr es gibt gar keinen AVR Compiler von Keil
> Schon beim ARM sieht es ganz anders aus...
> Arm hat keil nicht umsonst gekauft. Die GCC Editionen von Keil wurden
> nicht mehr gepflegt.
> Mir ging es generell auch nicht um GCC oder Keil oder andere sondern
> einfach um den Unterschied zwischen komerziellen Compilern und Free
> Compiler.
>
> Thomas

ja, GCC ist ein wirklich guter Compiler, der auch kommerziell gepflegt 
wird. Und das gilt für AVR, x86 ARM uvm. Die Mär vom kostenlosen 
Billigcompiler ist wirklich Unsinn.

von Svenska (Gast)


Lesenswert?

SDCC ist weder ein besonders gut optimierender C-Compiler, noch sind die 
von ihm unterstützten Architekturen besonders gut für Hochsprachen 
geeignet. Das steht sogar in der Dokumentation von dem drin! SDCC als 
Maßstab für "C ist scheiße" zu benutzen, ist schlicht unfair - 
besonders, da diese Vergleiche dann oft von Leuten kommen, die 
jahrelange Erfahrung mit Assembler auf genau dieser Architektur haben.

Vernünftige Vergleiche bekommt man nur unter vernünftigen Bedingungen. 
Aber die wollen die Assembler-Verfechter ja nicht, es könnte ja das 
falsche Ergebnis rauskommen...

von (prx) A. K. (prx)


Lesenswert?

fondue schrieb:
> ja, GCC ist ein wirklich guter Compiler, der auch kommerziell gepflegt
> wird. Und das gilt für AVR, x86 ARM uvm. Die Mär vom kostenlosen
> Billigcompiler ist wirklich Unsinn.

Der Unterschied zwischen Löhnware und Freeware liegt mehr in den 
Libraries als im Compiler. In einem kleinen Programm bei Freeware für 
ARM hat man schnell mal die halbe Newlib an der Backe und die ist nicht 
wirklich platzsparend konzipiert. Da kommen dann krasse 
Grössenunterschiede im resultierenden Programm zustande.

Nimmt man als Referenz jedoch statt Newlib beispielsweise die ebenfalls 
auf GCC basierende kommerzielle Entwicklungsumgebung Rowley Crossworks, 
dann sieht das schon ziemlich anders aus.

von Fachmann (Gast)


Lesenswert?

Einen neuen Compiler zu schreiben ist nicht so einfach.Das braucht Jahre 
und viele Fachkenntnise.

von fondue (Gast)


Lesenswert?

Fachmann schrieb:
> Einen neuen Compiler zu schreiben ist nicht so einfach.Das braucht Jahre
> und viele Fachkenntnise.

Korrekt. Ein Betriebssystem auch nicht, und trotzdem hat jeder Haushalt 
inzwischen mehr Systeme mit Linux als mit dem kommerziellen Windows. 
Linux wird mit GCC compiliert.

von Fachmann (Gast)


Lesenswert?

Es gibt schon einige nicht kommerzielle Compiler, JAL zum Beispiel.
Aber offensichtlich ist er noch nicht ausgereift obwohl es ihn seit 
Jahren wenn nicht Jahrzehnten gibt. Daran kann man sehen, dass es nicht 
so einfach ist.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.