Forum: Mikrocontroller und Digitale Elektronik AVR braucht 7us-12us bis in Interrupts ausgelöst wird??


von Jonathan K. (burgerohnealles)


Lesenswert?

Hallo,

hab eben mit nem LA nachgeguckt, ob mein ATmega8 auch sofort den 
Interrupt (INT0) auslöst, aber dies geschieht immer erst 7us-12us 
später. Ist das normal und wenn nicht, woran könnte das liegen?

Danke schon mal

: Bearbeitet durch User
von g457 (Gast)


Lesenswert?

> Ist das normal und wenn nicht, woran könnte das liegen?

Für bestimme Rahmenbedinungen sind die gemessen Werte vollkommen in 
Ordnung. Wenn Dir das nicht langt musst Du mir ∗allen∗ relevanten 
Informationen rausrücken.

von neuer PIC Freund (Gast)


Lesenswert?

Push- und Pop-Orgien des gcc bei all den vielen Registern. Schau dir mal 
das disassembly an.

von (prx) A. K. (prx)


Lesenswert?

Schätze mal, dass er mit den jungfräulichen 1MHz taktet und C verwendet 
wird. Dann sind 7-12 Befehlstakte zwischen Interrupt und dem die Messung 
beendenden Befehl nicht weiter bemerkenswert.

: Bearbeitet durch User
von Jonathan K. (burgerohnealles)


Lesenswert?

A. K. schrieb:
> 1MHz taktet und C verwendet

Nein, 16MHz und ja, C.


neuer PIC Freund schrieb im Beitrag #4014497:
> Push- und Pop-Orgien des gcc bei all den vielen Registern. Schau dir mal
> das disassembly an.

Gute Idee!

von (prx) A. K. (prx)


Lesenswert?

Jonathan K. schrieb:
> Nein, 16MHz

Gewusst oder gehofft? 7*16=112 Takte geht nur mit Warteschleife vor der 
entsprechenden Stelle. Die solltest du rausnehmen, denn so viele 
Register hat auch ein AVR nicht.

: Bearbeitet durch User
von Mitleser (Gast)


Lesenswert?

Auszug aus einem mega644P Datenblatt:
--------------------------------------------------------------------
The interrupt execution response for all the enabled AVR interrupts
is five clock cycles minimum. After five clock cycles the program
vector address for the actual interrupt handling routine is
executed. During these five clock cycle period, the Program Counter
is pushed onto the Stack. The vector is normally a jump to the
interrupt routine, and this jump takes three clock cycles.
--------------------------------------------------------------------

Also ist man (wenn ich das richtig interpretiere) bei einem
Interrupt nach 8 Prozessorzyklen in der ISR. Bei einem 20 MHz AVR
wären das 0.4 usec. Bei lahmen Prozessortakt entsprechend länger.
..... als Beispiel für den 644P .....

von Jonathan K. (burgerohnealles)


Lesenswert?

Okey, beim ATmega8 ist sind das 4+3 Zyklen. Am Anfang meiner ISR 
befinden sich 29 push's, 3 in's, 1 clr, 1 sbiw und 2 out's. Wenn ich das 
richtig zusammengezählt habe sind das 66 Zyklen + 7 Zyklen (die 4+3 von 
oben) = 73 Zyklen. Macht bei 16MHz 4.5625us. Das ist irgendwie noch 
lange net 7us-12us.


A. K. schrieb:
> Gewusst oder gehofft?

Wie meinst du das?


A. K. schrieb:
> 7*16=112 Takte geht nur mit Warteschleife vor der
> entsprechenden Stelle

Hab an der Stelle keine Warteschleife. Direkt am Anfang der ISR wird ein 
Ausgang auf HIGH geschaltet.

EDIT: Und warum schwankt die Differenz zwischen dem eingehendem Signal 
und dem Auslösen des Interrupts? Wenn ich sagen könnte, dass es immer 
8us später ist, wäre das ganze nur halb so wild ...

: Bearbeitet durch User
von F. F. (foldi)


Lesenswert?

Mitleser schrieb:
> wenn ich das richtig interpretiere

Nicht interpretieren, lesen ist da besser.
Ein Minimum von fünf Zyklen und innerhalb dieser Zyklen braucht es 
drei Zyklen um in die Routine zu springen.

Woanders habe ich auch mal was von 3-7 Zyklen gelesen. Welcher es nun 
war, weiß ich so aus dem Kopf nicht mehr.

von c-hater (Gast)


Lesenswert?

Jonathan K. schrieb:

> EDIT: Und warum schwankt die Differenz zwischen dem eingehendem Signal
> und dem Auslösen des Interrupts?

Weil es neben der konstanten noch eine variable Interruptlatenz gibt. 
Die setzt sich aus mehreren Komponenten zusammen, die im worst case 
tatsächlich fast alle zusammenkommen können:

1. der Restausführungszeit der unterbrochenen Instruktion
2. der Laufzeit des längsten cli/sei Blocks im Code von main()
3. der Maximallaufzeit der Interrupts geringerer Priorität
4. der Summe der Laufzeiten aller Interrupts höherer Priorität

Dein Glück ist, daß INT0 die höchste Priorität hat, das eleminiert 
Problem 4. Wenn INT0 der einzige verwendete Interrupt ist, entfällt auch 
noch Problem 3. Wenn du in der Hauptschleife keinerlei cli/sei-Blöcke 
verwendest, entfällt auch noch Problem 2.

Problem 1 hast du aber immer.

von Jonathan K. (burgerohnealles)


Lesenswert?

Hmm, das klingt

c-hater schrieb:
> 2. der Laufzeit des längsten cli/sei Blocks im Code von main()

Aha, mal alle Teile mit cli/sei rausgehen und es sind nur noch 5us-8us.


c-hater schrieb:
> 3. der Maximallaufzeit der Interrupts geringerer Priorität

Jetzt noch die zwei Timer deaktiviert und ich habe immer 4.7us-4.75us, 
was immerhin schon fast mit meinen errechneten 4.5625us übereinstimmt. 
Die übrige Zeit wird dann wohl einfach der AVR noch brauchen, bis er 
beim ISR landet.

von (prx) A. K. (prx)


Lesenswert?

Jonathan K. schrieb:
> Am Anfang meiner ISR befinden sich 29 push's

Ziemlich gross, deine ISR, oder? Weil darin der gesamte Registersatz 
versenkt wird. Wenn du wirklich schnelle Interrupts haben willst, dann 
halte sie klein und rufe darin keine Funktionen auf.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jonathan K. schrieb:
> EDIT: Und warum schwankt die Differenz zwischen dem eingehendem Signal
> und dem Auslösen des Interrupts?
Mit welchem Programm? Wieviele andere Interrupts sind da noch aktiv?

von c-hater (Gast)


Lesenswert?

Jonathan K. schrieb:

> Jetzt noch die zwei Timer deaktiviert und ich habe immer 4.7us-4.75us,
> was immerhin schon fast mit meinen errechneten 4.5625us übereinstimmt.
> Die übrige Zeit wird dann wohl einfach der AVR noch brauchen, bis er
> beim ISR landet.

Richtig, was nach Eleminierung (fast) aller Quellen variabler Latenz 
überbleibt, ist natürlich die konstante Latenz. Deswegen heißt die ja 
auch so...

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn du wirklich nur einen Port auf high setzen willst, kannst du gcc 
mal anweisen, eine 'nackte' ISR zu bauen:
1
ISR(TIM0_OVF_vect, ISR_NAKED) {
2
 PORTB |= (1 << PB0);
3
}
Aber Vorsicht - schau im LST nach, ob er die Anweisung wirklich mit 
'sbi' übersetzt. Dann sollte das recht schnell ausführen.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Matthias Sch. schrieb:
> Wenn du wirklich nur einen Port auf high setzen willst, kannst du gcc
> mal anweisen, eine 'nackte' ISR zu bauen:

Bei solch einer ISR werden auch in angezogenem Zustand garantiert keine 
4.5 µs rauskommen. Wenn seine ISR 29 PUSH Befehle enthält, dann steckt 
da das halbe Programm drin.

von Uwe (de0508)


Lesenswert?

Guten Morgen,

ich habe noch eine Frage zu deiner Anmerkung aus:

c-hater schrieb:
> 1. der Restausführungszeit der unterbrochenen Instruktion

Wie ich vorletztes Wochenende gelesen hatte, kann keine Instruktion 
unterbrochen werden, wie wird ausgeführt.
Eine Programmunterbrechung erfolgt immer "zwischen" zwei AVR 
Anweisungen, deshalb gibt es auch verschiedene Latenzen, z.B. bei 
bedingten Sprüngen.

Da ich es gerne genauer wissen möchte, wo kann ich deine Aussage für 
Atmel AVR 8-Bit µC wiederfinden ?

von Axel S. (a-za-z0-9)


Lesenswert?

Jonathan K. schrieb:
> hab eben mit nem LA nachgeguckt, ob mein ATmega8 auch sofort den
> Interrupt (INT0) auslöst, aber dies geschieht immer erst 7us-12us
> später. Ist das normal und wenn nicht, woran könnte das liegen?

Vor allem Dingen ist das was du gesagt hast, falsch. Was du gemessen 
hast, ist nicht die Verzögerung bis der Interrupt ausgelöst hat - die 
kannst du nämlich gar nicht messen. Gemessen hast du die die Zeit bis 
eine nach außen sichtbare Reaktion aufgetreten ist. Himmelweiter 
Unterschied.

Mal zum Vergleich eine Situation der normalen Welt: der Postbote 
klingelt an der Tür. Durch das Schließen des Kontaktes im Klingelknopf 
rast der Strom durch die Leitung zur Klingel, der Klöppel bwegt sich in 
Richtung Glocke und bringt diese zum tönen. Der Schall pflanzt sich 
durch die Luft fort, gelangt an dein Ohr. Der Hörnerv sendet einen 
Impuls an dein Hirn und dort wird der Interrupt ausgelöst. Das alles 
dauert seine Zeit. Keine Ewigkeit. Aber auch nicht Null.

Bevor der Postbote aber eine Reaktion bemerkt (du öffnest die Tür), 
vergeht noch eine Menge mehr Zeit für andere Dinge. Du mußt zur Tür 
laufen. Und du mußt deine aktuelle Tätigkeit unterbrechen. Vielleicht 
gießt du dir gerade eine Tasse Kaffee ein. Oder telefonierst mit deiner 
Mutter. Oder stehst eingeseift unter der Dusche.

Und so ist die Verzögerungszeit, die der Postboten messen kann, nicht 
die Zeit die zum Auslösen des Interrupts benötigt wird. Sondern die Zeit 
bis zur Reaktion.

Zurück zum µC. Auch da wird der Interrupt sehr schnell ausgelöst. Aber 
der µC muß mindestens den aktuell laufenden Maschinenbefehl fertig 
machen, bevor er die ISR ausführen kann. Eventuell ist er aber gerade 
auch in einem Codeblock, der per cli()/sei() ununterbrechbar gemacht 
wurde. Der muß dann erst abgearbeitet sein.

Wenn dann die ISR schließlich ausgeführt wird, passieren auch erst mal 
ein paar Dinge, bevor eine nach außen sichtbare Reaktion erfolgt 
(Stichwort: PUSH-Orgie).

Ob deine 7-12µs normal sind, hängt von der Taktfrequenz ab. Wenn der 
ATmega8 mit der Default-Taktfrequenz von 1MHz läuft, dann wären das 7-12 
Takte. Und damit vollkommen normal.

von Uwe (de0508)


Lesenswert?

Guten Morgen,

bei der Berechnung der benötigten Zeiten in einer ISR, darf man, wenn 
man von PUSH-Orgie spricht nicht das "Gegenteil" die POP-Orgie 
vergessen.
Die benötigt die selbe Zeit.
Das selbe gilt auch für das Sichern des Statusregister SREG mit jeweils 
3 Takten beim betreten und verlassen der ISR.
1
.equ REG = R0 ; als Beispiel
2
3
PUSH REG
4
ldi REG,SREG
5
PUSH REG
6
.
7
.
8
POP REG
9
ldi SREG,REG
10
POP REG

von Mitlesa (Gast)


Lesenswert?

Uwe S. schrieb:
> bei der Berechnung der benötigten Zeiten in einer ISR, darf man, wenn
> man von PUSH-Orgie spricht nicht das "Gegenteil" die POP-Orgie
> vergessen.

Ich habe gelernt dass diese "Orgien" abhängig sind davon wieviel
der AVR GCC optimiert und (wenn er optimiert) wieviele Register
wirklich aktuell gebraucht (gerettet/restauriert) werden (müssen).
Also es kann auch schon mal weniger Orgie sein ....

Jetzt mal unabhängig davon dass das Statusregister wohl immer
betroffen ist.

von Falk B. (falk)


Lesenswert?

Optimierung im Compiler eingeschaltet?
29 push in einer ISR hab ich nocht nie gesehen . . .

von Peter II (Gast)


Lesenswert?

Falk Brunner schrieb:
> Optimierung im Compiler eingeschaltet?
> 29 push in einer ISR hab ich nocht nie gesehen . . .

es braucht doch nur eine Prozedur aufgerufen werden, schon müssen alle 
Register gesichert werden.

von (prx) A. K. (prx)


Lesenswert?

Peter II schrieb:
> es braucht doch nur eine Prozedur aufgerufen werden, schon müssen alle
> Register gesichert werden.

R2–R17,R28,R29 (18 Stück) müssen nur gesichert werden, wenn die ISR sie 
selbst verwendet. Aufgerufene Funktionen sichern diese Register selbst.
https://gcc.gnu.org/wiki/avr-gcc#Register_Layout

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

A. K. schrieb:
> R2–R17,R28,R29 (18 Stück) müssen nur gesichert werden, wenn die ISR sie
> selbst verwendet. Aufgerufene Funktionen sichern diese Register selbst.
> https://gcc.gnu.org/wiki/avr-gcc#Register_Layout

davon weiß der GCC dann scheinbar nicht. Rufe mal eine Funktion auf und 
schon werden viel mehr Register gesichert. (welche es genau sind kann 
ich nicht sagen, aber es sind viel mehr also ohne Funktionsaufruf)

Gilt nur wenn die Funktion nicht geinlined wird.

von c-hater (Gast)


Lesenswert?

Uwe S. schrieb:

> c-hater schrieb:
>> 1. der Restausführungszeit der unterbrochenen Instruktion
>
> Wie ich vorletztes Wochenende gelesen hatte, kann keine Instruktion
> unterbrochen werden, wie wird ausgeführt.

Richtig, genau deswegen gibt es ja eine Restausführungszeit dieser 
Instruktion, die als Interruptlatenz wirksam wird. Das ist genau die 
Zeit, die die Instruktion nach Interruptauslösung noch benötigt, um 
fertig zu werden.

Sie wird also nicht wirklich unterbrochen. Aber wie willst du ohne einen 
Riesen-Wortverhau diese Instruktion anders beschreiben als die 
unterbrochene? Der Kontext ergab doch unmittelbar, daß sie eben nicht 
unterbrochen wird, sonst würde sie ja keine Latenz verursachen.

von (prx) A. K. (prx)


Lesenswert?

Peter II schrieb:
>> R2–R17,R28,R29 (18 Stück) müssen nur gesichert werden, wenn die ISR sie
>> selbst verwendet.

> davon weiß der GCC dann scheinbar nicht.

Doch.

> Rufe mal eine Funktion auf und
> schon werden viel mehr Register gesichert.

Unbestritten. Mehr ja, aber eben nicht alle. Nicht einmal die Hälfte. 
Ich hatte oben 18 aufgezählt. Bleiben 14 übrig. Und genau die werden in 
einem bis auf den Funktionsaufruf leeren Handler gesichert: 
R0-R1,R18-R27,R30-R31.

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

Jonathan K. schrieb:
> Am Anfang meiner ISR
> befinden sich 29 push's

Versuche keine (wirklich keine einzige) Funktion aufzurufen im 
Interrupt. Dann verschwinden die meisten Pushs bis auf ne kleine Hand 
voll. Notfalls die entsprechenden Funktionen als inline definieren und 
somit etwas Flash opfern (wenn überhaupt).

von Jonathan K. (burgerohnealles)


Lesenswert?

Sehe ich das richtig, dass Interrupts "nachgeholt" werden? Bisher dachte 
ich, dass Interrupts, die wegen einem anderen Interrupt nicht direkt 
ausgeführt werden können, verloren sind.

Wenn ich
"Bei den meisten Intrrupts wird das auftreten eines Interrupts in einem
Flag gespeichert. Der Interrupts wird entsprechend ggf. Nachgeholt und
geht nicht verloren. Nur wenn in der Zeit in der Interrupts gesperrt
sind der eine Interrupt 2 mal auftritt, wird der Interrupt nur 1 mal
nachgeholt. Beim nachholen der Interrupts gilt die Reihenfolge der
Interruptsvektoren, nicht die in der die Events aufgetreten sind."
aus Beitrag "Hohe Frequenz bei AVR-Interrupts" richtig verstehe, werden 
alle verpassten Interrupts, die in einem Register ein Flag für den 
Interrupt haben, einmal nachgeholt. Richtig?

von Peter II (Gast)


Lesenswert?

Jonathan K. schrieb:
> Sehe ich das richtig, dass Interrupts "nachgeholt" werden? Bisher dachte
> ich, dass Interrupts, die wegen einem anderen Interrupt nicht direkt
> ausgeführt werden können, verloren sind.

ja, sonst könnte man ja nie sinnvoll damit arbeiten. Wenn ein neues Byte 
per UART ankommt und gleichzeitig der Timer zuschlägt.

von Karl H. (kbuchegg)


Lesenswert?

Jonathan K. schrieb:
> Sehe ich das richtig, dass Interrupts "nachgeholt" werden? Bisher dachte
> ich, dass Interrupts, die wegen einem anderen Interrupt nicht direkt
> ausgeführt werden können, verloren sind.

Das wär aber schön doof, wenn der Interrupt von der Motorendabschaltung 
nicht durchkommt, weil gerade ein UART Interrupt ein eingehendes Zeichen 
behandelt.

> alle verpassten Interrupts, die in einem Register ein Flag für den
> Interrupt haben

Alle Interrupts haben ein Flag welches beim Auftreten des Ereignisses 
zunächst mal gesetzt wird. Und zwar unabhängig davon, ob der 
entsprechende Interrupt freigegeben ist oder nicht.

Dieses Flag speichert also nur die Information: Ereignis ist 
eingetreten.
Ist der zugehörige Interrupt dann auch noch frei gegeben UND die globale 
Interrupt Freigabe auch noch frei gegeben, dann wird der entsprechende 
Interrupt Vektor angesprungen ("die ISR angesprungen") und dabei 
automatisch das entsprechende Flag auch noch gelöscht.
Das Registrieren des Interrupt auslösenden Ereignisses findet also immer 
und unabhängig davon, ob es auch per ISR behandelt wird statt.

von Jonathan K. (burgerohnealles)


Lesenswert?

Peter II schrieb:
> ja, sonst könnte man ja nie sinnvoll damit arbeiten.

Ahh, dachte ich mir auch die ganze Zeit, aber war bis jetzt auch noch 
nie sooo wichtig.

von Moby (Gast)


Lesenswert?

@Mod
Ist doch wieder mal ein schönes Beispiel, wie Hochsprache den Verkehr 
aufhält und Problemlösungen verkompliziert. Nicht wahr? Stört natürlich 
das Weltbild des C-Evangeliums und muß gelöscht werden, Entschuldigung 
;-)

von Karl H. (kbuchegg)


Lesenswert?

Moby schrieb:
> @Mod
> Ist doch wieder mal ein schönes Beispiel, wie Hochsprache den Verkehr
> aufhält und Problemlösungen verkompliziert. Nicht wahr?

Seh ich eigentlich nicht.
Für ein hinreichend komplexes Programm hast du in jeder Sprache das 
Problem, dass du nicht einfach Register nach Lust und Laune in einer ISR 
benutzen bzw. verändern darfst.
Die einzige Ausnahme ist, wenn man ein oder mehrere Register für nur 
eine ganz spezielle Aufgabe exklusiv reservieren kann. Zugegeben mit den 
Registern des AVR ist das bis zu einem gewissen Grad möglich, aber auch 
hier wieder: mit steigender Komplexität erfolgt der Wandel im Programm, 
dass man genau diese Exklusiv-Verwendung abstellen wird und muss, weil 
man nicht genügend Register hat. Womit zwangsläufig das Problem 
auftaucht, dass diese in einer ISR gesichert und wiederhergestellt 
werden müssen.

> Stört natürlich
> das Weltbild des C-Evangeliums und muß gelöscht werden, Entschuldigung
> ;-)

Ganz und gar nicht.
Die Diskussionen drehen sich ja nicht darum, dass man in einer Sprache 
wie C den Komfort nicht bezahlen müsste. Die Diskussionen drehen sich 
darum, wie teuer es ist. Und diese 'Kosten' halten sich nun mal in den 
meisten Fällen im akzeptablen Rahmen.

Ich habe es schon des öfteren hier im Forum angeboten: Machen wir doch 
die Probe aufs Exempel. Nehmen wir ein hinreichend komplexes Projekt 
(also schon 'etwas' komplexer als eine blinkende LED; es muss aber auch 
nicht gleich ein TCP/IP Stack sein, aber eine gewisse Herausforderung 
sollte es dann schon auch sein), du implementierst es in Assembler, ich 
in C. Und dann sehen wir mal, was da so rauskommt, wobei nicht nur die 
Laufzeit berücksichtigt wird, sondern auch so Begriffe wie 
"Entwicklungszeit" bzw. "Fehlerfreiheit" bzw. "Anpassbarkeit auf 
geänderte Bedingungen bzw. Erweiterbarkeit" mit reingenommen werden.
Angeboten hab ich das schon öfter, angenommen hat es noch nie wer.

: Bearbeitet durch User
von F. F. (foldi)


Lesenswert?

Karl Heinz schrieb:
> Angeboten hab ich das schon öfter, angenommen hat es noch nie wer.

Moby der Handschuh liegt dir zu Füßen, du musst ihn nur aufheben.

von c-hater (Gast)


Lesenswert?

Karl Heinz schrieb:

> Für ein hinreichend komplexes Programm hast du in jeder Sprache das
> Problem, dass du nicht einfach Register nach Lust und Laune in einer ISR
> benutzen bzw. verändern darfst.

Natürlich. Aber in Assembler hast du die Freiheit, die die 
Registerverwendung danach zu verteilen, wo sie am meisten Nutzen 
bringen.

> aber auch
> hier wieder: mit steigender Komplexität erfolgt der Wandel im Programm,
> dass man genau diese Exklusiv-Verwendung abstellen wird und muss

Kaum. Man kann alles andere auch mit weniger Registern machen, nur halt 
nicht mehr ganz so effizent, als wenn man die volle Registerzahl zur 
Verfügung hätte. Genau deswegen ist es wichtig, das Zeitverhalten seines 
Systems zu kennen und die Register so zu verwenden, daß, über alles 
gesehen, die bestmögliche Effizienz rauskommt. Und das geht nur in 
Assembler wirklich.

Aber, man muß zugegeben, es gibt auch C-Compiler, die das zumindest 
eingeschränkt ebenfalls ermöglichen. Aber gerade bei denen kann man dann 
auch am deutlichsten sehen, wie ungeheuer wichtig das für die 
Systemleistung ist, denn der Rest des Codes bleibt bei dieser 
Optimierung ja gleich.

Und so tut es nichtmal den C-Fetischisten weh, denn die wollen ja 
garnicht wissen, wie der Compiler den kryptischen Syntax-Bläh auf 
allgemeinverständliche Maschinen-Instruktionen eindampft. Wenn denen 
keiner sagt, daß ihr Compiler mit ein bis vier Registern weniger 
auskommen mußte, dann merken die das i.d.R. ja auch nichtmal...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

c-hater schrieb:
> Und so tut es nichtmal den C-Fetischisten weh, denn die wollen ja
> garnicht wissen, wie der Compiler den kryptischen Syntax-Bläh auf
> allgemeinverständliche Maschinen-Instruktionen eindampft.
Der Witz daran ist: das stimmt.
Solange das erzeugte Kompilat schnell genug ist, interessiert mich das 
keinen kleinen Hauch wie der Compiler mein Programm umgesetzt hat.

Erst wenn es mal knapp wird und keine Optimierungsstufe mehr hilft, dann 
lohnt es sich, den Assembler anzuschauen. Und wenn sich Interrupts 
verhaken, meist liegt es dann nicht am C-Code, sondern an der 
Denkweise und an der Programmstruktur. Und die sieht bei einem 
Programmierer immer gleich gut und gleich schlecht aus, je nach dem wie 
gut er "seinen" uC kennt.

c-hater schrieb:
> Genau deswegen ist es wichtig, das Zeitverhalten seines Systems zu
> kennen und die Register so zu verwenden, daß, über alles gesehen, die
> bestmögliche Effizienz rauskommt.
Ein Assembler-Programmierer, der nicht weiß wie man die 
Hardwarekomponenten (Timer, Interrupts, ...) "seines" uC zweckmäßig 
verwendet, der wird auch mit Assembler einen grausigen Murks abliefern.

Ein C-Programmierer (oder allgemein Hochsprachenprogrammierer), der sich 
mit "seiner" Hardware auskennt, wird ganz selten eine Zeile Assembler 
zur Beschleunigung brauchen.

c-hater schrieb:
> Und das geht nur in Assembler wirklich.
Früher(tm) war das noch der Fall. Aber seit der Jahrtausendwende sind 
die Compiler so gut, da stimmt diese pauschalisierende Aussage nicht 
mehr. Manchmal legt dir ein Compiler für einen bestimmten 
Hochsprachencode einen wirklich eleganten Assemblercode hin, das hätte 
ein durchschnittlicher Assemblerprogrammierer niemals geschafft. Ich 
habe sowas einige Male ausprobiert und kontrolliert. Und du?

: Bearbeitet durch Moderator
von (prx) A. K. (prx)


Lesenswert?

Lothar Miller schrieb:
> Manchmal legt dir ein Compiler für einen bestimmten
> Hochsprachencode einen wirklich eleganten Assemblercode hin, das hätte
> ein durchschnittlicher Assemblerprogrammierer niemals geschafft.

Beispiel, und das gab es schon in Compilern der 80er: switch statements. 
Ein Compiler wird, abhängig von der Anzahl und Verteilung der Werte, 
ggf. einen Vergleichsbaum erzeugen. Wenn es genug Werte sind, die für 
Tabelle zu wenig sequentiell sind.

Also zuerst einen Wert in der Mitte der Liste abfragen, 
drunter/drüber/gleich, dann einen Wert in der Mitte der verbleibenden 
Hälfte usw. Aufwand logarithmisch.

Grad bei einfachen Architekturen mit billigen Vergleichen wie AVR kann 
das sehr effizient sein. Aber kein Assembler-Programmierer wird jemals 
so einen Code produzieren, zumal bei jeder Änderung der ganze Baum neu 
aufgebaut werden muss.

: Bearbeitet durch User
von Bastler (Gast)


Lesenswert?

@A.K.:
Wer Hochsprachen aber so richtig hasst, der wird nie auf die Idee 
kommen, das mal genauer anzuschauen. Allein die Frage welcher Wert steht 
denn gerade in welchem Register, wird mMn von mir vielleicht in 
Einzenlfällen besser optimiert. Nur wieviele solche Optimierungen 
bekomme ich je Sekunde hin? Und das ist Leistung: Arbeit pro Zeit. 
Geschätzt bei einfachen Programmen 1s zu 1h oder 3600 mal höhere 
Leistung für die Software, denn da arbeiten jeweils die Hirne der 
Compilerschreiber für mich mit. Und wenn's komplizierter wird, wessen 
Konzentration lässt zuerst nach?
Aber wie gesagt, wer richtige hasst ...

von Cyblord -. (cyblord)


Lesenswert?

Bastler schrieb:
> Aber wie gesagt, wer richtige hasst ...

Ach das ist doch kein Hass. Das ist pures Unvermögen. Die haben ihre 
kleine Assembler-Welt und da kennen sie sich aus. Eine Hochsprache 
erfordert am Ende viel mehr Können, weil die abstrakten Möglichkeiten 
vielfältiger sind. Bei Assembler muss der Fokus immer zum großen Teil 
auf niedrigem Level liegen, schon damit alles technisch überhaupt 
funktioniert. Bei Hochsprachen verschiebt sich das, und es geht um 
Konzepte. Und das kann man nicht mehr so einfach auswendig lernen wie 
einen Befehlssatz mit ein- bis zweihundert Befehlen.
Und da scheitern die dann halt und geifern dann gegen die Hochsprachen.
Habt Mitleid.

von Bernd K. (prof7bit)


Lesenswert?

c-hater schrieb:
> den C-Fetischisten

Was ist denn ein C-Fetischist? Gibts in Deinem Weltbild auch normale 
C-Anwender?

von (prx) A. K. (prx)


Lesenswert?

Bernd K. schrieb:
> Was ist denn ein C-Fetischist? Gibts in Deinem Weltbild auch normale
> C-Anwender?

Für einen Fetischisten sind die anderen selbstredend auch Fetischisten.

von m.n. (Gast)


Lesenswert?

Cyblord ---- schrieb:
> Und da scheitern die dann halt und geifern dann gegen die Hochsprachen.
> Habt Mitleid.

Ach nee.
Es geht hier doch um möglichst schnelle Reaktion auf Interrupts. Wenn es 
richtig zeitkritisch ist, kommt man - insbesondere beim AVR - um 
Assembler nicht umhin. Die neueren AVR haben noch die Möglichkeit, über 
GPIORx-Register SREG und ein, zwei Register über IN/OUT-Befehle zu 
sichern, was die Ausführung noch einmal beschleunigt.
Kann man dann noch den Compiler anweisen, ein paar interne Register 
unberührt zu lassen und dadurch PUSH und POP zu vermeiden, steigert das 
die Geschwindigkeit nochmals. Dafür ist Assembler erste Wahl!

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Lothar Miller schrieb:
> Ein C-Programmierer (oder allgemein Hochsprachenprogrammierer), der sich
> mit "seiner" Hardware auskennt, wird ganz selten eine Zeile Assembler
> zur Beschleunigung brauchen.

Wie ich oben schon schrieb, sind sich ja auch die avr-gcc Entwickler 
über die ISR Latenz im Klaren und bieten verschiedene Möglichkeiten an, 
ISRs so zu deklarieren, das die Latenz klein bleibt.
Die Erfahrung zeigt aber, das das in nur sehr wenigen Fällen wirklich 
nötig ist und meistens durch ein wenig Überlegen und eine bessere 
Programmstruktur behandelt werden kann, ohne auf die Tricks wie 
'ISR_NAKED' usw. zurückgreifen zu müssen.

von Cyblord -. (cyblord)


Lesenswert?

m.n. schrieb:
> Ach nee.
> Es geht hier doch um möglichst schnelle Reaktion auf Interrupts. Wenn es
> richtig zeitkritisch ist, kommt man - insbesondere beim AVR - um
> Assembler nicht umhin. Die neueren AVR haben noch die Möglichkeit, über
> GPIORx-Register SREG und ein, zwei Register über IN/OUT-Befehle zu
> sichern, was die Ausführung noch einmal beschleunigt.
> Kann man dann noch den Compiler anweisen, ein paar interne Register
> unberührt zu lassen und dadurch PUSH und POP zu vermeiden, steigert das
> die Geschwindigkeit nochmals. Dafür ist Assembler erste Wahl!

Das mag alles sein. Nur ist die Thematik deshalb eben kein Grund, 
pauschal gegen C vorzugehen. Jeder C-Programmierer weiß dass man ab und 
zu auch direkt was in Assembler schreiben muss. Darum geht es hier gar 
nicht.

von m.n. (Gast)


Lesenswert?

Cyblord ---- schrieb:
> Das mag alles sein. Nur ist die Thematik deshalb eben kein Grund,
> pauschal gegen C vorzugehen.

Ach, es ist hier doch üblich, überspitzt zu formulieren, um überhaupt 
wahrgenommen zu werden. Ich gehe davon aus, daß c-hater weiß, was er 
macht und das er das auch kann ;-)

Cyblord ---- schrieb:
> Jeder C-Programmierer weiß dass man ab und
> zu auch direkt was in Assembler schreiben muss.

Wenn das so wäre, gäbe es diesen Beitrag nicht. C-Programmierer fallen 
nicht vom Himmel und müssen das Handwerk erst erlernen.

von (prx) A. K. (prx)


Lesenswert?

m.n. schrieb:
> Es geht hier doch um möglichst schnelle Reaktion auf Interrupts.

Die Registersituation macht klar, dass ziemlich viel Code im 
Interrupt-Handler steckt. Also nicht bloss 1-2 Bitoperationen auf Ports 
oder so. Das steht eine einfachen Lösung per Assembler etwas im Weg.

von Karl H. (kbuchegg)


Lesenswert?

Cyblord ---- schrieb:

> Das mag alles sein. Nur ist die Thematik deshalb eben kein Grund,
> pauschal gegen C vorzugehen. Jeder C-Programmierer weiß dass man ab und
> zu auch direkt was in Assembler schreiben muss.

Auf Anhieb fällt mir da in der Codesammlung ein Basic-Interpreter ein, 
der nebenher auch noch ein Video-Signal erzeugt. Das man letzteres in 
Assembler schreiben muss ist denke ich jedem klar. Da geht es um jeden 
Taktzyklus. Abgesehen davon .... mhhm .... kann ich mich an kein 
Beispiel hier im Forum erinnern, das zwingend Assembler erfordert hätte. 
Mag sein, dass es welche gab, aber viel mehr als 2 Handvoll in 10 Jahren 
werden es nicht gewesen sein.

Und ob im Falle des TO die absolut mögliche geringste Interrupt Latenz 
tatsächlich notwendig ist .... kann man eher nicht beurteilen. Gerade 
bei Neulingen wäre ich da sehr vorsichtig mit derartigen FOrderungen. 
Wäre nicht das erste mal, dass etwas gefordert ist, was tatsächlich 
niemand wirklich braucht. Zum anderen hat bis jetzt ja noch niemand die 
ISR auch tatsächlich gesehen, so dass man sich mal ansehen könnte, 
welche Verbrechen da wieder drinn stecken, die den Compiler zur Push/Pop 
Orgie zwingen.

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Karl Heinz schrieb:
> Cyblord ---- schrieb:
>
>> Das mag alles sein. Nur ist die Thematik deshalb eben kein Grund,
>> pauschal gegen C vorzugehen. Jeder C-Programmierer weiß dass man ab und
>> zu auch direkt was in Assembler schreiben muss.
>
> Auf Anhieb fällt mir da in der Codesammlung ein Basic-Interpreter ein,
> der nebenher auch noch ein Video-Signal erzeugt. Das man letzteres in
> Assembler schreiben muss ist denke ich jedem klar. Da geht es um jeden
> Taktzyklus. Abgesehen davon .... mhhm .... kann ich mich an kein
> Beispiel hier im Forum erinnern, das zwingend Assembler erfordert hätte.
> Mag sein, dass es welche gab, aber viel mehr als 2 Handvoll in 10 Jahren
> werden es nicht gewesen sein.

Tasksysteme, Scheduler usw. würden mir da noch einfallen.
Oder die delay routinen der libc sind auch in ASM was wohl auch gut so 
ist.

von Udo S. (urschmitt)


Lesenswert?

Cyblord ---- schrieb:
> Oder die delay routinen der libc sind auch in ASM was wohl auch gut so
> ist.

Sonst würde der Compiler die unnötigen Schleifen wegoptimieren ;-)

von m.n. (Gast)


Lesenswert?

Karl Heinz schrieb:
> Abgesehen davon .... mhhm .... kann ich mich an kein
> Beispiel hier im Forum erinnern, das zwingend Assembler erfordert hätte.

Ich zeig Dir mal eins: 
http://www.mikrocontroller.net/attachment/184587/qcnt_6sub.s
Es geht um eine 4-fach Flankenauswertung per Interrupt bis 500 kHz mit 
einem ATmega88 @ 20 MHz. PUSH und POP sind nicht vorhanden.

Natürlich weiß ich, daß die Auswertung von Inkrementalgebern per 
Interrupt ganz böse ist ;-)

von Karl H. (kbuchegg)


Lesenswert?

m.n. schrieb:
> Karl Heinz schrieb:
>> Abgesehen davon .... mhhm .... kann ich mich an kein
>> Beispiel hier im Forum erinnern, das zwingend Assembler erfordert hätte.
>
> Ich zeig Dir mal eins:
> http://www.mikrocontroller.net/attachment/184587/qcnt_6sub.s
> Es geht um eine 4-fach Flankenauswertung per Interrupt bis 500 kHz mit
> einem ATmega88 @ 20 MHz. PUSH und POP sind nicht vorhanden.

Gut.
Dann sind das 2 Beispiele.
Sonst noch was?

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Karl Heinz schrieb:
> Gut.
> Dann sind das 2 Beispiele.
> Sonst noch was?

Wie wär's hiermit:
Beitrag "Projektvorstellung: µMk64 - 2-MHz Heimcomputer aus 5 AVRs"

Cyblord ---- schrieb:
> Eine Hochsprache
> erfordert am Ende viel mehr Können, weil die abstrakten Möglichkeiten
> vielfältiger sind. Bei Assembler muss der Fokus immer zum großen Teil
> auf niedrigem Level liegen, schon damit alles technisch überhaupt
> funktioniert. Bei Hochsprachen verschiebt sich das, und es geht um
> Konzepte.

Sorry, aber ich glaube mein vorgenanntes Projekt beweist da das 
Gegenteil. Ich musste dafür sowohl abstrakte Konzepte als auch Low-Level 
paralell bearbeiten und aneinender anpassen. Für einen Fokus auf 
Low-Level ist das Projekt 'ein wenig' zu komplex und ein Compiler, der 
Code für mehrere Prozessoren so aneinander anpasst ist mir auch noch 
nicht untergekommen.

Grüße
Mark

von Cyblord -. (cyblord)


Lesenswert?

Mark Leyer schrieb:
> Karl Heinz schrieb:
>> Gut.
>> Dann sind das 2 Beispiele.
>> Sonst noch was?
>
> Wie wär's hiermit:
> Beitrag "Projektvorstellung: µMk64 - 2-MHz Heimcomputer aus 5 AVRs"

An dem Projekt war aber nichts "notwendig". Das war eine 
Selbstgeißelung.
Schon die Rahmenbedingungen sind doch absurd. Vorsätzliche Einschränkung 
der Messmittel usw.

Das kannst du doch nicht ernsthaft als Beispiel für sinnvollen ASM 
Einsatz hernehmen.

> Sorry, aber ich glaube mein vorgenanntes Projekt beweist da das
> Gegenteil. Ich musste dafür sowohl abstrakte Konzepte als auch Low-Level
> paralell bearbeiten und aneinender anpassen. Für einen Fokus auf
> Low-Level ist das Projekt 'ein wenig' zu komplex und ein Compiler, der
> Code für mehrere Prozessoren so aneinander anpasst ist mir auch noch
> nicht untergekommen.

Fleißarbeit halt. Siehe oben. Es geht um SINNVOLLEN Einsatz von ASM, wo 
er notwendig ist, nicht um zwanghaften Rätselwahn.
Natürlich kann man am Ende alles in ASM machen, das hat niemand 
bezweifelt. Du hättest auch den Lötkolben weg lassen können und 
stattdessen alles mit einem Feuerzeug (oder Feuerstein) löten können.
Damit hätten wir dann gleich die sinnlosigkeit eines Lötkolbens bewiesen 
oder wie?

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Mark Leyer schrieb:

> Sorry, aber ich glaube mein vorgenanntes Projekt beweist da das
> Gegenteil.

Gleich vorweg: schönes Projekt.

Aber 9 Mannmonate?

CPU Emulation: ok, da sind Zyklen wichtig
Video wurde schon angesprochen
SD-Karte: gähn. Gibts in C
Soundchip: irgendwo in der Codesammlung gibt es eine SID Emulation.
(Ist zwar nicht die, die ich suche, aber trotzdem: 
Beitrag "ATMEGA8 Soundgenerator/Synthizer")

Das man Dinge in Assembler machen kann stellt doch keiner in Frage. 
Die Frage ist, wie sinnvoll ist es alles in Assembler zu machen, wenn 
ich in der selben Zeit in C viel mehr schaffen kann, weil ich mich um 
den ganzen Kleinkram eben nicht kümmern will und das auch nicht muss, 
weil das Ergebnis vom Compiler mehr als gut genug ist.
Dass es Bereiche gibt, in denen man auf Assembler zurück fallen wird und 
muss, stellt keiner in Frage. Ich denke da zb an die bekannte FFT von 
Elm-Chan. Die ist sicherlich nicht ohne Grund in Assembler geschrieben. 
Aber: die ist nur Teil eines Projektes. Der Rest wird dann in 
Hochsprache geschrieben. Warum? Weil es in der Laufzeit schnell genug 
ist und in der Entwicklungszeit schneller geht.

: Bearbeitet durch User
von Mark L. (m2k10) Benutzerseite


Lesenswert?

Ob das Projekt an sich 'sinnvoll' ist oder nicht will ich hier nicht 
diskutieren, manche fahren halt gerne mit dem Auto, andere erwandern 
sich unbefahrbare Strecken zu Fuß, 'Sinn' macht das jeweils nur für 
jeden einzelnen seinen Interessen zu folgen und Spaß dabei zu haben.

Der Punkt ist einfach der, dass mein Projekt nur in ASM möglich ist. Das 
Konzept basiert darauf, dass bis zu vier AVRs abwechselnd auf einen 
gemeinsamen RAM zugreifen und das komplett nur über die jeweilige 
Software synchronisiert. Das bekommt halt kein Compiler so hin.
Es war genau mein Ziel einen Computer zu entwickeln, der so vorhersehbar 
taktgenau funktioniert wie ein C64. Um dieses Ziel zu erreichen war nur 
der Einsatz von ASM sinnvoll bzw. überhaupt möglich. Ich hätte mir auch 
viele andere Ziele setzen können, die ich vielleicht auch mit deutlich 
weniger Arbeit in C hätte erreichen können. Ich hätte mir auch einen 
RaspPi nehmen und einen C64-Emulator schreiben können, hätte viel Arbeit 
gespart und so weiter. Aber das wäre niemals das gewesen, was ich haben 
wollte, es hätte nur nach Außen ähnlich ausgesehen.
Aber das ist nicht der Punkt, der Punkt ist, dass ich ein festes Ziel 
hatte, dass ich so nur mit ASM sinnvoll erreichen konnte in der Form und 
mit dem Ergebniss was die Geschwindigkeit angeht. Ob meine Ziele 
'sinnvoll' oder 'notwendig' waren ist alleine meine Sache, ist 
schließlich ein Hobbyprojekt und kein gewerblicher Auftrag. Aber in 
Bezug auf meine konkreten Ziele war nur der Einsatz von ASM sinnvoll.

von Moby (Gast)


Angehängte Dateien:

Lesenswert?

Karl Heinz schrieb:
> Angeboten hab ich das schon öfter, angenommen hat es noch nie wer.

Na, wer hat/investiert auch schon Zeit und Energie für ein größeres 
Programm, um in einem solchen Forum ganz ohne eigenen Nutzen bloß etwas 
nachzuweisen? Das wird Dir natürlich ebenso klar sein wie die etwas 
unredlichen Rahmenbedingungen: So wie Du dabei pauschal und etwas albern 
unterstellst, ich würde der Hochsprache unabhängig jedweder Ausgangslage 
die Sinnhaftigkeit absprechen, so total subjektiv, situationsabhängig 
und ungeeignet für einen objektiven Sprachvergleich bei nicht allzu 
komplexen, großen Programme sind Kategorien wie

- Entwicklungszeit (von vorhandenem Code und Programmiererkönnen 
bestimmt)
- Fehlerfreiheit (vom "sachgemäßen" Umgang mit den Sprachmitteln 
bestimmt)
- Anpassbarkeit/Erweiterbarkeit (in jeder Sprache uneingeschränkt 
möglich)

Und um gleich noch die unerwähnte Portabilität mit ins Boot zu nehmen: 
Die braucht man gar nicht unbedingt und überall- insbesondere wenn man 
die OBJEKTIVEN Vorteile einfachen Asm-Codes wie bei Speed und 
Platzverbrauch, kombiniert mit einer hinreichend großen 
Controllerspannweite so wie bei der AVR-Architektur für sich zu nutzen 
weiß. Also bleiben wir doch bitte bei diesen objektiven, wirklich 
vergleichbare Kriterien, die ich in meinem wieder mal gelöschten Beitrag 
schon angesprochen hatte und die doch (der Speed) allein für das 
Threadproblem hier verantwortlich zeichnen. Aber Du "ahnst" ja selber 
schon

> dass man in einer Sprache wie C den Komfort ... bezahlen muß

Trotzdem, ich hätte da auch schon was vorbereitet. Etwas Code für eine 
zwar recht einfache, aber doch typische Problemstellung aus der Praxis:

  LED0 = KEY0.state;           // an solange Taste gedrückt
  LED1.toggle = KEY1.press     // wechsel bei jeder Drückflanke
  LED2.off = KEY2.press_short; // kurz drücken - aus
  LED2.on = KEY2.press_long;   // lang drücken - an

Alle Eingänge schön entprellt natürlich.

Kommt das jemandem bekannt vor? Ja, das ist das Beispiel aus
Beitrag "C++ auf einem MC, wie geht das?"
an dem sich die Protagonisten gepflegter OOP seit Monaten zwar 
akademisch elegant, aber doch bislang erfolglos mit ihrem Wust an C++ 
Konstrukten abarbeiten... Dort wo es gepaßt und den C++lern die 
Messlatte für eine einfache Problemlösung aufgezeigt hätte wurde der 
Code natürlich gelöscht ;-(
Dann eben hier nochmal. Möge das doch jemand kürzer/schneller in C 
kodieren! Aber Achtung, ich sehe im Fall der Fälle noch weiteres 
Optimierungspotential ;-)

> Die einzige Ausnahme ist, wenn man ein oder mehrere Register für nur
> eine ganz spezielle Aufgabe exklusiv reservieren kann. Zugegeben mit den
> Registern des AVR ist das bis zu einem gewissen Grad möglich, aber auch
> hier wieder: mit steigender Komplexität

Und dieser gewisse Grad langt bei 32 verfügbaren allgemeinen Registern 
durchaus sehr weit: Wie im Beispielcode gezeigt nehme ich R9-R15 in 
Interrupts zur schnellen Registersicherung- und dort dann meist nur für 
die universellen Pointerregister + Status. Das langt für Millionen 
Einsatzfälle- und wer sagt denn das es tragisch ist, für zusätzlich 
benötigte Register punktgenau Push/Pop zu bemühen? Gerne verpacke ich 
ganz orgienfrei auch die gesamte Funktionalität im Interrupt- das 
Hauptprogramm schläft dann nur noch energiesparend.

Cyblord ---- schrieb:
> Eine Hochsprache
> erfordert am Ende viel mehr Können, weil die abstrakten Möglichkeiten
> vielfältiger sind.

Richtig! Als Hobbybastler kann ich aber fragen: Braucht es das?
Bei Millionen einfacher Steuerungsanwendungen?

> Bei Hochsprachen verschiebt sich das, und es geht um
> Konzepte. Und das kann man nicht mehr so einfach auswendig lernen wie
> einen Befehlssatz mit ein- bis zweihundert Befehlen.

Richtig! Nicht mehr so einfach... d.h. komplizierter! Ganz schnell 
unnötig kompliziert! Das Aufwand-Nutzen Verhältnis der Problemstellung 
nicht mehr angemessen.

> Es geht um SINNVOLLEN Einsatz von ASM, wo
> er notwendig ist, nicht um zwanghaften Rätselwahn.

Es geht um sinnvollen Einsatz von Hochsprache,
wo sie nötig ist, nicht um zwanghaften Rätselwahn ;-)

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Moby ist wach geworden!
Jetzt fehlt nur noch ein Vertreter der STM32-Fraktion, der für 
Assemblerprogrammierung (vielleicht zu Recht) garkeinen Sinn mehr sieht.
Dann noch eine große Tüte Karamellen - heute ist der letzte Tag dafür 
;-)

von Karl H. (kbuchegg)


Lesenswert?

Moby schrieb:

> unredlichen Rahmenbedingungen: So wie Du dabei pauschal und etwas albern
> unterstellst, ich würde der Hochsprache unabhängig jedweder Ausgangslage
> die Sinnhaftigkeit absprechen

Dann frag ich mich, was der Spruch von wegen
1
... Stört natürlich das Weltbild des C-Evangeliums  ...
eigentlich sollte?

> so total subjektiv, situationsabhängig
> und ungeeignet für einen objektiven Sprachvergleich bei nicht allzu
> komplexen, großen Programme sind Kategorien wie
>
> - Entwicklungszeit (von vorhandenem Code und Programmiererkönnen
> bestimmt)

finde ich nicht. Immerhin ist das einer der wesentlichen Kanckpunkte in 
der industriellen Softwareentwicklung.

> - Fehlerfreiheit (vom "sachgemäßen" Umgang mit den Sprachmitteln
> bestimmt)

Nicht nur. Auch algorithmische Fehlerfreiheit. Die wächst ganz 
automatisch mit dem Umfang des Programms in LOC.

> - Anpassbarkeit/Erweiterbarkeit (in jeder Sprache uneingeschränkt
> möglich)

Die Frage ist: welche Details muss ich noch im Kopf haben, wenn ich 2 
Jahre später wieder an denselben Code gehe.


> Trotzdem, ich hätte da auch schon was vorbereitet. Etwas Code für eine
> zwar recht einfache, aber doch typische Problemstellung aus der Praxis:
>
>   LED0 = KEY0.state;           // an solange Taste gedrückt
>   LED1.toggle = KEY1.press     // wechsel bei jeder Drückflanke
>   LED2.off = KEY2.press_short; // kurz drücken - aus
>   LED2.on = KEY2.press_long;   // lang drücken - an
>
> Alle Eingänge schön entprellt natürlich.

sorry.
Aber das ist mir zu banal.
PeDa Entprellung und eine simple Hauptschleife. Sache auf 10 Minuten. 
Höchstens.

> Kommt das jemandem bekannt vor? Ja, das ist das Beispiel aus
> Beitrag "C++ auf einem MC, wie geht das?"
> an dem sich die Protagonisten gepflegter OOP seit Monaten zwar
> akademisch elegant, aber doch bislang erfolglos mit ihrem Wust an C++
> Konstrukten abarbeiten...

Ich han den Thread nicht weiter verfolgt. Hab also auch keine Ahnung was 
dort die Entwicklung ist. Ich würde allerdings mal schätzen, dass es da 
um prinzipielle Themen geht um prinzipielle Herangehensweisen.

> Dort wo es gepaßt und den C++lern die
> Messlatte für eine einfache Problemlösung aufgezeigt hätte wurde der
> Code natürlich gelöscht ;-(

Kann nichts dazu sagen. Hab den Thread nicht verfolgt.
Da aber alle die PeDa Lösung kennen, ist die Aufgabenstellung trivial in 
C zu lösen. Die einzig interessante Frage, die ich mir vorstellen 
könnte, lautet: wie kann ich das in OOP verpacken, so dass ich möglichst 
keinen Penalty zahle.
Das ihr da natürlich mit einer Assemblerlösung nicht gerne gesehen seid, 
ist mir dann auch klar. Denn das ist in Wirklichkeit überhaupt nicht 
gefragt, wenn sich die Diskussion um Konzepte und Varianten bzw. deren 
Vergleich dreht. Das wäre dann eine einfache Themenverfehlung.

> Dann eben hier nochmal. Möge das doch jemand kürzer/schneller in C
> kodieren! Aber Achtung, ich sehe im Fall der Fälle noch weiteres
> Optimierungspotential ;-)


> Und dieser gewisse Grad langt bei 32 verfügbaren allgemeinen Registern
> durchaus sehr weit:

Schön.
Wie wärs mit einer nicht so trivialen Aufgabenstellung.

Heizungssteuerung. Brenner per PWM angesteuert. Dazu ein DS1820 als 
Temperaturaufnehmer. Nein, 2 DS1820. Die Aussentemperatur sollte auch 
mit eingehen
Dazu eine Tageszeit abhängige Temperaturkurve (die Heizung soll ja nicht 
dauernd laufen, wenn ich zur Arbeit bin), die natürlich auch auf 
Wochentage eingeht. Temperaturkurve bitte in 3 Ausführungen "bin da", 
"bin nicht da", "Freundin ist da, daher bitte etwas wärmer".
Das ganze garniert mit einem LCD, Drehencoder und Menüsteuerung.


Wie siehts jetzt mit deinen Registern aus?

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Moby schrieb:

> Cyblord ---- schrieb:
>> Eine Hochsprache
>> erfordert am Ende viel mehr Können, weil die abstrakten Möglichkeiten
>> vielfältiger sind.
>
> Richtig! Als Hobbybastler kann ich aber fragen: Braucht es das?
> Bei Millionen einfacher Steuerungsanwendungen?

Das geht am Kern des Problems vorbei.
Die Frage lautet nicht "einfach oder nicht einfach".
Die Frage lautet: muss ich auch noch den letzten Taktzyklus aus dem 
Programm rausholen oder nicht?
Wenn es für meine Steuerung keine Rolle spielt, ob die Regelschleife 
10µs länger dauert oder nicht, weil das bei den mechanischen 
Unzuverlässigkeiten des Systems völlig untergeht, dann braucht auch kein 
Mensch das feilschen um Taktzyklen. Siehe zb dein LED-Beispiel: völlig 
uninteressant, ob das 10 Prozessortakte schneller geht oder nicht. Kein 
Mensch kann den Unterschied ohne Messmittel feststellen.

von Moby (Gast)


Lesenswert?

Karl Heinz schrieb:
> Dann frag ich mich, was der Spruch von wegen... Stört natürlich das
> Weltbild des C-Evangeliums  ...
> eigentlich sollte?

Eine Anspielung auf

Jörg Wunsch schrieb:
> Moby schrieb:
>> Asm formuliert klar, einfach, eindeutig.
>
> Bitte eröffne deinen eigenen Assembler-Evangelismus-Thread.


Karl Heinz schrieb:
> Immerhin ist das einer der wesentlichen Kanckpunkte in
> der industriellen Softwareentwicklung.

Am Punkt Hobbybedarf/Industriebedarf scheiden sich die Geister.

Karl Heinz schrieb:
> Die Frage ist: welche Details muss ich noch im Kopf haben, wenn ich 2
> Jahre später wieder an denselben Code gehe.

So gut die Doku so wenig Details nötig im Kopf... Bei Asm wirklich nicht 
anders als in Hochsprache.

Karl Heinz schrieb:
> Aber das ist mir zu banal.

Triviales Problem- meine Rede. Aber schau nochmal in besagten Thread ;-)
Für einen Vergleich hinsichtlich Speed und Codebedarf langt das völlig.

Karl Heinz schrieb:
> Die einzig interessante Frage lautet:

wie solls in C++ einfacher gehen? Unbeantwortet.

Karl Heinz schrieb:
> Wie siehts jetzt mit deinen Registern aus?

Das weiß ich nicht und habe leider auch keine Zeit und keinen Bedarf, es 
herauszufinden. Die Aufgabenstellung klingt anspruchsvoll, 
möglicherweise hast Du ja den Code zuhause schon am Laufen ;-) Was ich 
weiß ist, daß ich für meine Heizungssteuerung (Fernheizung) nur einen 
Bruchteil dieses Aufwands treiben muß.

Karl Heinz schrieb:
> Die Frage lautet nicht "einfach oder nicht einfach".

Doch. Die Frage lautet 'einfach oder nicht einfach'.
Einfach ist, die paar Dutzend Asm-Instruktionen auf eine schön 
überschaubare Controllerhardware anzusetzen. Schwieriger ist, erst 
Hunderte Seiten C-Literatur dafür in den Kopf zu bekommen, die 
Entwicklungsumgebung unnütz aufzublasen und Code-Controlle an einen zu 
konfigurierenden Compiler abzugeben.

Karl Heinz schrieb:
> dann braucht auch kein
> Mensch das feilschen um Taktzyklen. Siehe zb dein LED-Beispiel:

Nein, siehe dieses Threadthema! Was mein LED-Beispiel angeht - es geht 
dort nicht um die Prozessortakte. Es geht um eine konkrete 
Aufgabenstellung und die prinzipielle Frage, ob das in Hochsprache 
genauso kurz und schnell hinzubekommen ist. Versuch doch mal. Wenns bloß 
10 Minuten dauert...

von TriHexagon (Gast)


Lesenswert?

Moby schrieb:
> Doch. Die Frage lautet 'einfach oder nicht einfach'.
> Einfach ist, die paar Dutzend Asm-Instruktionen auf eine schön
> überschaubare Controllerhardware anzusetzen. Schwieriger ist, erst
> Hunderte Seiten C-Literatur dafür in den Kopf zu bekommen, die
> Entwicklungsumgebung unnütz aufzublasen und Code-Controlle an einen zu
> konfigurierenden Compiler abzugeben

Als nächstes erzählst du uns, dass du keinen Führerschein hast, weil der 
Straßenverkehr viel zu komplex ist und die Verkehrsregeln viel zu 
umfangreich sind.

von Cyblord -. (cyblord)


Lesenswert?

TriHexagon schrieb:
> Als nächstes erzählst du uns, dass du keinen Führerschein hast, weil der
> Straßenverkehr viel zu komplex ist und die Verkehrsregeln viel zu
> umfangreich sind.

Und für den Hobbybereich reicht es sich nicht mehr als 100m vom Haus zu 
entfernen. Damit ist gezeigt: Laufen reicht völlig und ist an Einfacheit 
nicht durch ein Auto zu schlagen.
DAS ist seine ganze Argumentation und damit bekommt er immer wieder 
Leute die den Fehler machen mit ihm zu disktutieren.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Und weil man sowieso nur zu Fuss die kürzeren und "schnelleren" Wege 
gehen kann...

von Cyblord -. (cyblord)


Lesenswert?

> Einfach ist, die paar Dutzend Asm-Instruktionen auf eine schön
> überschaubare Controllerhardware anzusetzen.

Damit hat er natürlich recht. Nur was kann man unter solchen Prämissen 
schon machen? Seine Blinky Programme scheinen ihm Funktion genug. Dann 
finde ich es völlig korrekt dass er bei ASM bleibt. C wäre dafür 
Overkill.

Nur wie bekommt man die, von Karl-Heinz oben beschriebene Steuerung, in 
ein paar Dutzend ASM Anweisungen? Ich würde das gerne mal sehen.

Ich schlage vor, Moby zeigt uns mal sein komplexestes Projekt. Dann 
zählen wir mal die Instruktionen. Ich bin gespannt was der Moby in ein 
paar Dutzend ASM Anweisungen (ich würde sagen <50 wären wohl ok?) für 
magische Funktionalität verpackt hat.

: Bearbeitet durch User
von TriHexagon (Gast)


Lesenswert?

Cyblord ---- schrieb:
> TriHexagon schrieb:
>> Als nächstes erzählst du uns, dass du keinen Führerschein hast, weil der
>> Straßenverkehr viel zu komplex ist und die Verkehrsregeln viel zu
>> umfangreich sind.
>
> Und für den Hobbybereich reicht es sich nicht mehr als 100m vom Haus zu
> entfernen. Damit ist gezeigt: Laufen reicht völlig und ist an Einfacheit
> nicht durch ein Auto zu schlagen.
> DAS ist seine ganze Argumentation und damit bekommt er immer wieder
> Leute die den Fehler machen mit ihm zu disktutieren.

Ja damit hast du recht. Mit ihm lässt sich nicht diskutieren, das haben 
die letzten Monate immer wieder gezeigt. Er kennt halt nur diese eine 
Seite der Medaille und eine Menge Halbwissen, was er mal so 
aufgeschnappt hat.

Zum Autovergleich: wie kommt es, dass so viele ein Auto haben, obwohl 
Autos doch nur für den kommerziellen Gebrauch sinnvoll sind :P .

Ich habe auch nur hobbymäßig mit Microcontrollern zu tun, trotzdem sehe 
ich keinen Grund darin ASM zu verwenden, wenn ich es nicht muss. Ich 
brauche bei ASM Code sehr viel länger als bei ASM und die Fehlersuche in 
ASM ist oft die Hölle. Mit C programmiere ich AVR, ARM (Cortex) und 
x86/x64 ohne etwas neu erlernen zu müssen. Meinen FAT Treiber habe ich 
für AVR geschrieben, aber nativ am PC getestet und debuggt. Aber der 
Punkt ist doch: ein Code der dasselbe leistet, aber nur ein Viertel der 
Laufzeit benötigt ist cool, aber doch nur Spielerei, wenn der langsamere 
Code genauso die Anforderungen erfüllt und weniger Arbeitszeit in 
Anspruch nimmt.

von c-hater (Gast)


Lesenswert?

Karl Heinz schrieb:

> Heizungssteuerung. Brenner per PWM angesteuert. Dazu ein DS1820 als
> Temperaturaufnehmer. Nein, 2 DS1820. Die Aussentemperatur sollte auch
> mit eingehen
> Dazu eine Tageszeit abhängige Temperaturkurve (die Heizung soll ja nicht
> dauernd laufen, wenn ich zur Arbeit bin), die natürlich auch auf
> Wochentage eingeht. Temperaturkurve bitte in 3 Ausführungen "bin da",
> "bin nicht da", "Freundin ist da, daher bitte etwas wärmer".
> Das ganze garniert mit einem LCD, Drehencoder und Menüsteuerung.
>
>
> Wie siehts jetzt mit deinen Registern aus?

Also für solche langweiligen reinen Fleißaufgaben braucht man doch 
nichtmal irgendeinen Interrupt, ich sehe hier auch keinerlei Sachen 
drin, die auch nur näherungsweise das Attribut zeitkritisch verdienen 
würden. Leicht übertrieben: Das könnte man mit Relais-Logik lösen, wenn 
das olle Klappern der Relais nicht so störend wäre...

Das geht also sowas von völlig am Thema des Threads vorbei (zur 
Erinnerung: Es ging um Minimierung von Interruptlatenzen), daß es 
eigentlich gelöscht gehört.

von Bastler (Gast)


Lesenswert?

Thema war Interrupt-Latenz in C!

von c-hater (Gast)


Lesenswert?

Bastler schrieb:

> Thema war Interrupt-Latenz in C!

Nunja, dabei hat sich ja bereits vor gefühlten 3000 Postings 
herausgestellt, daß die Möglichkeiten von C im, darauf positiven Einfluß 
zu nehmen, doch arg begrenzt sind und selbst in den besten Inkarnationen 
der C-Compiler letztlich doch nur darauf hinauslaufen, zumindest die 
exklusiven Teile der ISRs in Asm zu schreiben...

Und selbst wenn das nicht so wäre, bleibt immer noch die Frage, 
inwiefern eine Anwendung, die keinerlei Timing-Probleme haben kann, 
weil sie schlicht nichts bearbeitet, was wirklich schnell erfolgen muß, 
irgendwas dazu beitragen könnte, eben solche zu lösen...

von Bastler (Gast)


Lesenswert?

Also mit 3..4 ASM Opcodes da optimieren, wo man's braucht. Trotzdem 
versuchen die Ritter des AVR Opcodes ihr Reinheitsgebot durchzusetzen. 
In welcher Sprache wohl der AVR-Assembler geschrieben ist? Hoffentlich 
was Koscheres!

von c-hater (Gast)


Lesenswert?

Bastler schrieb:

> Also mit 3..4 ASM Opcodes da optimieren, wo man's braucht.

Also allumfassendes Fazit: Wenn's wirklich effizient sein soll, muß es 
am Ende eben doch Asm sein.

> Trotzdem
> versuchen die Ritter des AVR Opcodes ihr Reinheitsgebot durchzusetzen.

Ooops? ES wurde nur dargestellt, daß zeitkritische Sachen in Assembler 
einfach einfacher zu lösen sind, weil man sich eben nur mit den 
Timing-Constraints selber auseinander setzen muß und nicht auch noch mit 
einer Sprache, die Code ohne definiertes Zeitverhalten produziert und 
zumindest im Bezug auf die Nutzung von Interrupts auch noch überaus 
ineffizent ist, weil sie ihre verschissene Runtime-Umgebung zu mehr oder 
weniger großen Teilen über den Kontextwechsel hieven muß, sobald es in 
der ISR über allereinfachste Zuweisungs-Operationen hinausgeht.

von Bastler (Gast)


Lesenswert?

Es gibt auch Dinge, die ich "hasse" im Sinne von "selbst nicht machen 
mag". Nur warum sollte ich andere davon abhalten, diese Dinge zu machen. 
Solang mich keiner dazu zwingt. Manche zwingen aber. Und zwar sich 
selbst zur Missionierung anderer. Das nervt!!

von Cyblord -. (cyblord)


Lesenswert?

c-hater schrieb:

> Also allumfassendes Fazit: Wenn's wirklich effizient sein soll, muß es
> am Ende eben doch Asm sein.

So wie es aussieht ist das Fazit wohl eher, dass die ASM Fraktion ob der 
gestellten Aufgabe in heftige Rückzugsgefechte gerät. Die oben 
skizzierte Steuerung sehe ich momentan hier weder in ASM noch in 
Relaislogik realisiert.
Natürlich nur weil es Offtopic ist. Versteht sich Jungs.
By the way, welches Relais würdest du für die DS18B20 Ansteuerung 
empfehlen?

Also die Sache scheint damit wohl abgehakt. Tragts mit Fassung.

: Bearbeitet durch User
von Moby (Gast)


Lesenswert?

Moby schrieb:
> Versuch doch mal. Wenns bloß
> 10 Minuten dauert...

Oder auch nicht ;-)
Natürlich idt es immer einfach, unrealistische Forderungen in den Raum 
zu werfen und bei Nichterfüllung als "Totschlagargument" herzunehmen.

c-hater schrieb:
> Also für solche langweiligen reinen Fleißaufgaben braucht man doch
> nichtmal irgendeinen Interrupt

Darauf tippe ich jetzt auch mal. Die eigentliche Herrausforderung dürfte 
nicht die Registerverwendung sein, sondern die Regelung des 
Temperaturverlaufs dem Hausherren recht zu machen.

von Moby (Gast)


Lesenswert?

Cyblord ---- schrieb:
> Ich schlage vor, Moby zeigt uns mal sein komplexestes Projekt.

Ich schlage vor, zeig Du erst mal irgendwas ;-)

> Ich bin gespannt was der Moby in ein
> paar Dutzend ASM Anweisungen (ich würde sagen <50 wären wohl ok?) für
> magische Funktionalität verpackt hat.

Ich bin mir gar nicht mal sicher, ob Du das so schnell herausfindest ;-)

Bastler schrieb:
> Manche zwingen aber. Und zwar
> sich selbst zur Missionierung anderer. Das nervt!!

Aber woher denn... Zwingen können nur echte Tatsachen, wie es die 
effiziente, zeit-und codesparende Asm Programmierung eine ist. Daher 
sehe ich mich auch nicht mit irgendeinem Glauben hausieren. Weißt Du was 
mich nervt? Wenn künstliche Verkomplizierung einfacher Sachverhalte 
inklusive real verschlechterter Code- Effizienz als unbedingter 
Fortschritt verkauft wird.

von Moby (Gast)


Lesenswert?

TriHexagon schrieb:
> Als nächstes erzählst du uns, dass du keinen Führerschein hast, weil der
> Straßenverkehr viel zu komplex ist

Man hat, was man braucht. Nicht mehr. Nicht weniger. Wer am 
Straßenverkehr teilnehmen will braucht einen Führerschein.

Cyblord ---- schrieb:
> Und für den Hobbybereich reicht es sich nicht mehr als 100m vom Haus zu
> entfernen.

Unfug. Wenn ich weiter wegwill brauch ich ein Verkehrsmittel und ich 
werde dessen Notwendigkeit auch nicht in Abrede stellen ;-)

Lothar Miller schrieb:
> Und weil man sowieso nur zu Fuss die kürzeren und "schnelleren"
> Wege gehen kann...

Hey da ist was dran! Gerade im Verkehrsstau (...hochkomplexer OOP 
Lösungen :-)

von (prx) A. K. (prx)


Lesenswert?

Moby schrieb:
> Wer am Straßenverkehr teilnehmen will braucht einen Führerschein.

Nö.

von Cyblord -. (cyblord)


Lesenswert?

Moby schrieb:
> Cyblord ---- schrieb:
>> Ich schlage vor, Moby zeigt uns mal sein komplexestes Projekt.
>
> Ich schlage vor, zeig Du erst mal irgendwas ;-)

Schade wenn man nur ne dicke Fresse hat gell Moby ;-) Immerhin sieht das 
jetzt auch jeder.

Ich habe in der Artikelsammlung z.B. ein C-Projekt eines M-Link 
Telemetrie Variosensors vorgestellt. Mit allem Code. Du darfst gerne 
Beweisen dass du dieselbe Funktionalität mit wenig dutzend Opcodes in 
ASM hin bekommst.


> Ich bin mir gar nicht mal sicher, ob Du das so schnell herausfindest ;-)
Wie kommst du denn darauf? Ich kann sehr wohl ASM und habe früher schon 
einiges damit programmiert.
Aber wo nichts ist, kann man nichts herausfinden gelle?

> Unfug. Wenn ich weiter wegwill brauch ich ein Verkehrsmittel und ich
> werde dessen Notwendigkeit auch nicht in Abrede stellen ;-)

Ach auf einmal? Das könnte man ja fast so interpretieren dass für 
komplexere Projekte doch C die bessere Wahl ist. Das sagen dir hier aber 
doch alle die ganze Zeit. Sehr gut.

: Bearbeitet durch User
von Moby (Gast)


Lesenswert?

Cyblord ---- schrieb:
> Ich habe in der Artikelsammlung z.B. ein C-Projekt eines M-Link
> Telemetrie Variosensors vorgestellt. Mit allem Code. Du darfst gerne
> Beweisen dass du dieselbe Funktionalität mit wenig dutzend Opcodes in
> ASM hin bekommst.

Läuft es jetzt wieder auf "und meiner ist größer als deiner" hinaus? 
Sorry Cyblord, diese Mentalität ist mir fremd. Auch webn ich Deine 
pointierte  Beiträge sonst sehr schätze...

> Aber wo nichts ist, kann man nichts herausfinden gelle?

Mein kleines Beispiel weiter oben hast Du natürlich geflissentlich 
übersehen ;-)

> Das könnte man ja fast so interpretieren dass für
> komplexere Projekte doch C die bessere Wahl ist. Das sagen dir hier aber
> doch alle die ganze Zeit. Sehr gut.

Das bestreitet glaub ich niemand. Die Frage ist doch, wo beginnt 
Komplexeres?

von Karl H. (kbuchegg)


Lesenswert?

c-hater schrieb:
> Bastler schrieb:
>
>> Thema war Interrupt-Latenz in C!
>
> Nunja, dabei hat sich ja bereits vor gefühlten 3000 Postings
> herausgestellt, daß die Möglichkeiten von C im, darauf positiven Einfluß
> zu nehmen, doch arg begrenzt sind

Es hat sich heraus gestellt dass er gefälligst mal seine ISR zeigen 
sollte, damit man mal sieht, woher eigentlich seine Push/Pop Orgien 
kommen.

> weil sie schlicht nichts bearbeitet, was wirklich schnell erfolgen muß,
> irgendwas dazu beitragen könnte, eben solche zu lösen...

Das spielt auf mich an. Von Mobb kam doch die Aussage: was soll ich mich 
mit C rumquälen, ich leg einfach jede Variable in ein Register und gut 
ists. Bei simplen Programmen langt das ja auch. Wirds aber komplexer 
kommt er um Register-Belegunsschemata nicht rum - und damit auch um sehr 
wahrscheinlich nicht um ein paar Push und Pop in einer ISR.

Wenn man natürlich nichts komplexeres macht, als mit 2 Taster 3 LED zu 
schalten, dann ist klar, dass das in Assembler kein Problem ist.

von Cyblord -. (cyblord)


Lesenswert?

Moby schrieb:

>
> Das bestreitet glaub ich niemand.
Doch eigentlich tust DU das die ganze Zeit.

> Die Frage ist doch, wo beginnt
> Komplexeres?

Na z.B. bei einem Telemetriesensor, einer Heizungssteurung, eines 
Kommunikationsstacks. Praktisch bei so ziemlich jeder sinnvollen 
Anwendung die über dein Blinkprogramm hinaus geht.

Du hast jetzt also ernsthaft jeden C Thread mit deinem nervenden ASM 
Scheiß zerlabert, nur weil du für deine trivialen Blinkprogramme kein C 
brauchst? Ernsthaft? Das war deine Aussage? WOW.

von Moby (Gast)


Lesenswert?

Karl Heinz schrieb:
> Von Moby kam doch die Aussage: was soll ich mich
> mit C rumquälen, ich leg einfach jede Variable in ein Register und gut
> ists.

Das hast Du mir jetzt in den Mund gelegt. Natürlich kann man nicht alle 
Variablen in Registern vorhalten. In Asm aber meist die C-typischen 
Push/Pop Orgien vermeiden!

> Wenn man natürlich nichts komplexeres macht, als mit 2 Taster 3 LED zu
> schalten, dann ist klar, dass das in Assembler kein Problem ist.

Was soll diese Hrrablassung, Karl Heinz. Ich denk mal das weißt Du 
besser ;-(

von Cyblord -. (cyblord)


Lesenswert?

Also doch nur Troll.

von Karl H. (kbuchegg)


Lesenswert?

Moby schrieb:
> Moby schrieb:
>> Versuch doch mal. Wenns bloß
>> 10 Minuten dauert...
>
> Oder auch nicht ;-)

Soll ich?

OK. Ich geh den Thread noch zu Ende durch, dann setz ich mich ran.

> Natürlich idt es immer einfach, unrealistische Forderungen in den Raum
> zu werfen und bei Nichterfüllung als "Totschlagargument" herzunehmen.

Was ist daran unrealistisch?

> Darauf tippe ich jetzt auch mal.

Interessanterweise hatte ich in dem Programm sogar einen Interrupt. :-)
zum einen läuft die Encoderauswertung drüber, zum anderen gibt es da 
noch eine Zutat, die ich nicht erwähnt hatte: Die Systemuhr läuft 
Interrupt-getrieben vom 230V Netz.

> Die eigentliche Herrausforderung dürfte
> nicht die Registerverwendung sein, sondern die Regelung des
> Temperaturverlaufs dem Hausherren recht zu machen.

Nö. Die stellt sich der Hausherr selber ein. Dazu hat man ja ein LCD 
samt Drehencoder und ein Menüsystem, so dass man täglich auf die Minute 
festlegen kann, wann die Heizung auf welche Temperaturvorgabe gehen 
soll. Und zum Komfort kann man auch noch einstellen, ob diese 
Tageseinstellung für jeden Wochentag extra gelten soll, oder für alle 
Werktage (und Samstag + Sonntag haben ihre jeweils eigenen 
Einstellungen) oder für alle Wochentage gemeinsam. Natürlich alles im 
Eeprom gespeichert. Der Platz im Mega16 ist das schon etwas eng 
geworden. Für einen Web-Server hats nicht mehr gereicht aber für eine 
Fernsteuerung per UART reichte es noch. Muss halt der PC-Server per UART 
das Web-Interface zur Heizung spielen.

Bin in Summe 3 Abende daran gesessen :-)

von Moby (Gast)


Lesenswert?

Cyblord ---- schrieb im Beitrag #4017591
> Na z.B. bei einem Telemetriesensor, einer Heizungssteurung, eines
> Kommunikationsstacks. Praktisch bei so ziemlich jeder sinnvollen
> Anwendung die über dein Blinkprogramm hinaus geht.

Natürlich, natürlich. Praktisch jede Anwendung... Ich verrat Dir 
trotzdem nicht, was ich alles in welcher Menge in Asm progge... Oh Mist, 
von meiner Heizungssteuerung war ja schon in einem anderen Thread die 
Rede ;-(

von Moby (Gast)


Lesenswert?

Karl Heinz schrieb:
> Soll ich?

Dann aber bitteschön eigenständig und nicht nur Peter D's 
Entprellroutine ansteuern ;-)

> Interessanterweise hatte ich in dem Programm sogar einen Interrupt. :-)
> zum einen läuft die Encoderauswertung drüber...

Also Programm doch schon fertig, ist ja unfair. Aber von mir 
verlangen... Ich hätt da auch noch bei so einigen Projekten Arbeit zu 
delegieren ;-)

von Karl H. (kbuchegg)


Lesenswert?

Moby schrieb:
> Karl Heinz schrieb:
>> Soll ich?
>
> Dann aber bitteschön eigenständig und nicht nur Peter D's
> Entprellroutine ansteuern ;-)

Tja. Siehst du.
Das ist eben einer der grossen Vorteile: ich kann Code mehr oder weniger 
fix&fertig aus dem Hut zaubern. Copy&Paste genügt. Ich brauch mich nicht 
mit nicht passenden Registerbelegungen rumärgern, muss mir nicht merken 
welcher Wert beim Funktionsaufruf in welches Register muss, etc.

Soviel zum Thema: Auch Entwicklungszeit kostet was.
Ich hab in einem Projekt wirkich besseres zu tun, als mich um die 150-te 
Tastenentprellung zu kümmern. So spannend ist das Thema dann auch wieder 
nicht. Die Zeit steck ich lieber in eine ordentliche Menüführung.
Du schreibst ja auch nicht in jedem Projekt die 16*16 Bit Multiplikation 
neu. Oder ?

Und ich denke, du glaubst mir auch so, dass ein
1
  ...
2
3
  while( 1 ) {
4
5
    if( get_keystate( 1 << KEY_0 ) )
6
      LED_PORT |= ( 1 << LED1 );
7
    else
8
      LED_PORT &= ~( 1 << LED1 );
9
10
    if( get_keypress( 1 << KEY_2 ) )
11
      LED_PORT != ( 1 << LED2 );
12
13
    ...
14
  }
nicht wirklich das große Problem ist. Auch wenn ich das jetzt nicht noch 
mit den Entprellroutinen aus dem Fundus lauffähig pimpe :-) Und 
komplexer wirds nicht.

> Also Programm doch schon fertig, ist ja unfair. Aber von mir
> verlangen...

Ach komm. Das war aber sowas von klar, dass du da nichts machen würdest. 
Da sitzt du nämlich ein paar Wochen drann, bis du die ganzen 
Registerfehler aus der Datenverwaltung raus hast. Denkst du echt, ich 
hätte noch nie was in Assembler programmiert? Da täuscht du dich. Ich 
hab schon genug gemacht und ich kenn auch all die kleinen Fallen und 
Probleme die unweigerlich mit wachsender Komplexität entstehen. Mal 
vergisst man dort einen Pop und zerschiesst sich den Stack, mal ist das 
Flag im Statusregister, das eine halbe Stunde vorher noch das Ergebnis 
des Vergleichs beinhaltet hat zerschossen, weil man unbedacht 1, 2 
Befehle dazwischen geschoben hat. Dann braucht man mal schnell ein 
Hilfsregister für eine kurze Zwischenrechnung und vergisst, dass da noch 
ein Ergebnis drinnen steht, das 30 Anweisungen später eigentlich noch 
gebraucht würde. etc. etc. Been there, done that. Gerade wenn die 
Entwicklungszeiten länger werden, sind es genau diese Details, die man 
alle im Kopf haben müsste und doch nach ein paar Tagen nicht mehr hat.

Die meisten guten C-Programmierer hier können meistens auch ziemlich gut 
Assembler programmieren. Das scheinst du gerne zu vergessen.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Im übrigen hatte ich grade einen Versuch gemacht.

Das allererste AVR Programm, dass ich je gesehen habe, war dieses hier
Beitrag "AVR-Lauflicht"

Kann mich noch gut erinnern, wie ich das analysiert habe. Von AVR hatte 
ich keine Ahnung, PWM kannte ich nur vom hörensagen. War eine spannende 
Sache rauszukriegen, wie der Überblendeffekt zustande kommt.

Ich hab das vorhin mal nach C übersetzt, weil es mich interessiert hat, 
was der Compiler draus macht.
1
#include <avr/io.h>
2
3
#define DELAY  150
4
5
int main(void)
6
{
7
  uint8_t thisLed = ~( 1 << PB0 );
8
  uint8_t nextLed = ~( 1 << PB1 );
9
  uint8_t innerCounter = 0;
10
  uint8_t outerCounter = 0;
11
12
  DDRB = ( 1 << PB0 ) | ( 1 << PB1 ) | ( 1 << PB2 ) | ( 1 << PB3 ) | ( 1 << PB4 );
13
14
  while(1)
15
  {
16
    innerCounter++;
17
    if( innerCounter == DELAY ) {
18
      innerCounter = 0;
19
      outerCounter++;
20
21
      if( outerCounter == DELAY ) {
22
        outerCounter = 0;
23
        thisLed = nextLed;
24
        nextLed = ( nextLed << 1 ) | 0x01;
25
        if( !( nextLed & ( 1 << PB5 ) ) )
26
          nextLed = ~( 1 << PB0 );
27
        nextLed &= ( 1 << PB0 ) | ( 1 << PB1 ) | ( 1 << PB2 ) | ( 1 << PB3 ) | ( 1 << PB4 );
28
      }
29
    }
30
31
    if( innerCounter > outerCounter )
32
      PORTB = thisLed;
33
    else
34
      PORTB = nextLed;
35
  }
36
}

Wenn ich mal das übliche Vorgeplänkel weg lasse, wo die Interrupt Vektor 
Tabelle aufgesetzt wird und die Data bzw. BSS Sektion initialisiert wird 
(ok, das könnte man dem Ding vorwerfen: der Initialisiercode ist im 
Programm drinnen, obwohl es nichts zu initialisieren gibt), dann bleibt 
das hier übrig
1
  48:  8f e1         ldi  r24, 0x1F  ; 31
2
  4a:  87 bb         out  0x17, r24  ; 23
3
  4c:  90 e0         ldi  r25, 0x00  ; 0
4
  4e:  80 e0         ldi  r24, 0x00  ; 0
5
  50:  2d ef         ldi  r18, 0xFD  ; 253
6
  52:  3e ef         ldi  r19, 0xFE  ; 254
7
  54:  40 e0         ldi  r20, 0x00  ; 0
8
  56:  5e ef         ldi  r21, 0xFE  ; 254
9
  58:  8f 5f         subi  r24, 0xFF  ; 255
10
  5a:  86 39         cpi  r24, 0x96  ; 150
11
  5c:  69 f4         brne  .+26       ; 0x78 <main+0x30>
12
  5e:  9f 5f         subi  r25, 0xFF  ; 255
13
  60:  96 39         cpi  r25, 0x96  ; 150
14
  62:  81 f4         brne  .+32       ; 0x84 <main+0x3c>
15
  64:  82 2f         mov  r24, r18
16
  66:  88 0f         add  r24, r24
17
  68:  81 60         ori  r24, 0x01  ; 1
18
  6a:  85 ff         sbrs  r24, 5
19
  6c:  85 2f         mov  r24, r21
20
  6e:  32 2f         mov  r19, r18
21
  70:  28 2f         mov  r18, r24
22
  72:  2f 71         andi  r18, 0x1F  ; 31
23
  74:  94 2f         mov  r25, r20
24
  76:  06 c0         rjmp  .+12       ; 0x84 <main+0x3c>
25
  78:  98 17         cp  r25, r24
26
  7a:  10 f4         brcc  .+4        ; 0x80 <main+0x38>
27
  7c:  38 bb         out  0x18, r19  ; 24
28
  7e:  ec cf         rjmp  .-40       ; 0x58 <main+0x10>
29
  80:  28 bb         out  0x18, r18  ; 24
30
  82:  ea cf         rjmp  .-44       ; 0x58 <main+0x10>
31
  84:  84 2f         mov  r24, r20
32
  86:  fc cf         rjmp  .-8        ; 0x80 <main+0x38>

und ich finde: da kann man nicht meckern. Das schenkt sich nicht viel, 
auch wenn mir da jetzt ein paar dubiose Sequenzen auffallen, die man 
besser schreiben könnte. Aber was solls. Schnell genug ist das Teil auf 
jeden Fall und ob ich jetzt den DELAY auf 150 oder auf 149 setze um eine 
mir genehme Umlaufgeschwindigkeit zu kriegen ist sowas von egal.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Ich habe bei einer Heizungssteuerung (sic) mal eine abgesetzte Station 
in Assembler programmiert. Also
- RS485 Slave per Interrupt
- Text-LCD Ausgabe
- DS18B20/S20, Umrechnung 1/16 in 1/10 Grad
- Schalterabfrage (PeDa Version)
- Abfrage einer DCF77 Uhr

Summe ~1300 Bytes Code, Tiny2313. Im RAM landeten nur Callstack und 
UART-Puffer. Alle Variablen passten in Register, ein paar waren noch 
frei. In dieser Dimension geht das mit AVR recht gut und flüssig, d.h. 
so lange die Register ausreichen. Bis auf die Temperaturumrechnung ist 
das auch nahezu reiner 8-Bit Code, entsprechend übersichtlich.

Die Verwendung von Assembler war Vorsatz, ich wollte es so. In C wärs 
vielleicht klüger, keinen 2313 zu nehmen, wird sonst vmtl. knapp. Die 
Zentrale war in C/C++ geschrieben, mit RTOS-Kernel in einem Mega32.

: Bearbeitet durch User
von Moby (Gast)


Lesenswert?

Karl Heinz schrieb:
> Das ist eben einer der grossen Vorteile: ich kann Code mehr oder weniger
> fix&fertig aus dem Hut zaubern.

Und Du meinst, ich nicht? Nun gehört auch eine Entprellung beliebig 
ausgewählter Portpins dazu, samt Gerüst für Press/Release Routinen und 
Drückzeit ;-)
Denn eins ist wohl klar : Die einzelne Asm-Lösung an sich gewinnt in 
punkto Entwicklungszeit meist keinen Blumentopf. Den gewinnt sie erst im 
Paket mit allerlei Standard Routinen in der Hinterhand, die man über die 
Jahre aufbaut.

> hab schon genug gemacht und ich kenn auch all die kleinen Fallen und
> Probleme die unweigerlich mit wachsender Komplexität entstehen. Mal
> vergisst man dort einen Pop und zerschiesst sich den Stack, mal ist das
> Flag im Statusregister, das eine halbe Stunde vorher noch das Ergebnis
> des Vergleichs beinhaltet hat zerschossen, weil man unbedacht 1, 2
> Befehle ...

Das möchte ich auch nicht bezweifeln. Meine Erfahrung über die Jahre ist 
aber die: Mit einem gesunden Fundus an Hardware-Ansteuerungs-, 
Zahlen/String Umwandlungs- und allerhand weiterer nützlicher Routinen, 
zweitens einer ausgereiften Softwaresystematik und drittens schließlich 
dem Beharrenkönnen bei einer immer besser beherrschten Architektur 
schließt Asm zumindest bei nicht allzu komplizierten Problemstellungen 
in jeder Hinsicht zur Hochsprache auf- unter Beibehaltung der 
Asm-typischen Vorteile versteht sich.

von (prx) A. K. (prx)


Lesenswert?

Moby schrieb:
> Mit einem gesunden Fundus an Hardware-Ansteuerungs-,
> Zahlen/String Umwandlungs- und allerhand weiterer nützlicher Routinen,

Yep. Und da finde ich es ganz nett, die praktisch gleichen Routinen auf 
AVR und ARM native/thumb verwenden zu können, wie ein leichtes printf, 
DS18x20, Text-LCD usw.

: Bearbeitet durch User
von Moby (Gast)


Lesenswert?

A. K. schrieb:
> Ich habe bei einer Heizungssteuerung (sic) mal eine abgesetzte
> Station in Assembler programmiert.

Kann ja gar nicht sein... Behauptet zumindest Cyblord ;-)

von Karl H. (kbuchegg)


Lesenswert?

Moby schrieb:
> Karl Heinz schrieb:
>> Das ist eben einer der grossen Vorteile: ich kann Code mehr oder weniger
>> fix&fertig aus dem Hut zaubern.
>
> Und Du meinst, ich nicht? Nun gehört auch eine Entprellung beliebig
> ausgewählter Portpins dazu, samt Gerüst für Press/Release Routinen und
> Drückzeit ;-)
> Denn eins ist wohl klar : Die einzelne Asm-Lösung an sich gewinnt in
> punkto Entwicklungszeit meist keinen Blumentopf. Den gewinnt sie erst im
> Paket mit allerlei Standard Routinen in der Hinterhand, die man über die
> Jahre aufbaut.

Keine Frage.
Bleibt aber immer noch das Problem, dass du die Routinen nicht einfach 
so copy&paste übernehmen kannst. Denn normalerweise passen die 
Registerbelegungen der einzelnen Funktionsgruppen dann eben doch nicht 
zusammen :-)

Du kannst mir aber gerne zb ein Menüsystem zeigen, dass mehrstufige 
Menühierarchien verwalten kann, Werte anzeigen und ändern. Kannst dazu 
gerne auch deine Tastenroutinen und LCD Funktionen benutzen.
(Ok, ich gebs zu. Ich such mir natürlich Dinge raus, von denen ich 
ausgehen kann, dass du nie und nimmer mit den Registern auskommen wirst 
und entweder SRAM oder Flash mit einbeziehen musst. Womit dann das Thema 
Datenstrukturen schlagend wird, was in Assembler dann schon ein wenig 
Umsicht erfordert)

> schließt Asm zumindest bei nicht allzu komplizierten Problemstellungen
> in jeder Hinsicht zur Hochsprache auf- unter Beibehaltung der
> Asm-typischen Vorteile versteht sich.

Tja. und genau da liegt das Problem. In der überwiegenden Mehrheit der 
Fälle braucht man eben nicht auch noch den letzten Taktzyklus aus dem 
Programm rausholen. Womit sich der Vorteil dann recht schnell eher in 
Luft auflöst. Denn wenn du mal ehrlich bist: Ob in deinem Tastenbeispiel 
die ISR 10 Takte länger braucht oder nicht, ist Jacke wie Hose.

: Bearbeitet durch User
von Moby (Gast)


Lesenswert?

Karl Heinz schrieb:
> Bleibt aber immer noch das Problem, dass du die Routinen nicht einfach
> so copy&paste übernehmen kannst. Denn normalerweise passen die
> Registerbelegungen der einzelnen Funktionsgruppen dann eben doch nicht
> zusammen :-)

Nicht immer, aber oft. Das gehört zum Punkt Softwaresystematik. Die 
Datenübergabe findet aber auch "standardisiert" über fixe Puffer statt. 
Puffer, aus denen sich weitgehend unabhängige Bausteine in einem 
Timerinterrupt dann bedienen (UART/TWI/Displayausgaben z.B.)

> Du kannst mir aber gerne zb ein Menüsystem zeigen, dass mehrstufige
> Menühierarchien verwalten kann...

Nein, das kann ich nicht weil schlichtweg bislang keine
Notwendigkeit bestand. Ich mags lieber dezentral, nicht tausend 
Funktionen unter einem Dach. Dazu langte mir bislang auch ein einfaches, 
scrollendes Menü auf einem 16x2 Display. Aktueller ist freilich ein 
schönes Webinterface- oder Bedienlösungen auf PC Basis.

> Tja. und genau da liegt das Problem. In der überwiegenden Mehrheit der
> Fälle braucht man eben nicht auch noch den letzten Taktzyklus aus dem
> Programm rausholen. Womit sich der Vorteil dann ...

Problem? Entweder braucht man es bei zeitkritischen Vorgängen 
(Threadthema!) wirklich oder man nimmt den Vorteil so mit und

von Karl H. (kbuchegg)


Lesenswert?

Können wir uns einfach darauf einigen, in Zukunft die bissigen 
Zwischenrufe in C-Threads zu unterlassen, die nichts zum jeweiligen 
Thema beitragen? Dann wäre schon viel erreicht. Wir alle sind es euch 
doch vergönnt, wenn ihr Spass daran habt, eine halbe Stunde lang 
auszuknobeln, wo man in 20 Anweisungen noch 2 Taktzyklen finden kann, 
die niemand wirklich vermisst.

Ich versprech auch hoch und heilig, ich werde in Assembler Threads nie 
die Aussage fallen lassen, dass man das in C in einem Viertel der Zeit 
schon längst fertig hätte.

von Moby (Gast)


Lesenswert?

... bekommt nicht so schnell ein Platzproblem.

von Moby (Gast)


Lesenswert?

Karl Heinz schrieb:
> Können wir uns einfach darauf einigen, in Zukunft die bissigen
> Zwischenrufe in C-Threads zu unterlassen, die nichts zum jeweiligen

Ich will guten Willen demonstrieren, wenn nicht gerade das Blaue vom 
Himmel an den Haaren herbei gezogen wird ;-)

> Wir alle sind es euch
> doch vergönnt, wenn ihr Spass daran habt, eine halbe Stunde lang
> auszuknobeln, wo man in 20 Anweisungen noch 2 Taktzyklen finden kann,
> die niemand wirklich vermisst.

Das ist aber schön, Karl Heinz.
Nur war das gar nicht das Thema.

> Ich versprech auch hoch und heilig, ich werde in Assembler Threads nie
> die Aussage fallen lassen, dass man das in C in einem Viertel der Zeit
> schon längst fertig hätte.

Das kann dort gerne jedermann behaupten und ich werde mir wieder die 
Zeit nehmen, mich damit auseinanderzusetzen.

von Ingo (Gast)


Lesenswert?

Ich würde vorschlagen man einigt sich nun endlich mal auf eine 
Aufgabenstellung, die man auch Au nem Steckbrett aufbauen kann und dann 
mal los: ASM vs. C, wobei die Anforderung natürlich Funktion, 
Wartbarkeit und Codegrösse bzw. Geschwindigkeit ist. Dann ist ein für 
alle mal Ruhe.

Anschließend macht man einen Artikel davon.

von m.n. (Gast)


Lesenswert?

A. K. schrieb:
> Die Verwendung von Assembler war Vorsatz, ich wollte es so. In C wärs
> vielleicht klüger, keinen 2313 zu nehmen, wird sonst vmtl. knapp.

So ist es heutzutage. Seinerzeit gab es den AT90S2313, wo mit C nicht 
viel auszurichten war bei 2k Flash, die aber auch recht übersichtlich in 
Assembler programmiert werden konnten. Gut, mit Kleckern ist es heute 
vorbei.

Was mich speziell an der ISRs beim AVR in C stört, ist das elende 
'Gepusche' der Register. Die Ursache dafür ist oben schon erwähnt.
Beispiel: eine Timer-ISR, die alle 10 ms aufgerufen wird und völlig 
zeitunkritisch ist, kann man ja ruhig etwas umfangreicher gestalten. Nur 
für die ersten Mikrosekunden nach Aufruf der ISR sind alle weiteren ISRs 
gesperrt. Das Timerflag wird mit Aufruf der ISR automatisch gelöscht, 
sodaß als erster Befehl gleich ein 'sei' stehen könnte, um die Priorität 
herabzusetzen. (Ich darf das!)

In C geht das so nicht, wodurch man zwangsläufig per Assembler zumindest 
den ISR-Kopf anpassen muß.

Karl Heinz schrieb:
> Gut.
> Dann sind das 2 Beispiele.
> Sonst noch was?

Noch eins: PWM per Software, die (auch mehrkanalig) mit hoher Taktrate 
arbeiten muß.
Im Übrigen sind viele Teile einer C-Bibliothek ebenfalls in Assembler 
geschrieben, selbst die Grundrechenarten bei float. Jeder Takt der hier 
eingespart werden kann, zahlt sich in höherer Geschwindigkeit eines 
C-Programmes aus.

von Bastler (Gast)


Lesenswert?

> in C geht das nicht...
Dann würd ich mich mal informieren, was in C auf dem AVR so alles geht. 
Hier ist ein guter Ort dafür, denn hier gibt es die, die diese 
"Programm-Schnipsel-Sammlung" für uns alle gebaut haben.

von (prx) A. K. (prx)


Lesenswert?

m.n. schrieb:
> Was mich speziell an der ISRs beim AVR in C stört, ist das elende
> 'Gepusche' der Register. Die Ursache dafür ist oben schon erwähnt.
> Beispiel: eine Timer-ISR, die alle 10 ms aufgerufen wird

Ich sehe das entspannter. Im in C/C++ programmierten Zentralsystem, 
einem Mega32/16Mhz, läuft der RTOS-Timer mit 10kHz, wird also alle 100µs 
aufgerufen. Daraus können manche Delays von 1-Wire Protokoll per RTOS 
abgewickelt werden, statt Warteschleifen. Klar, bei dieser 
Interrupt-Rate geht spürbar Rechenzeit drauf. Ist aber genug davon 
vorhanden.

von Bastler (Gast)


Lesenswert?

> Teile der C-Bibliothek sind in ASM geschrieben...
Noch besser: der Compiler erzeugt auch ASM-Code und danach wird sogar 
ein Assembler benutzt, damit die Maschine den auch ausführen kann.
Hat eigentlich schon mal jemand den Atmel Schrieb zum Thema "wie habe 
wir den AVR so entworfen, daß ein C-Compiler leichtes Spiel hat. Das ist 
kein 51er, wo C entweder 1:1 ASM ist, Nürnberger Schreibweise, oder 
Berge von Befehlen notwendig sind um Einfachstes zu machen. Und selbst 
da machen das viele mit C.

von (prx) A. K. (prx)


Lesenswert?

m.n. schrieb:
> So ist es heutzutage. Seinerzeit gab es den AT90S2313, wo mit C nicht
> viel auszurichten war bei 2k Flash

Würde ich jetzt nicht behaupten. Hab grad einem RasPi einen I2C-Slave 
verpasst. Da der das nicht selbst kann ergab das einen Tiny841 als 
I2C-Slave, der dieses I2C in UART-Kommunikation mit dem RasPi umsetzt. 
800 Bytes Code, in normalem C.

Allerdings ist ein I2C-Slave tatsächlich genau so eine Stelle, wo 
Assembler relevant werden kann. Wenn man das umdrehen muss, d.h. der 
RasPi als I2C-Master mit einem AVR als I2C-Slave reden soll. Dank des 
clock stretching Bugs des RasPi wirds bei 100kHz I2C-Takt in C verdammt 
eng im Interrupt. Da kommt es wirklich auf die µs an.

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

A. K. schrieb:
> Ich sehe das entspannter.

Ich verstehe, Du kommst aus dem südwestdeutschen Raum ;-)
Im Allgemeinen kann man das auch entspannt sehen, aber sobald die UART 
noch mit 115 kBd und weitere INTs dazukommen, kann es eng werden.

A. K. schrieb:
> Da der das nicht selbst kann, gab das einen Tiny841

Na ja, mit 8 kB Flash in der Hinterhand, kann man 'mutig' sein. Ob es 
dann 800 Byte oder 2 kB werden, läßt einen völlig kalt.

von (prx) A. K. (prx)


Lesenswert?

m.n. schrieb:
> Ich verstehe, Du kommst aus dem südwestdeutschen Raum ;-)

Sind die Restdeutschen alle verkrampfter? ;-)

> Im Allgemeinen kann man das auch entspannt sehen, aber sobald die UART
> noch mit 115 kBd und weitere INTs dazukommen, kann es eng werden.

Ok, die läuft mit 38400. 115200 wären aber wohl auch kein Problem, sind 
da nur nicht nötig.

> Na ja, mit 8 kB Flash in der Hinterhand, kann man 'mutig' sein. Ob es
> dann 800 Byte oder 2 kB werden, läßt einen völlig kalt.

Dessen UART allerdings läuft mit 115200. Bei 7.37MHz.

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

A. K. schrieb:
> Dank des
> clock stretching Bugs des RasPi wirds bei 100kHz I2C-Takt in C verdammt
> eng im Interrupt. Da kommt es wirklich auf die µs an.

Wo Du das so schreibst, fällt mir noch eine Anwendung ein.
Als der SAA1101 (video sync generator) nicht mehr lieferbar war, 
brauchte ich einen Ersatz. Ein ATtin2313 - schön in Assembler 
programmiert - war die Lösung. Der mußte auf 67 ns genau arbeiten ;-)

A. K. schrieb:
> m.n. schrieb:
>> Ich verstehe, Du kommst aus dem südwestdeutschen Raum ;-)
>
> Sind die Restdeutschen alle verkrampfter? ;-)

Nicht unbedingt. Aber wenn ich mit Hamburg telefoniere, dauert das 
Gespräch 2 Minuten. Mit Karlsruhe und dem gleichen Thema >= 20 Minuten 
;-)

von Ingo (Gast)


Lesenswert?

Ingo schrieb:
> Ich würde vorschlagen man einigt sich nun endlich mal auf eine
> Aufgabenstellung, die man auch Au nem Steckbrett aufbauen kann und dann
> mal los: ASM vs. C, wobei die Anforderung natürlich Funktion,
> Wartbarkeit und Codegrösse bzw. Geschwindigkeit ist. Dann ist ein für
> alle mal Ruhe.
Ich schlage vor, einen LED Bargraph, der je nach Spannung an einem 
ADC-Pin den Bargraph steuert. Mit der Option, per Jumper, einen 
gefüllten Bargraph oder einfach nur das oberste der angesteuerten LEDs 
auszuwählen.

Die ADC-Werte werden per Poti vorgegeben. Die ADC-Werte werden über 
einen gleitenden Mittelwert von 2^n gemittelt. Samplefrequenz 1kHz. 
Controller wäre noch zu definieren (Mega88?).

Das kann jeder auf nem Breadboard aufbauen und ist mit standard 
Bauteilen zu schaffen die jeder in der Bastelkiste hat ;).

Wie wär's?

Zusammenfassend:
- LED Bargraph an PortD
- Analogwert an PC5 oder ähnlich
- Aref = VCC
- Interner OSC
- Modusjumper an PC0
- Atmega88

von Ingo (Gast)


Lesenswert?

Is wohl zu anspruchsvoll ;)


SCNR

von Moby (Gast)


Lesenswert?

Ingo schrieb:
> Is wohl zu anspruchsvoll ;)

Ganz und gar nicht. Den Level könnte/sollte man eher noch steigern.
Das Problem ist nur: Wer opfert schon seine Zeit dafür? Für eine 
spezielle Lösung die man nicht braucht? Sinnvoller ist doch da etwas, 
was jeder verwenden kann. Ein konkretes Beispiel hab ich weiter oben 
geliefert.

von Ingo (Gast)


Lesenswert?

n Bargraph kann man immer mal gebrauchen :P

von c-hater (Gast)


Lesenswert?

Karl Heinz schrieb:

> Die meisten guten C-Programmierer hier können meistens auch ziemlich gut
> Assembler programmieren.

Da gebe ich dir erstmal zu 100% Recht.

Du vergisst allerdings, die Gründe für diesen offensichtlichen Fakt zu 
erwähnen. Sehr wahrscheinlich vergißt du das genau deshalb, weil die ein 
völlig anderes Licht auf diesen Sachverhalt werfen würden...

von c-hater (Gast)


Lesenswert?

Karl Heinz schrieb:

> Ich such mir natürlich Dinge raus, von denen ich
> ausgehen kann, dass du nie und nimmer mit den Registern auskommen wirst
> und entweder SRAM oder Flash mit einbeziehen musst. Womit dann das Thema
> Datenstrukturen schlagend wird, was in Assembler dann schon ein wenig
> Umsicht erfordert)

Ach watt, kaum mehr als in C. Für Datenstrukturen schreibt man sich 
einmal ein paar Makros und kann die dann praktisch genauso deklarieren 
wie du in C deine structs deklarierst.

Es sieht dann im Endeffekt zwar eher wie eine Pascal-Record-Deklaration 
aus, hat aber leider aus denselben technischen Gründen wie bei C (als 
Bastard eines Macroassemblers) diese unlogisch verkehrte Reihenfolge von 
Typ und Bezeichner...

von c-hater (Gast)


Lesenswert?

Karl Heinz schrieb:

> Ich versprech auch hoch und heilig, ich werde in Assembler Threads nie
> die Aussage fallen lassen, dass man das in C in einem Viertel der Zeit
> schon längst fertig hätte.

...oder auch überhaupt keine Chance hat, das Problem zu lösen.

Allein die Existenz von Unmassen von Asm-Code in vielen (eigentlich fast 
allen) AVR-C-Programmen zeigt doch absolut überzeugend, daß Asm oft 
zwingend NÖTIG ist, um C auf die Beine zu helfen.

Freiwillig tut sich doch kaum ein C-ler Asm an. Wenn sie es doch tun, 
kann es nur einen Grund dafür geben: Es ist einfach NÖTIG.

Umgekehrt habe ich noch nie erlebt, daß ein Asm-Programm auf C 
ausweichen müßte, um ein konkretes Problem lösbar zu machen...

Ihr C-ler habt es doch angeblich so mit der Logik? Also wie würdest du 
denn diese nicht wegzudiskutierenden Tatsachen werten, ohne dich in die 
Abgründe logischer Widersprüche zu verstricken?

von (prx) A. K. (prx)


Lesenswert?

c-hater schrieb:
> Freiwillig tut sich doch kaum ein C-ler Asm an. Wenn sie es doch tun,
> kann es nur einen Grund dafür geben: Es ist einfach NÖTIG.

Das ist doch einfach nur noch Getrolle. Provokation, damit endlich die 
Schimpfworte fiegen.

Ich hatte oben von einem Projekt berichtet, in dem ich bewusst beides 
verwendete. Und zwar nicht weil es nötig war. Da hätte statt des 
Tiny2313 auch ein Mega8 reingepasst. Nur war das mein erstes Projekt mit 
µCs und da wollte ich einfach mal beide Varianten drin haben, also 
einmal Assembler, und einmal das übliche C/C++ (plus simples RTOS, auch 
das war nicht zwingend) mit den für mich neuen AVRs.

Hatte schon genug mit Assembler zu tun, und den unterschiedlichsten 
Maschinen. Und hatte mir in einem früheren Projekt eigens einen simplen 
Compiler gebaut, um dem Programm mehr Struktur und bessere Lesbarkeit 
beizubringen. Aber dicht genug am Assembler dran, um die Z80 nicht zu 
überfordern, zumal es damals keine brauchbaren C Compiler dafür gab.

Natürlich gibt es Anwendungen, in denen Assembler sinnvoll ist. Und es 
kann auch sehr sinnvoll sein, C Code mit einzelnen Assembler-Stücken 
anzureichern, beispielsweise zur Unterstützung bestimmter Befehle. GCCs 
Methode dazu ist zwar nicht trivial, aber ungemein leistungsfähig, weil 
sie sich nahtlos ins C integriert. Eine solche nahtlose Integration von 
Assembler-Befehlen in ein C Programm hatte ich selber mal in einem C 
Compiler implementiert - und entsprechend genutzt.

Nur: Warum muss man da eine Religion draus machen und alle Leute 
beschimpfen, die anders handeln als man selbst? Rübe ab, wie ISIS? 
Manche sind eben nicht so religiös, sondern pragmatisch oder auch mal 
neugierig.

: Bearbeitet durch User
von F. F. (foldi)


Lesenswert?

Karl Heinz schrieb:
> Keine Frage.
> Bleibt aber immer noch das Problem, dass du die Routinen nicht einfach
> so copy&paste übernehmen kannst. Denn normalerweise passen die
> Registerbelegungen der einzelnen Funktionsgruppen dann eben doch nicht
> zusammen :-)

Ich habe noch nicht eine Zeile Assembler von Moby gesehen, geschweige 
denn einen ganzen Code Block. ^^

von Moby (Gast)


Lesenswert?

A. K. schrieb:
> Manche sind eben nicht so religiös, sondern pragmatisch oder auch mal
> neugierig.

Ja, die pragmatische Problemlösung sollte schon Vorrang haben.
Der konkrete Mensch sollte unter konkreten Voraussetzungen mit konkreten 
Anforderungen und konkreten Aufgabenstellungen zunächst mal überhaupt zu 
einem akzeptablen Ergebnis kommen.

Die optimale Lösung ist allerdings keine Religion.
Die gibt es wirklich!


F. Fo schrieb:
> Ich habe noch nicht eine Zeile Assembler von Moby gesehen, geschweige
> denn einen ganzen Code Block.

Jo Foldi, denn musste mal hier a bisserl aufmerksamer sein, nich?
Kleiner Provokateur Du ;-)

von (prx) A. K. (prx)


Lesenswert?

Moby schrieb:
> Die optimale Lösung ist allerdings keine Religion.
> Die gibt es wirklich!

Yep, es gibt sie. Und nicht nur eine. Es gibt mehrere optimale Lösungen, 
weil abhängig von Randbedingungen und Betrachter. Und was einstmals eine 
optimale Lösung war, das kann sich im Laufe der Zeit als Knieschuss 
erweisen (Softwerker können ein Lied davon singen).

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

c-hater schrieb:
> Umgekehrt habe ich noch nie erlebt, daß ein Asm-Programm auf C
> ausweichen müßte, um ein konkretes Problem lösbar zu machen...

Oh doch. Ich portiere gerade meinen alten Bassverstärker Controller auf 
C, weil ich die Schnauze voll habe und das Projekt immer komplexer wird. 
Mit dem Wireless-DMX Szenenkontroller sollte ich das auch machen, habe 
aber im Moment keine Lust.

c-hater schrieb:
> Allein die Existenz von Unmassen von Asm-Code in vielen (eigentlich fast
> allen) AVR-C-Programmen zeigt doch absolut überzeugend, daß Asm oft
> zwingend NÖTIG ist, um C auf die Beine zu helfen.

Nö. Zeig mir eine eine Zeile Assembler in meinem 3-Phasen Umrichter...

C ist einfach besser protierbar, und das hat auch schon Karl Heinz 
gesagt. Ich habe den Grossteil meiner BLDC FOC vom Mega88 auf den 
XMega128/192 und auf STM32 protiert, ohne dafür mehr als ein,zwei Tage 
zu benötigen.

War aber klar, das es wieder mal der übliche FlameWar wird - Kinners, 
der TE hat nun mal in C geschrieben, deswegen ist die ganze ASM 
Diskussion eigentlich völlig unnötig.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

c-hater schrieb:
> Allein die Existenz von Unmassen von Asm-Code in vielen (eigentlich fast
> allen) AVR-C-Programmen zeigt doch absolut überzeugend, daß Asm oft
> zwingend NÖTIG ist, um C auf die Beine zu helfen.

Die Formulierung "in (eigentlich fast allen) AVR-C-Programmen" ist eine 
unangebrachte polemische Übertreibung. Das stimmt so nicht.

Aber: Die Existenz von ASM-Code in diversen AVR-C-Programmen, wo ASM gar 
nicht nötig wäre, zeigt mir eher, wieviele schlechte C-Programmierer 
rumlaufen.

Matthias Sch. schrieb:
> C ist einfach besser protierbar, [...]

Ein einfaches Beispiel: IRMP läuft auf allen ATMegas, vielen 
ATTinys, diversen STM32Fxx, verschiedenen PICs und neuerdings auch auf 
ATXmega.

Moby wäre da mit Assembler aufgeschmissen.

: Bearbeitet durch Moderator
von (prx) A. K. (prx)


Lesenswert?

Frank M. schrieb:
> Die Formulierung "in (eigentlich fast allen) AVR-C-Programmen" ist eine
> unangebrachte polemische Übertreibung. Das stimmt so nicht.

In Mobys Betrachtungsweise schon. Da muss nur ein winzigkleines sei() 
drin sein und er haut dir dein reines C-Programm als 
C/Assembler-Mischung um die Ohren. ;-)

: Bearbeitet durch User
von AVR (Gast)


Lesenswert?

Leute, aus Sicht der Hardware ist Assembler auch nur so eine 
Hochsprache. Die Maschine braucht nur Bit-Muster. Wie die zustande 
kommen, interessiert die nicht.
BTW, es gab auch Zeiten da hab ich in Assembler programmiert. Als 
Compiler, welcher Sprache auch immer, nicht verfügbar/erschwinglich 
waren. Aber als ich eine (Raub-)Kopie von Turbo-Pascal in die Finger 
bekam, war ASM nur noch ein Stiefkind. Und daß man heute C(++) Compiler 
in Qualität eines GCC für "umme" bekommt, und zwar für einige der von 
mir beackerten Maschinen (x86,370,AVR), das ist ein großes Glück. Und 
für einige anderen gibts es SDCC (Z80/8051). Wenn z.B. meine Tochter in 
der Schule 8051-ASM machen darf, dann kann SDCC eine Vorlage liefern 
(nicht weitersagen). Oder für die Firmware der 10€ Cypress-LAs, die auch 
aus C-Code besteht.
Man kann eben Maschinen quälen, oder sich selbst. Ganz nach persönlichem 
Gusto.
Und man kann natürlich immer noch das Ergebnis des GCC als Vorlage für 
optimierten ASM-Code an zeitkritischen Stellen dienen.

von (prx) A. K. (prx)


Lesenswert?

AVR schrieb im Beitrag #4019438:
> mir beackerten Maschinen (x86,370,AVR)

Einschliesslich Pflege steinalter 360/370er Assembler-Programme aus den 
70ern? Muss das ein Spass sein. ;-)

: Bearbeitet durch User
von AVR (Gast)


Lesenswert?

Ja zu Zeiten als man Buchhaltung noch in ASM geschrieben hat ;-)
Aber da gibt es inzwischen (seit 25 Jahren) bessere Sprachen, deren 
Nennung den entsprechenden Hassern die Blutdruck durch die Decken gehen 
liese. Fängt auch mit A an. Ich benutze immer die Sprache die am 
bequemsten ist, unter den gegebenen Umständen: was gibt es, was kostet 
es, macht es mir Spaß (als Umkehr von "kotzt es mich an", z.B. COBOL). 
Als ich auf der /370 (eigentlich war es ja schon eine /390) unterwegs 
war, gab es COBOL oder ASM. Aufgrund der Mächtigkeit der 
370er-Maschinenbefehle war für mich ASM immer das einfachere, also ASM. 
Als ich sah, was der GCC für AVRs erzeugt, war mein Bedarf nach ASM nur 
noch gering.

von Moby (Gast)


Lesenswert?

A. K. schrieb:
> Und was einstmals eine
> optimale Lösung war

... ist es entweder nie gewesen oder diverse Rahmenbedingungen 
(Hardware, neue Anforderungen) haben sich drastisch geändert. Optimal 
ist eine Lösung natürlich, wenn sie, um es wieder auf DAS einfache 
Beispiel zuzuspitzen, etwa das Ein-Schalten eines Verbrauchers A mit sbi 
PORTA,0 angibt. Da gibts nix zu verbessern, nix einzusparen, es ist 
simple, merkfähige Systax. So ginge das fortlaufend auch mit 
2,4,100,10000 Anweisungen. Der Asm-Programmierer wird es in der Regel 
zwar auch nicht 100%ig optimal schaffen, aber er ist da "der Natur nach" 
näher dran. Er kann mit den kleinstmöglichen Codeteilen sparend die 
schnellsten passgenauesten Softwaregebäude für ein Problem bauen. Der 
ASMler muß nicht mit den Beton-Fertigteilen der Hochsprache hantieren, 
ohne die Möglichkeit zu verlieren, selbst solche Fertigteile zu 
konstruieren. Der C-Werker könnte das natürlich bis zu einem gewissen 
Maß unterlaufen, indem er einzelnes in Asm einbaut. Aber zu welchem 
Preis? Zur kombinierten C/Asm-Lösung wären zwei Sprachen und damit ein 
Vielfaches an Sprachelementen zu beherrschen, inklusive der gesteigerten 
Fehlermöglichkeiten. Den ganzen Aufwand sieht der lernende Einsteiger 
ganz besonders- der Profi in den besten Lebensjahren dann 
selbstbewußt-selbsttäuschend natürlich überhaupt nicht, bis seine 
geistigen Fähigkeiten in älteren Jahren dann wieder nachlassen ;-)

Frank M. schrieb:
> Ein einfaches Beispiel: IRMP läuft auf allen ATMegas, vielen
> ATTinys, diversen STM32Fxx, verschiedenen PICs und neuerdings auch auf
> ATXmega.
>
> Moby wäre da mit Assembler aufgeschmissen.

Ja, ein schönes Programm. Eines wo Hochsprache angebracht ist, weil hier 
Portabilität das Primat über Ressourcensparung hat. Du wirst natürlich 
zugeben, daß STM32 und selbst ATXmega dafür reichlich überdimensioniert 
sind- wenns schon ein kleiner Tiny stemmt.

Cyblord ---- schrieb:
> Du hast jetzt also ernsthaft jeden C Thread mit deinem nervenden ASM
> Scheiß zerlabert,

Nein. Aber bei passender Gelegenheit ganz dezent darauf hingewiesen, daß 
dieses oder jenes Problem (siehe nochmal Threadthema!) jetzt in Asm so 
nicht bestünde bzw. einfacher lösbar ist. Daß dieses Salz in die offenen 
Wunden der Hochsprache immer gleich so heftige Gegenreaktionen 
hervorruft ist zwar verständlich, aber doch nicht meine Schuld ;-)

von Cyblord -. (cyblord)


Lesenswert?

Moby schrieb:
> Cyblord ---- schrieb:
>> Du hast jetzt also ernsthaft jeden C Thread mit deinem nervenden ASM
>> Scheiß zerlabert,
>
> Nein. Aber bei passender Gelegenheit ganz dezent darauf hingewiesen, daß
> dieses oder jenes Problem (siehe nochmal Threadthema!) jetzt in Asm so
> nicht bestünde bzw. einfacher lösbar ist.

Ich finde meine Formulierung besser und passender.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Moby schrieb:
> Ja, ein schönes Programm. Eines wo Hochsprache angebracht ist, weil hier
> Portabilität das Primat über Ressourcensparung hat.

Ich bin mir nicht sicher, ob Du das mit Assembler wesentlich 
ressourcensparender hinbekommen würdest. Auch in C kann man durchaus auf 
Ressourcen achtgeben.

> Du wirst natürlich
> zugeben, daß STM32 und selbst ATXmega dafür reichlich überdimensioniert
> sind- wenns schon ein kleiner Tiny stemmt.

Du denkst verkehrt:

IRMP ist nicht dafür gedacht, die Hauptanwendung auf dem µC zu sein. 
Wenn, dann läuft IRMP nur nebenher, um die eigentliche Anwendung zu 
unterstützen. Also warum soll ich einen Tiny an einen STM32 anklemmen, 
um IR-Befehle zu verstehen?

In Deiner kleinen überschaubaren Welt scheint ein µC nur genau eine 
Sache zu tun und sonst gar nichts. Dass man mit µCs auch komplexe 
Anwendungen verwirklichen kann, ist offenbar zu Dir noch nicht 
vorgedrungen. Ist ja auch klar: Sobald die Sache etwas größer wird, 
stößt man mit Assembler ruckzuck an seine Grenzen und der Debug-Aufwand 
wird unverhältnismäßig hoch.

P.S.
Nicht, dass Du mich für einen verbohrten ASM-Hasser hältst: Ich verstehe 
verschiedene Assembler-Sprachen, in denen ich auch früher programmiert 
habe. Aber das ist über 20 Jahre her. Für mich ist das heutzutage 
Folter.

von (prx) A. K. (prx)


Lesenswert?

Moby schrieb:
> Da gibts nix zu verbessern, nix einzusparen,

Doch. Den Assembler kannst du einsparen. Was C gegen Assembler, das ist 
Assembler gegen Maschinensprache. Also ist der einzig richtige und 
definitiv optimale Ansatz sowas wie handcodiert als Hexfile oder 
ROM-Image. Schon hat man einen weitere Sprache eingespart, die weder der 
Programmier noch gar die Maschine für die Lösung benötigt und die völlig 
unnötige Komplexität einbringt.

> Der C-Werker könnte das natürlich bis zu einem gewissen
> Maß unterlaufen, indem er einzelnes in Asm einbaut.

Die wenigsten C-Werker tun das selbst, in Anwendungen. Kaum jemand 
programmiert selbst Asm-Module und nur wenige verwenden GCC-Inline-Asms. 
Letzteres schon deshalb, weil diese Spezifikationstechnik nicht jedem 
liegt.

Was jeder verwendet: Asm-Code, den andere geschrieben haben. Ob das 
sei() ist, oder die Delay-Loops usw. Nur interessiert niemanden, wie das 
implementiert wurde.

: Bearbeitet durch User
von Conny G. (conny_g)


Lesenswert?

Cyblord ---- schrieb:
> Moby schrieb:
>> Cyblord ---- schrieb:
>>> Du hast jetzt also ernsthaft jeden C Thread mit deinem nervenden ASM
>>> Scheiß zerlabert,

+1

von TriHexagon (Gast)


Lesenswert?

Moby schrieb:
> Cyblord ---- schrieb:
>> Du hast jetzt also ernsthaft jeden C Thread mit deinem nervenden ASM
>> Scheiß zerlabert,
>
> Nein. Aber bei passender Gelegenheit ganz dezent darauf hingewiesen, daß
> dieses oder jenes Problem (siehe nochmal Threadthema!) jetzt in Asm so
> nicht bestünde bzw. einfacher lösbar ist. Daß dieses Salz in die offenen
> Wunden der Hochsprache immer gleich so heftige Gegenreaktionen
> hervorruft ist zwar verständlich, aber doch nicht meine Schuld ;-)

Und? Sollen wir jetzt etwa zum Ausgleich in jedem ASM Problem Thread 
schreiben: "Mit einer Hochsprache/C wäre das nicht passiert". Das ist 
total sinnvoll, erinnert mich irgendwie an "mit Linux wäre das nicht 
passiert". Ja wäre wahrscheinlich nicht passiert, dafür passieren damit 
andere Dinge.

von Le X. (lex_91)


Lesenswert?

Moby schrieb:
> Du wirst natürlich zugeben, daß STM32 und selbst ATXmega dafür reichlich
> überdimensioniert sind- wenns schon ein kleiner Tiny stemmt.

Häh? Willst du damit sagen ein STM32 ist überdimensioniert für IRMP? 
IRMP lässt man doch nicht zum Selbstzweck laufen, sondern weil man 
dieses Feature in einem Projekt benötigt.
Du kannst dich drauf verlassen dass der STM32 sich nicht langweilt, weil 
der noch ganz andere Dinge beackert.
IRMP ist in nem Projekt eher ne Nebenbaustelle. Etwas, womit der 
Programmierer nix zu tun haben will weil es a) nicht die eigentliche 
Problemstellung ist und b) weils vor ihm schon zig andere gelöst haben.
Genauso wie FAT, Webserver, bestimmte Algorithmen...

Aber es liegt mir fern dich von irgendwas zu überzeugen. Du hast mir in 
diesem Forum schon viele unterhaltsame Stunden beschert, z.B. in der 
Arbeit aufn Klo.
Dein Name, und noch ein paar Namen mehr, sind jedesmal ein Garant für 
nette Unterhaltung.

Moby schrieb:
> sbi PORTA,0
Ist übrigens nicht das geeignetste Programm, um einen Verbraucher zu 
schalten. Weil der Code nicht selbstdokumentierend ist. Das ist ein 
weiteres Kriterium, wo eine Hochsprache vorne liegt.
Ein
1
EnableLed();
sagt mehr aus.

von Maxx (Gast)


Lesenswert?

Moby schrieb:
> Nein. Aber bei passender Gelegenheit ganz dezent darauf hingewiesen, daß
> dieses oder jenes Problem (siehe nochmal Threadthema!) jetzt in Asm so
> nicht bestünde bzw. einfacher lösbar ist.

Und du wirfst Vereinbarungen, die man sich vorher erarbeitet hat und 
einem definierten, sinnvollen Zweck dienen - z.B. die ABI, von Bord. Die 
Konsequenzen daraus unterschlägst du oder redest sie klein. (In dem du 
möglichst kleingranuliert die Umgebung und die Situation spezifizierst)

Die Konsequenz aus den Anforderungen ist größerer Code und mehr 
Operationen, in sofern richtig. Aber auch mehr und nicht weniger 
Kontrolle bei der Einhaltung von Anforderungen. Diese sind nunmal nicht 
nur "funktioniert in diesem Aufbau", sondern auch die Verifizierbarkeit, 
Dokumentation, Modularität, Wiederverwendbarkeit, Interoperabilität und 
funktionale Sicherheit. Ganz zu Schweigen vom Rest des Kapitels über 
nicht funktionale Anforderung im Lastenheft.

Nicht umsonst geht man sogar über Hochsprachen wie C noch hinaus und 
lässt Code in diesen durch eine Anforderungs/Modulbeschreibung 
automatisch erzeugen. Das stellt noch eine weitere Abstraktionsebene dar 
und effektiv mehr Code, der aber auch deutlich mehr 
Anforderungen/Arbeitskraft gerecht wird.

Dein
> das Ein-Schalten eines Verbrauchers A mit sbi PORTA,0
erfüllt für sich nicht erkennbar die Anforderung vom Einschalten eines 
Verbrauchers. Es erfüllt genau das was sbi auf der Platform definiert: 
Das setzen eines Bits. Weder ist der Verbraucher definiert (kein 
Bezeichner) noch dessen Logik (high/low active). Kurzum: zwischen der 
Anweisung "Ein-Schalten eines Verbrauchers" und "sbi PORTA,0" besteht 
keine unmittelbare Beziehung.

Natürlich kann man alle Anforderungen auch alleine in Assembler 
realisieren. Aber der Aufwand all diese einzelnen Aspekte für die 
Struktur, Funktionsblöcke und Anweisung zu betrachten und zu bewerten 
übersteigt den Implementierungsaufwand schon um Potenzen.

von Moby (Gast)


Lesenswert?

Maxx schrieb:
> Aber auch mehr und nicht weniger
> Kontrolle bei der Einhaltung von Anforderungen. Diese sind nunmal nicht
> nur "funktioniert in diesem Aufbau", sondern auch die Verifizierbarkeit,
> Dokumentation, Modularität, Wiederverwendbarkeit, Interoperabilität und
> funktionale Sicherheit. Ganz zu Schweigen vom Rest des Kapitels über
> nicht funktionale Anforderung im Lastenheft.

Du redest von Anforderungen industrieller Softwareentwicklung.
Ich bin Hobbybastler. Ein solcher genießt den einzigartigen Luxus, 
Hard-und Software ganz zielgerichtet und aufwandsminimiert an seinen 
Projekten zu orientieren. Deswegen übersteigt

Maxx schrieb:
> der Aufwand all diese einzelnen Aspekte für die
> Struktur, Funktionsblöcke und Anweisung zu betrachten und zu bewerten

meinen Implementierungsaufwand nicht um Potenzen, sondern er ist so 
schlicht nicht vorhanden. Der beste Test ist immer noch die Praxis- und 
wenns dann funktioniert ;-)

Cyblord ---- schrieb:
> Ich finde meine Formulierung besser und passender.

Das sei Dir doch zugestanden. Das MUSS ein C-Mensch so empfinden.
Deshalb werde ich jetzt aber keine Beschwerde beim Moderator starten ;-)

Frank M. schrieb:
> Auch in C kann man durchaus auf
> Ressourcen achtgeben.

... und stößt trotzdem schnell an Grenzen (Threadthema!). Dann geht 
höchstens noch die Compiler-Optimierung los. Danke, brauch der ASMler 
nicht.

Frank M. schrieb:
> In Deiner kleinen überschaubaren Welt scheint ein µC nur genau eine
> Sache zu tun

Du meintest LEDs zu schalten? Da irrst Du Dich.
Im ersten Teil hast Du aber Recht. Nur versteh doch, die kleine 
überschaubare Welt leitet sich nicht aus simplen Anwendungen, sondern 
aus der gezielten Sprachverwendung (und der dadurch auch möglichen 
niederfrequenten Controllerauswahl) ab. Das ist glatte, pure Absicht! 
Das SOLL so sein!

Frank M. schrieb:
> Ist ja auch klar: Sobald die Sache etwas größer wird,
> stößt man mit Assembler ruckzuck an seine Grenzen

Ja das tut sie. Beim einen früher, beim anderen später.
Bis dahin aber gibts nichts Besseres ;-)

A. K. schrieb:
> Also ist der einzig richtige und
> definitiv optimale Ansatz sowas wie handcodiert als Hexfile oder
> ROM-Image.

Was soll der Blödsinn? Wer soll das lesen?
Asm vereint zwei faszinierende Eigenschaften:
100% Zugriff auf Instruktionen und Hardwareressourcen- und das Ganze 
lesbar!

TriHexagon schrieb:
> Sollen wir jetzt etwa zum Ausgleich in jedem ASM Problem Thread
> schreiben: "Mit einer Hochsprache/C wäre das nicht passiert".

Gerne. Hab nix dagegen. Die Sorte Probleme, die Asm in allen üblichen 
Steuerungsanwendungen nicht lösen kann würd ich gern noch kennenlernen.

le x. schrieb:
> EinEnableLed();
> sagt mehr aus.

Ja, sagt mehr aus, aber auch nicht mehr... Prinzipiell müsste es ja kein 
Problem sein, auch in AVR-Asm "PORTA,0" einen passenden Alias-Namen 
geben zu können. Ist so nicht vorgesehen, muß es halt die Doku leisten. 
Kosmetik.

le x. schrieb:
> Etwas, womit der
> Programmierer nix zu tun haben will weil es a) nicht die eigentliche
> Problemstellung ist und b) weils vor ihm schon zig andere gelöst haben.
> Genauso wie FAT, Webserver, bestimmte Algorithmen...
>
> Aber es liegt mir fern dich von irgendwas zu überzeugen.

Davon brauchst Du mich nicht zu überzeugen, das handhabe ich selber so.

von F. F. (foldi)


Lesenswert?

Ist das Thema, ich meine das ursprüngliche Thema mittlerweile beendet?

Schon schlimm genug, dass fast jeder zweite Thread in einen Cortex 
Glaubenskrieg endet, muss es jetzt auch noch ein ASM Krieg werden?

Mein lieber Moby, ich kann dem ASM auch einiges abgewinnen, obwohl ich 
noch nicht viel las und noch kein einziges Programm geschrieben habe.
Das kommt noch, wenn ich mal wieder weniger um die Ohren habe und es 
meinem Sohn wieder besser geht.

Aber muss du denn unbedingt überall mit deinem ASM rein hauen?
Hier ging es doch eigentlich um die Takte bis eine ISR ausgelöst wird.

Ich schlage dir vor mal ein ganz tolles ASM Tutorial zu schreiben, das 
alles andere in den Schatten stellt. Da kann dann jeder selbst lesen, 
wenn er will.
Es ist ja schön, dass du so dafür brennst, aber lass doch mal alle 
anderen in Ruhe.

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.