Forum: Mikrocontroller und Digitale Elektronik Ausführungszeit ISR


von Pepe (Gast)


Lesenswert?

Kann mir jemand sagen ob der folgende Code auf einem ATMega328 mit 16MHz 
Quarz in eine ISR passt die zur Abarbeitung 1.5µs (ca. 24 Takte) Zeit 
hat?

void clockOneBitIn(void)
{
  uint8_t mask = PINB & 0x01;
  temp_data = temp_data << 1;
  temp_data &= (uint32_t) mask;
}

"temp_data" ist weiter oben im Quelltext natürlich als uint32_t 
definiert.

LG,

Pepe

von Stefan (Gast)


Lesenswert?

Das kann ich mir nicht vorstellen, allein das Sichern der für uint32_t 
nötigen Register dauert ja schon ...

Warum brauchst Du uint32_t?
So wie es aussiht, bleiben die oberen 24 Bit immer Null.

Was passiert mit temp_data im restlichen Programm? Wird es woanders 
gelesen oder auch geschrieben?

Gruß, Stefan

von Norbert (Gast)


Lesenswert?

Pepe schrieb:
> Kann mir jemand sagen ob der folgende Code auf einem ATMega328 mit 16MHz
> Quarz in eine ISR passt die zur Abarbeitung 1.5µs (ca. 24 Takte) Zeit
> hat?
>
> void clockOneBitIn(void)
> {
>   uint8_t mask = PINB & 0x01;
>   temp_data = temp_data << 1;
>   temp_data &= (uint32_t) mask;
> }
>
> "temp_data" ist weiter oben im Quelltext natürlich als uint32_t
> definiert.
>
> LG,
>
> Pepe

Sinnlos!
mask kann nur die Werte 0x00 oder 0x01 annehmen.
Nach Zeile Zwei wird das niedrigste Bit in temp_data immer 0 sein.
Nach Zeile Drei steht in temp_data immer 0


Also würde ich folgendermaßen umformen:
1
void clockOneBitIn(void)
2
{
3
  temp_data = 0;
4
}

von Pepe (Gast)


Lesenswert?

Ups, da hat sich ein Fehler eingeschlichen! Das UND muss natürlich ein 
ODER sein :-)

void clockOneBitIn(void)
{
  uint8_t mask = PINB & 0x01;
  temp_data = temp_data << 1;
  temp_data |= (uint32_t) mask;
}

von Pepe (Gast)


Lesenswert?

Die ISR soll im Prinzip eine SPI "belauschen" und in temp_data stehen 
halt immer die letzten 24 empfangenen Bit drin. Nur die brauche ich.

Die Hardware-SPI kann ich leider nicht benutzen weil die schon als 
MASTER zur Kommunikation mit einer SD-Karte im Einsatz ist.

Mit dem Oszi habe ich gemessen das die Quelle die "belauscht" werden 
soll Clock-Pulse von 1.5µs hat.

LG,

Pepe

von m.n. (Gast)


Lesenswert?

Pepe schrieb:
> Mit dem Oszi habe ich gemessen das die Quelle die "belauscht" werden
> soll Clock-Pulse von 1.5µs hat.

und mit welcher Frequenz?

von Takao K. (takao_k) Benutzerseite


Lesenswert?

Pepe schrieb:
> Die ISR soll im Prinzip eine SPI "belauschen" und in temp_data stehen
> halt immer die letzten 24 empfangenen Bit drin. Nur die brauche ich.
>
> Die Hardware-SPI kann ich leider nicht benutzen weil die schon als
> MASTER zur Kommunikation mit einer SD-Karte im Einsatz ist.
>
> Mit dem Oszi habe ich gemessen das die Quelle die "belauscht" werden
> soll Clock-Pulse von 1.5µs hat.
>
> LG,
>
> Pepe

Das geht nur ganz schlecht, du wirst Probleme damit haben den Port in 
regelmaessigen Abstaenden zu lesen.

Wenn du nur 24 bit brauchst, lies lieber ohne Interrupt aus alle 24 bits 
nacheinander, extra ausschreiben also keine Schleife.

u.U. musst du mask nicht nach 32bit konvertieren wenn du es mit den 
unteren 8bit veroderst.
1
 temp_data |= (PORT&0x01)

von Norbert (Gast)


Lesenswert?

Wenn die 1,5µs stimmen, so hätten wir bei einem Puls/Pause Verhältnis 
von 1:1 eine SPI Frequenz von 1/3 MHz.

Kommt mir 'gefühlt' etwas hoch vor!

von Pepe (Gast)


Lesenswert?

Ja, da hab ich mich wieder mal nicht richtig ausgedrückt :-/

Die 1.5µs habe ich schon zwischen den beiden steigenden Flanken zweier 
aufeinanderfolgender Clock-Pulse gemessen.

Sieht also so aus als müsste ich mich um eine andere Lösung bemühen :-/

Vielen Dank,

Pepe

von öhmmm (Gast)


Lesenswert?

Norbert schrieb:
> Wenn die 1,5µs stimmen, so hätten wir bei einem Puls/Pause Verhältnis
> von 1:1 eine SPI Frequenz von 1/3 MHz.
>
> Kommt mir 'gefühlt' etwas hoch vor!

Ich betreibe SPI mit einer f_clk von 20MHz. Warum sollen 300kHz hoch 
sein?

von Peter D. (peda)


Lesenswert?

Beim AVR-GCC dauert ein leerer Interrupt 23 Zyklen:
1
ISR( foo )
2
{
3
}
Bei 24 Zyklen ist also gerade noch Zeit für ein NOP.

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Pepe schrieb:
> Kann mir jemand sagen ob der folgende Code auf einem ATMega328 mit 16MHz
> Quarz in eine ISR passt die zur Abarbeitung 1.5µs (ca. 24 Takte) Zeit
> hat?

So allgemein kann man die Frage nicht beantworten - die Laufzeit des 
Kompilats hängt von vielen Faktoren ab (Optimierung eingeschaltet usw.).

Das erfährst Du am einfachsten, wenn Du Dir den Assemblerquelltext des 
übersetzten C-Schnipsels anschaust. Beim (vermutlichen) gcc-avr steckt 
der in der *.lss-Datei.

Dort kannst Du dann wirklich die einzelnen Assemblerbefehle (=Takte) 
zählen.

von imho (Gast)


Lesenswert?

Ich denke aber, dass man das tunen könnte. Wenn man in 3 globale 
8-bit-Variablen schreibt und jeweils nur 8bit-Operationen ausführt. 
Allerdings muss man dann mitzählen, ob man in das erste, zweite oder 
dritte Byte schreiben muss. Wichtig wäre vielleicht, dass die Variablen 
nicht im RAM zwischengespeichert werden, sondern in Registern bleiben. 
Für so einfache Operationen kann man auch Assembler strapazieren, ohne 
den Überblick zu verlieren!

von Norbert (Gast)


Lesenswert?

öhmmm schrieb:
> Norbert schrieb:
>> Wenn die 1,5µs stimmen, so hätten wir bei einem Puls/Pause Verhältnis
>> von 1:1 eine SPI Frequenz von 1/3 MHz.
>>
>> Kommt mir 'gefühlt' etwas hoch vor!
>
> Ich betreibe SPI mit einer f_clk von 20MHz. Warum sollen 300kHz hoch
> sein?

Ich schrieb
   'gefühlt' etwas hoch
und meinte
   'gefühlt' etwas hoch für Software-Abtastung!

Sind ja jetzt nach Klarstellung sogar 2/3MHz geworden.

Wenn nur ab und zu mal ein Byte vorbei kommt, würde ich vermutlich beim 
ersten Clock in die ISR hüpfen und dann darin auf sieben weitere Bits 
warten. Macht insgesamt 12µs innerhalb der ISR.
Sollte mit Assembler kein Problem sein.

Wenn das Zeuch allerdings ständig hereinprasselt, bleibt für den Rest 
der Anwendung kaum noch Zeit.

von Ulrich (Gast)


Lesenswert?

In C wird es schon wegen des Overheads wohl nichts werden mit 24 takten. 
GCC nutzt und sichert dafür einfach zu viel Register. Mit inline ASM 
(oder ggf. auch die ISR als extra ASM file) könnte man es wohl noch 
hinbekommen die Bits einzeln zu empfangen.
Vermutlich wird man den Code auch noch erweitern müssen um zu erkennen 
wenn 24 Bit fertig sind.

Manchmal ist ASM Code einfacher als den C Code so umzustellen und extrem 
zu Optimieren das der Compiler dabei was gutes raus bekommt.

Der Mega328 sollte über die USART noch einen 2. Möglichkeit für Hardware 
SPI habe, zumindest zum Senden.

von c-hater (Gast)


Lesenswert?

Pepe schrieb:

> Kann mir jemand sagen ob der folgende Code auf einem ATMega328 mit 16MHz
> Quarz in eine ISR passt die zur Abarbeitung 1.5µs (ca. 24 Takte) Zeit
> hat?

Das wird eng, sogar in Assembler.

inthandler:        ; 4 (minimale konstante Latenz angenommen)
 push R16          ; 2
 in R16,SREG       ; 1
 push R16          ; 2

 lds R16,temp_data ; 2
 lsl R16           ; 1
 sbic PINB,0       ; 2
 sbr R16,1         ;
 sts temp_data,R16 ; 2

 lds R16,temp_data ; 2
 rol R16           ; 1
 sts temp_data,R16 ; 2

 lds R16,temp_data ; 2
 rol R16           ; 1
 sts temp_data,R16 ; 2

 lds R16,temp_data ; 2
 rol R16           ; 1
 sts temp_data,R16 ; 2

 pop R16           ; 2
 out SREG,R16      ; 1
 pop R16           ; 2
 reti              ; 4
                   ;--
                   ;30

Das Schöne an Assembler ist: man sieht sofort: Nö das geht so nicht.

Das noch bessere an Assembler: Es steht einem jederzeit frei, sich 
Auswege aus der Misere auszudenken. Hier z.B. ist eins sofort ganz klar: 
Diese Routine wird in jedem Fall der Hauptverbraucher an Rechenzeit, 
selbst wenn es mit Optimierungen gelingt, sie in den Stand der 
Echtzeitgnade zu setzen.

Im Umkehrschluß ergibt sich: es kann ansonsten im Rest des Systems 
sowieso nicht mehr sehr viel passieren, da spielt ein gewisser 
Effizienzverlust keine große Rolle mehr. Also klauen wir dem Rest des 
Systems einfach fünf (möglichst unwichtige) Register, z.B. R3..R7. Aus 
R3 macht man ein Register, welches dafür reserviert ist, in exclusiven 
ISRs den Inhalt des Statusregisters aufzunehmen und R7::R4 wird einfach 
zu temp_data erklärt.

So, nun nochmal die ISR unter den neuen Randbedingungen:

inthandler:        ; 4 (minimale konstante Latenz angenommen)
 in R3,SREG        ; 1

 clc               ; 1
 sbic PINB,0       ; 2
 sec               ;
 rol R4            ; 1
 rol R5            ; 1
 rol R6            ; 1
 rol R7            ; 1

 out SREG,R3       ; 1
 reti              ; 4
                   ;--
                   ;17


Ooops. Statt "geht garnicht" ist plötzlich mehr als ein Drittel der 
Rechenzeit noch frei. Da kann man dann tatsächlich wirklich noch eine 
richtige Anwendung parallel zur ISR laufen lassen, selbst wenn diese 
dann durch den Verzicht auf 5 von 32 Registern etwas suboptimal 
implementiert sein muß...

Only ASM rules! C is made for losers.

von Jim M. (turboj)


Lesenswert?

c-hater schrieb:
> Only ASM rules! C is made for losers.

Dan implementiere mal den SD-Karten Zugriff des OP inklusive FAT in Asm 
- der war der Grund wieso HW-SPI flach fiel.

Ich hätte übrigens die SD-Karte von HW-SPI auf SW-SPI umgeklemmt, um das 
deutlich schwierigere Einlesen des anderen SPI Signals hinzubekommen.

von foo (Gast)


Lesenswert?

c-hater schrieb:
> Only ASM rules! C is made for losers.

Ach ASM, diese Hochsprache. Schreib doch gleich Opcodes.

von Peter D. (peda)


Lesenswert?

c-hater schrieb:
> Only ASM rules! C is made for losers.

Nä, wat hammer jelaach.

von Sebastian W. (wangnick)


Lesenswert?

c-hater schrieb:
> clc               ; 1
>  sbic PINB,0       ; 2
>  sec               ;

Ich kenn mich ja mit ASM nicht so aus (mehr mit C/C++), aber geht das 
nicht in zwei Takten? Es muss ja nur Bit 0 von PINB ins Carry-Flag. Ich 
dachte da an so etwas:

  in R8,PINB  ; 1
  ror R8   ; 1

Denkfehler?

LG, Sebastian

von Coder (Gast)


Lesenswert?

Der übersetzte Code in Assembler sieht ja richtig sub-optimal aus?!? 
Optimierungen auf max. gesetzt? Man könnte meinen tempdata ist als
1
volatile uint8_t
deklariert.

von c-hater (Gast)


Lesenswert?

Sebastian Wangnick schrieb:

> Ich kenn mich ja mit ASM nicht so aus (mehr mit C/C++), aber geht das
> nicht in zwei Takten?

Ja, aber nur für die beiden Sonderfälle, wo das auszuwertende Bit des 
IO-Bytes Bit 7 oder 0 ist.

Trotzdem ein konstruktiver Beitrag, denn der vorliegende Fall ist ja 
genau einer der beiden Sonderfälle, die auch noch diese Optimierung 
erlauben würden. Wir kommen also auf nur noch 16 Takte für eine 
vollständige Asm-Lösung inclusive allem nötigen ISR-Overhead.

Wie aus dem C-Lager zu hören war, kostet da schon eine nutzlose, 
vollständig leere ISR satte 23 Takte...

von foo (Gast)


Lesenswert?

c-hater schrieb:
> Wie aus dem C-Lager zu hören war, kostet da schon eine nutzlose,
> vollständig leere ISR satte 23 Takte..

Ja, da geschieht auch nur vodoo magic in den Takten.
Du kannst ja eine naked ISR anlegen.

Keine Ahnung wo Deine Abneigung zu C kommt, Unwissen?

Wichtig ist das passende Mittel zum Zweck.
Also ASM wo angebracht, für komplexe Dinge C - Schon wegen der 
Wartbarkeit und Testbarkeit!

von Peter D. (peda)


Lesenswert?

c-hater schrieb:
> Wie aus dem C-Lager zu hören war, kostet da schon eine nutzlose,
> vollständig leere ISR satte 23 Takte...

Ist in Assembler auch nicht viel besser:

- mindestens 1 Main-Befehl, z.B. RET: 4
- PC sichern, IV->PC: 4
- RJMP zum Handler: 2
- RETI: 4
= 14

von c-hater (Gast)


Lesenswert?

Peter Dannegger schrieb:

> Nä, wat hammer jelaach.

Aha. Auf die Fakten möchtest du natürlich (wie alle Anhänger 
irgendwelcher obskuren Glaubensgemeinschaften) nicht näher eingehen.

Also bei deiner umfassenden Kompetenz und der absolut erwiesenen 
Überlegenheit von C in jeglicher Hinsicht sollte es doch für dich als 
perfekten Kenner dieser absolut genialen Sprache ein leichtes sein, 
einen Ausweg aufzuzeigen, der ähnlich problemlos wie mein Asm-Vorschlag 
mal eben ein System von der offensichtlich vollständigen Unbrauchbarkeit 
wenigstens in den Bereich bringen kann, wo eine Brauchbarkeit als 
zumindest durchaus möglich erscheint.

Wetten, das kannst du nicht! Nä, wat hammer jelaach.

von H.Joachim S. (crazyhorse)


Lesenswert?

Du laberst einen Kram zusammen...
1. kann man nicht jeder ISR einfach mal so 5 Register exclusiv 
zuschustern
(es gibt tatsächlich Programme, da laufen mehr als eine :-)

2.hat nie jemand bestritten, dass kleine zeitkritische Sachen in 
Assembler u.U. effektiver programmierbar sind

3. bietet C aus diesem Grund die Möglichkeit, Assembler einzufügen

von Max H. (hartl192)


Lesenswert?

Jim Meba schrieb:
> Dan implementiere mal den SD-Karten Zugriff des OP inklusive FAT in Asm
Schon mal was von "Inline-Assembly" gehört?

von c-hater (Gast)


Lesenswert?

Peter Dannegger schrieb:

> Ist in Assembler auch nicht viel besser:
>
> - mindestens 1 Main-Befehl, z.B. RET: 4

Das ist variable Latenz. Die Zeit geht nicht in den Verbrauch an 
Rechenzeit durch die ISR ein, sondern sorgt nur dafür, daß sie später 
abgearbeitet wird. Dafür brauchen die Takte, die die ISR später lief, 
dann in main oder sonstwo nicht mehr bearbeitet zu werden, weil sie halt 
bereits fertig bearbeitet wurden, bevor die ISR zur Ausführung kam.

Im Übrigen kann die variable Latenz auch noch sehr viel größer als nur 
vier Takte sein. Jeder konkurrierende Interrupt geht hier mit voller 
Laufzeit seines exklusiven Teils ein, darüber hinaus auch jeder 
cli()/sei()-Block. Und nicht zuletzt: auch der simple Lag durch die 
Laufzeit der aktuellen Instruktion kann mehr als 4 Takte betragen, 
nämlich immer dann, wenn es länger dauernde Instruktionen gibt. Z.B. bei 
allen AVRs mit 22Bit-PC (ret, reti) oder auch bei AVRs mit externem RAM 
und Waitstates beim Zugriff darauf (alle RAM-Zugriffe).

Das wirklich Schlimme ist: alle diese Einzellatenzen muß man addieren, 
um den worst case für die variable Interruptlatenz ermitteln zu können. 
Da knallt es dann auch schon wieder in C, denn dort ist das garnicht 
möglich, verläßlich eine exakte Laufzeit für einen bestimmten Codeteil 
anzugeben. Denn beim nächsten Compilerlauf über denselben Quelltext 
könnte schon wieder etwas völlig anderes herauskommen...

Aber das ist nur ein Nebenkriegsschauplatz, zurück zum eigentlichen 
Gemetzel.

> - PC sichern, IV->PC: 4

OK, das ist wirklich absolut unvermeidlich.

> - RJMP zum Handler: 2

Hier ist schonmal etwas, was man in Asm ggf. wegoptimieren kann. Einfach 
indem man die ISR ab Vektor direkt in den Speicher schreibt. Das klappt 
DEFINITIV auf jeden Fall problemlos, solange der kritische Interrupt der 
einzige im System ist.

> - RETI: 4

OK, auch absolut unvermeidlich.

Zählen wir also die wirklich unvermeidlichen Sachen zusammen, ergibt 
sich die simple Rechnung 4+4=8. Und in Asm kann man wirklich problemlos 
eine leere ISR bauen, die tatsächlich immer und unter allen Umständen 
bei jeder Auslösung exakt diese acht Takte benötigt. (Oder 10 auf AVRs 
mit 22Bit-PC)

.ORG WelcherVektorAuchImmer
 reti

Nach deiner Angabe braucht in C aber eine genauso leere und genau so 
nutzlose ISR 23 Takte. Da bleibt eine Differenz von 15 Takten, immerhin 
fast das Doppelte des absoluten Minimums. Was zum Teufel macht C mit 
diesen vielen überaus wertvollen Takten?

von c-hater (Gast)


Lesenswert?

H.Joachim Seifert schrieb:

> 1. kann man nicht jeder ISR einfach mal so 5 Register exclusiv
> zuschustern

Doch, das kann man. Wenn man die volle Kontrolle über seinen Code hat. 
Und die hat man in Asm. Da ist das ganz einfach: Man weiß, daß diese 
Register nicht zur Verfügung stehen und benutzt sie deshalb einfach 
nicht außerhalb der Bereiche, für die sie reserviert sind. Wirklich ein 
absolut triviales und leicht nachvollziehbares Konzept...

von H.Joachim S. (crazyhorse)


Lesenswert?

Dann sind sie aber schnell ziemlich alle und aus dem schönen 
32-Register-Konzept wird wieder ein armseliges A- und 
B-Akkumulator-System. Macht ja nix, wir haben jetzt ein hammergeiles 
Interruptsystem mit 6 verschiedenen sauschnellen Interrupts, also R0-R29 
sind futsch.
R30 und R31 sind meine Akkumulatoren. Jetzt wäre es schön, noch ein paar 
Indexregister zu haben, macht nichts, streichen wir einen Int.
Mist, LPM brauch ich auch, R0 ist futsch, macht nichts, mit 4 Ints komme 
ich auch aus - merkste was?

von Andreas (Gast)


Lesenswert?

Kurz bevor die Mnemonic-Salafisten den flammenden Krummsäbel erhoben 
haben und die C-Front mobil machte, blieb die Stimme der Vernunft 
ungehört:

Ulrich hat in der Mitte des Beitrags auf die Möglichkeit hingewiesen, 
die USART im SPI-Mode zu betreiben. Wenn die noch verfügbar ist, würde 
das jede Debatte über die zu bevorzugende Programmiersprache nichtig 
machen - weil ein dediziertes HW-Modul mittels SW nicht übertrumpft 
werden kann (und auf beipflichtende Worte von sw-hater, der den Thread 
bislang augenrollend mitverfolgt hat, weil er alle seine Projekte 
ausschließlich mit GALS oder PALS umsetzt und Software generell hasst, 
kann ich gerne verzichten).

@Pepe: steht die USART noch zur Verfügung?

Gruß,
Andreas

von Falk B. (falk)


Lesenswert?

@ foo (Gast)

>> Wie aus dem C-Lager zu hören war, kostet da schon eine nutzlose,
>> vollständig leere ISR satte 23 Takte..

>Keine Ahnung wo Deine Abneigung zu C kommt, Unwissen?

Vielleicht ala Freud P....neid?




































































































Präprozessorneid natürlich ;-)

von m.n. (Gast)


Lesenswert?

c-hater schrieb:
> H.Joachim Seifert schrieb:
>
>> 1. kann man nicht jeder ISR einfach mal so 5 Register exclusiv
>> zuschustern
>
> Doch, das kann man. Wenn man die volle Kontrolle über seinen Code hat.

Es geht auch mit einem ASM/C-Mix. IAR bietet das, wenn man das 
notwendige Kleingeld oder Lottoglück hat :-)
Die kostenlose Demoversion läßt 4k Code zu, was für kleine, spezielle 
Anwendugen durchaus reichen kann.

Im Beitrag Beitrag "4-fach Flankenauswertung per Interrupt mit ATmega48/88" hatte ich ein 
Beispiel gebracht, wo das Grundprogramm in C und die spezielle Erfassung 
in ASM programmiert sind. Für ASM kann man die notwendigen Register 
reservieren, ohne dass diese in C als fehlend auffallen würden.

Die Int-Routinen im obigen Beispiel (qcnt_6sub.s) sind etwas 
'aufwendiger' und brauchen dennoch nur unter 2µs, weshalb Interrupts mit 
500kHz noch Zeit fürs Hauptprogramm lassen.
Die neueren ATmega/Tiny haben GPIOR-Register, die mit kurzen IN- 
OUT-Befehlen nutzbar sind. Auch da kann man lokale Variablen gut parken.

H.Joachim Seifert schrieb:
> Dann sind sie aber schnell ziemlich alle und aus dem schönen
> 32-Register-Konzept wird wieder ein armseliges A- und
> B-Akkumulator-System. Macht ja nix, wir haben jetzt ein hammergeiles
> Interruptsystem mit 6 verschiedenen sauschnellen Interrupts, also R0-R29
> sind futsch.

Bitte nicht gleich wieder ins Extreme übertreiben!

von Peter D. (peda)


Lesenswert?

Hier mal ein Beispiel für eine sinnvolle Kombination ASM+C:

Beitrag "AVR: Fast-PWM (BAM) 12 Bit für 8 Kanäle"


In meinen Anfängen habe ich auch mal ein Programm in Assembler 
geschrieben, wo die CPU zu fast 100% ausgelastet war. Später habe ich 
das Programm umgestellt und plötzlich war massig CPU Zeit frei.
Oftmals ist es besser, einfach den Algorithmus umzustellen, als mit der 
Kneifzange auf einzelne CPU-Zyklen Jagd zu machen.
Wenns irgendwo hakelt, fragt man sich erstmal, muß ich das wirklich 
genau so machen und muß ich das wirklich so oft machen?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Falk Brunner schrieb:
> Vielleicht ala Freud P....neid?

 Diese Bettlaken Beiträge sind so was von nützlich und elegant...

von Die Welt geht vor die Hunde (Gast)


Lesenswert?

H.Joachim Seifert schrieb:
> Du laberst einen Kram zusammen...
> 1. kann man nicht jeder ISR einfach mal so 5 Register exclusiv
> zuschustern
> (es gibt tatsächlich Programme, da laufen mehr als eine :-)
>
> 2.hat nie jemand bestritten, dass kleine zeitkritische Sachen in
> Assembler u.U. effektiver programmierbar sind
>
> 3. bietet C aus diesem Grund die Möglichkeit, Assembler einzufügen

natürlich kann man das, man nimmt einfach einen "richtigen" Compiler und 
nicht dieses GCC-Gemurkse! Beim IAR kann man einige Register für solche 
Fälle exklusiv reservieren.

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Die Welt geht vor die Hunde schrieb:
> H.Joachim Seifert schrieb:
>> Du laberst einen Kram zusammen...
>> 1. kann man nicht jeder ISR einfach mal so 5 Register exclusiv
>> zuschustern
>
> natürlich kann man das, man nimmt einfach einen "richtigen" Compiler und
> nicht dieses GCC-Gemurkse! Beim IAR kann man einige Register für solche
> Fälle exklusiv reservieren.

Ähm - beim gcc geht das natürlich auch ...

Aber irgendwann (und beim avr ziemlich bald) ist eben Schluß mit 
exklusiver Registerzuweisung.

: Bearbeitet durch Moderator
von Moby (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Beim AVR-GCC dauert ein leerer Interrupt 23 Zyklen

Peter Dannegger schrieb:
> In Assembler
>
> - mindestens 1 Main-Befehl, z.B. RET: 4 - PC sichern, IV->PC: 4
> - RJMP zum Handler: 2
> - RETI: 4
> = 14

Ist ja himmelschreiend, diese Performance- Verbraterei! Man mag sich 
nicht ausmalen, was da in einem kompletten C-Projekt an unnützer Wärme 
entsteht...

von Takao K. (takao_k) Benutzerseite


Angehängte Dateien:

Lesenswert?

Moby schrieb:
> Peter Dannegger schrieb:
>> Beim AVR-GCC dauert ein leerer Interrupt 23 Zyklen
>
> Peter Dannegger schrieb:
>> In Assembler
>>
>> - mindestens 1 Main-Befehl, z.B. RET: 4 - PC sichern, IV->PC: 4
>> - RJMP zum Handler: 2
>> - RETI: 4
>> = 14
>
> Ist ja himmelschreiend, diese Performance- Verbraterei! Man mag sich
> nicht ausmalen, was da in einem kompletten C-Projekt an unnützer Wärme
> entsteht...

Also sagen wir mal im DB Regionalzug mit Diesellok, 4 Megawatt, ist ein 
LED Anzeigeboard drin, mit 10 controller chips, 50 MHz, und zieht 2 
Ampere. Wen interessierts?

Kannst dich ja aufs Dach setzen und Spiegeleier braten, vielleicht 
lachst du jetzt, gibt es.

In der 3. Welt ist alles effizienter weil der extra Sprit halt einfach 
nicht da ist.

Und in Einweg PET Flaschen kannst du Pflanzen anziehen oder diese 
zerschneiden und als Verpackunngsmaterial verwenden. Hab ich vor kurzem 
mal gemacht mit einer Alu Dose.

Wollte halt nicht einfach grob antworten: Das ist sch. egal.

von Takao K. (takao_k) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
> Hier mal ein Beispiel für eine sinnvolle Kombination ASM+C:
>
> Beitrag "AVR: Fast-PWM (BAM) 12 Bit für 8 Kanäle"
>
>
> In meinen Anfängen habe ich auch mal ein Programm in Assembler
> geschrieben, wo die CPU zu fast 100% ausgelastet war. Später habe ich
> das Programm umgestellt und plötzlich war massig CPU Zeit frei.
> Oftmals ist es besser, einfach den Algorithmus umzustellen, als mit der
> Kneifzange auf einzelne CPU-Zyklen Jagd zu machen.
> Wenns irgendwo hakelt, fragt man sich erstmal, muß ich das wirklich
> genau so machen und muß ich das wirklich so oft machen?

Einfach aufteilen auf einen MCU Cluster, sich nicht mehr mit Assembler 
rumaergern. Wenn das Projekt ausgearbeitet ist, kann man eine 
entscheidende Funktion immer noch nach Assembler umarbeiten.

Wenn es skalierbar sein soll, muss es einfach und schnell wartbar sein, 
und das ist in Assembler halt nicht der Fall.

Oder soll jetzt die Weltformel mit einem 8pin 8bit chip und einer 3v 
Knopfzelle gefunden werden?

von Moby (Gast)


Lesenswert?

Takao K. schrieb:
> sich nicht mehr mit Assembler
> rumaergern.

Ärger ist sicher nicht zielführend wenns in erster Linie Spaß machen 
soll.

> Wenn es skalierbar sein soll, muss es einfach und schnell wartbar sein,
> und das ist in Assembler halt nicht der Fall.

Innerhalb einer Architektur bleibend kannste diesen Vorteil in der 
Pfeife rauchen.

> Also sagen wir mal im DB Regionalzug mit Diesellok, 4 Megawatt, ist ein
> LED Anzeigeboard drin, mit 10 controller chips, 50 MHz, und zieht 2
> Ampere. Wen interessierts?

Jedem seine Ansprüche ;-)

von Takao K. (takao_k) Benutzerseite


Lesenswert?

Moby schrieb:
> Takao K. schrieb:
>> sich nicht mehr mit Assembler
>> rumaergern.
>
> Ärger ist sicher nicht zielführend wenns in erster Linie Spaß machen
> soll.

http://aranna.altervista.org/dragonsnest/microcontroller-projects/led-dot-matrix-scrolling-message-14x5-source-code/

z.B. ist der Font proportional, und die IO bits koennen extern beliebig 
verbunden sein, weiterhin wird der Tristate Registerwert automatisch 
berechnet.

Macht es nicht wenn du nicht mal deine eigenen Sources wiederverwerten 
kannst.
>> Wenn es skalierbar sein soll, muss es einfach und schnell wartbar sein,
>> und das ist in Assembler halt nicht der Fall.
>
> Innerhalb einer Architektur bleibend kannste diesen Vorteil in der
> Pfeife rauchen.
>

Aha hier weisst du es wieder mal besser.
Du willst halt nicht nur 5 MIPS x 16, sondern auch noch spezielle 
Eigenschaften eines Chips, z.B. Spannungsbereich, Abmessungen, Preis, 
Lagerhaltung usw.

In deinem PC wird es ja auch so gemacht, die haben heute weitgehend 
Multicore.

>> Also sagen wir mal im DB Regionalzug mit Diesellok, 4 Megawatt, ist ein
>> LED Anzeigeboard drin, mit 10 controller chips, 50 MHz, und zieht 2
>> Ampere. Wen interessierts?
>
> Jedem seine Ansprüche ;-)

Ja wenn du es besser weisst, beleg es doch mal, z.B. mit einem Program 
welches du vor 5 Jahren geschrieben hast.

Ansonsten ist es schwer nachzuvollziehen ob du es einfach nur gut 
findest zu argumentieren und dich ins recht zu setzen, oder ob du es 
zumindest selbst wirklich glaubst.

: Bearbeitet durch User
von Moby (Gast)


Lesenswert?

Takao K. schrieb:
> Macht es nicht wenn du nicht mal deine eigenen Sources wiederverwerten
> kannst.

Beim Wiederverwerten/Verstehen gibts zwischen C- und asm Programmen kaum 
einen Unterschied. Hängt bei beiden sehr von der Dokumentation und Wahl 
der Bezeichner sowie der Komplexität der internen Funktionsmechanismen 
ab.

von Takao K. (takao_k) Benutzerseite


Lesenswert?

Moby schrieb:
> Takao K. schrieb:
>> Macht es nicht wenn du nicht mal deine eigenen Sources wiederverwerten
>> kannst.
>
> Beim Wiederverwerten/Verstehen gibts zwischen C- und asm Programmen kaum
> einen Unterschied. Hängt bei beiden sehr von der Dokumentation und Wahl
> der Bezeichner sowie der Komplexität der internen Funktionsmechanismen
> ab.

Ich habe jahrelang Assembler programmiert, z.B. auch 8086.
Irgendwann hat mir mal jemand in der Korrespondenz mitgeteilt, das er 
mein Assemblerprogram nicht versteht.

Zusammen mit der Tatsache das Microchip einen fertigen USB Stack 
anbietet, hat dies dann dazu gefuehrt, dass ich auf C umgestiegen bin.

Damals noch Hitech C, und der war nicht ganz ausgereift.

Aztec C hab ich auch mal ausprobiert mit WinUAE, zuerst einmal ist der 
Crack kaputt es fehlen 2 kleine Dateien, hatte die aber auf einer CDROM.

Dann stuerzt der Emulator bei jedem kleinem Fehler erstmal ab, alles 
Kommandozeile, Stapelverabeitung zum Linken darfst du auch selber 
schreiben.

Wo ein Wille ist, da ist ein Weg...

Nur mal so dargestellt, ich kann Assembler programmieren.

Mein Punkt ist, dass ich C Compiler als eine Art automatisierte Art 
verstehe, Assembler zu schreiben, d.H. wenn es Sinn macht, denke ich in 
Assembler. Heisst ja auch "Combined Language", also Pointer Arithmetik 
spiegelt die Opcodes fuer indizierte Addressierung wieder. Hingegen 
Pascal,  BASIC oder modernes Windows C++ koennen das nicht, oder es gilt 
als veraltet und "unsicher".

Ja klar du kannst auch heute noch Windows Programme in Assembler 
schreiben, z.B. vor 10 Jahren mal eine library fuer verkettete Listen in 
386er Windows Assembler erstellt. Sehr schnell aber ein falscher Wert, 
und die Anwendung bewirkt eine Schutzverletzung, so ohne weiteres kannst 
du die nicht abfangen, und musst die Anwendung beenden.

von Wolfgang A. (Gast)


Lesenswert?

Takao K. schrieb:
> Das ist sch. egal.

Mit dieser Mentalität entstehen heutzutage Programme für 
Alltagsaufgaben, die schon vor 20 Jahren anständig liefen und dank 
Gedankenlosigkeit und 
die-Rechner-sind-doch-sowieso-fast-endlos-schnell-Mentalität, trotz 
Zunahme der Rechenleistung sich nur noch dinosaurierartig bewegen.
Guck dir mal manch moderne DSOs an (z.B. MSOX2012A). Vom Einschalten bis 
zur Erfassung und Darstellung des ersten Signals braucht so ein Ding 
mindestens genauso lange, wie mein erstes Röhrenoszi, Mitte der 1970er 
Jahre vor der Verschrottung gerettet.

Mit dieser Mentalität dient der Anspruch der Softwerker an die 
Rechenleistung immer als Wurst vor der Nase der Hardwareentwickler, 
statt aus der verfügbaren Hardware Performance den optimalen Nutzen für 
die Anwendung zu ziehen.

von Takao K. (takao_k) Benutzerseite


Lesenswert?

Wolfgang A. schrieb:
> Takao K. schrieb:
>> Das ist sch. egal.
>
> Mit dieser Mentalität entstehen heutzutage Programme für
> Alltagsaufgaben, die schon vor 20 Jahren anständig liefen und dank
> Gedankenlosigkeit und
> die-Rechner-sind-doch-sowieso-fast-endlos-schnell-Mentalität, trotz
> Zunahme der Rechenleistung sich nur noch dinosaurierartig bewegen.
> Guck dir mal manch moderne DSOs an (z.B. MSOX2012A). Vom Einschalten bis
> zur Erfassung und Darstellung des ersten Signals braucht so ein Ding
> mindestens genauso lange, wie mein erstes Röhrenoszi, Mitte der 1970er
> Jahre vor der Verschrottung gerettet.
>
> Mit dieser Mentalität dient der Anspruch der Softwerker an die
> Rechenleistung immer als Wurst vor der Nase der Hardwareentwickler,
> statt aus der verfügbaren Hardware Performance den optimalen Nutzen für
> die Anwendung zu ziehen.

Naja ich habs ja nicht einfach so gesagt, weil es unqualifiziert ist.

Schon richtig, z.B. skype und Microsoft webmail werkeln ohne weiteres 
eine Minute auf der SATA Festplatte vor sich hin, die Animation bleibt 
stehen, dann kommt ein doofes Advert auf, oder du clickst wohin wo du 
garnicht wolltest.

1 Gigabyte ist garnichts fuer bestimmte Softwares, und das im Leerlauf.

Da ist dann wohl jeder Buchstabe ein Objekt, Vektorskalierung fuer den 
Ausdruck gleich auf Vorrat laden, und es braucht eine Instanz vom Flash 
Player die sich dann aufhaengt.

Bei Mikrocontrollern ist es heute schon oft so das man es mit C 
hinbekommt und es ausreichend schnell ist, und dass es 5x soviel 
Speicher braucht macht nix, der Endverkaeufer wird ohnehin den Preis 
verdoppeln oder verdreifachen.

Zum Thema, ja klar kannst du mit Assembler Signale schneller einlesen, 
aber je nach chip ist der Nutzen nicht grenzenlos. Viele chips haben 
schon Hardware ports, teils mit Puffer, oder gleich DMA.

Da gibt es keinen Gewinn mehr wenn es mit Assembler gemacht wird.

Wenn du kein Dollarfetischist bist, der 20,000 Platinen herstellen will, 
kauf dir einfach einen besseren Chip, oder besser, leg dir einen Vorrat 
von passenden Kontrollern an.

Geht was nicht, Lagerschrank auf, neuer Chip, so einfach ist das, keine 
5 Tage damit verbringen es irgenwie mit Assembler zu zaubern.

Auch C kann schon ganz gut optimiert werden, bis zu Faktor 10.

Wer sagt denn dass ein Interrupt fuer das Problem verwendet werden muss? 
EInfach alles einzeln ausschreiben oder mit einem Makro, bitbefehle 
verwenden, und so ein paar 100 Sequenzen nacheinander aufstellen.
Das geht auch recht schnell in C.

OK vielleicht verstehe ich es jetzt falsch, aber damit kann schon der 
Wert eines IO pins als bits im Speicher abgelegt werden. Der uC ist dann 
natuerlich blockiert.

Auch ein serielles RAM kann dafuer verwendet werden, dann muss nur noch 
ein clocking signal (Taktsignal) erzeugt werden.

Sehe ich keinen Vorteil fuer Assembler, ausser dass man einen kleinen 
extra IC braucht.

von Moby (Gast)


Lesenswert?

Takao K. schrieb:
> Irgendwann hat mir mal jemand in der Korrespondenz mitgeteilt, das er
> mein Assemblerprogram nicht versteht.

Dann hast Du entweder Mist geschrieben, den Code nicht ordentlich 
dokumentiert oder derjenige konnte mit Asm nichts anfangen.

Takao K. schrieb:
> Zusammen mit der Tatsache das Microchip einen fertigen USB Stack
> anbietet, hat dies dann dazu gefuehrt, dass ich auf C umgestiegen bin.

Warum nicht. Dann wird ja vieles vorgekaut was man nicht mehr selbst 
coden muß... Könnte es diesbezüglich mit Atmels ASF auch einfacher 
haben. Nur die ganze Sucherei nach gesuchten Funktionalitäten! Und dann 
paßt es doch nicht wie man will oder enthält unangenehme unbekannte 
Nebeneffekte oder gar Fehler. Das altmodische drahtgebundene USB würd 
mich nun gerade auch nicht reizen ;-(

Takao K. schrieb:
> Mein Punkt ist, dass ich C Compiler als eine Art automatisierte Art
> verstehe, Assembler zu schreiben

Wenn es mal so wäre. Statt dessen Compilerfehler, -eigenheiten, 
-sonderwünsche. Alles langsamer, größer und im Entwicklungsprozeß 
komplizierter als nötig. Na dankeschön...

Takao K. schrieb:
> Windows Programme in Assembler

... sind meiner Meinung nach durchaus möglich. Dazu wären aber viel mehr 
Investments in verwendbaren Funktionscode und angepaßte Tools nötig. Es 
gibt in meinen Augen keinen technischen Grund, warum man 
Asm-Programmierung für Windows nicht genauso komfortabel machen könnte 
wie heutzutage mit dem objektorientierten abstrakten Zeug...

Takao K. schrieb:
> Auch C kann schon ganz gut optimiert werden, bis zu Faktor 10.

Nenn alle Faktoren die Du willst. Cleveres Asm, mit dem der 
Programmierer die tatsächliche Hardware richtig ausnutzt, holt das 
C-Geraffel niemals ein.

von Takao K. (takao_k) Benutzerseite


Lesenswert?

Moby schrieb:
> Takao K. schrieb:
>> Irgendwann hat mir mal jemand in der Korrespondenz mitgeteilt, das er
>> mein Assemblerprogram nicht versteht.
>
> Dann hast Du entweder Mist geschrieben, den Code nicht ordentlich
> dokumentiert oder derjenige konnte mit Asm nichts anfangen.
>

Student irgendwo im Ausland hust hust...
Kannste nicht erwarten das alle Welt 18F RISC versteht/ueberhaupt kennt.
Kannste auch nicht erwarten dass sich ein jeder nun gleich auf dein 
Kommando darin einarbeitet, weil du Recht hast. Viele 
Assemblerprogrammierer gehen davon aus dass sie insgeheim irgendiw die 
Welt beherrschen oder zumindest teilweise durch die explicite Eigenart 
ihrer Programme kontrollieren.

C programmierer freuen sich wenn es irgendwie funktioniert, machen den 
Deckel zu, und nun was anderes.

> Takao K. schrieb:
>> Zusammen mit der Tatsache das Microchip einen fertigen USB Stack
>> anbietet, hat dies dann dazu gefuehrt, dass ich auf C umgestiegen bin.
>
> Warum nicht. Dann wird ja vieles vorgekaut was man nicht mehr selbst
> coden muß... Könnte es diesbezüglich mit Atmels ASF auch einfacher
> haben. Nur die ganze Sucherei nach gesuchten Funktionalitäten! Und dann
> paßt es doch nicht wie man will oder enthält unangenehme unbekannte
> Nebeneffekte oder gar Fehler. Das altmodische drahtgebundene USB würd
> mich nun gerade auch nicht reizen ;-(
>

Das ist ja fast schon schizo. Haste noch nie USB gecodet aber es ist 
schon altmodisch.

> Takao K. schrieb:
>> Mein Punkt ist, dass ich C Compiler als eine Art automatisierte Art
>> verstehe, Assembler zu schreiben
>
> Wenn es mal so wäre. Statt dessen Compilerfehler, -eigenheiten,
> -sonderwünsche. Alles langsamer, größer und im Entwicklungsprozeß
> komplizierter als nötig. Na dankeschön...
>

Ja Compiler sind heute alle schlecht aber morgen schon ein bisschen 
besser.
Immer mal wieder neu downloaden, auch ein guter Zeitvertreib.

> Takao K. schrieb:
>> Windows Programme in Assembler
>
> ... sind meiner Meinung nach durchaus möglich. Dazu wären aber viel mehr
> Investments in verwendbaren Funktionscode und angepaßte Tools nötig. Es
> gibt in meinen Augen keinen technischen Grund, warum man
> Asm-Programmierung für Windows nicht genauso komfortabel machen könnte
> wie heutzutage mit dem objektorientierten abstrakten Zeug...
>

also bitte, das gibts doch schon seit vielen Jahren, kannste frei 
downloaded, allerdings immer weniger Programmierer, wirste wohl kaum 
noch einen Hund mit hinterm Ofen hervorlocken koennen.

Kannste dir alles downloaden und dich schoen darin einspinnen, wenns 
dich gluecklich macht. Ich habe es 2004 mal ausprobiert.

> Takao K. schrieb:
>> Auch C kann schon ganz gut optimiert werden, bis zu Faktor 10.
>
> Nenn alle Faktoren die Du willst. Cleveres Asm, mit dem der
> Programmierer die tatsächliche Hardware richtig ausnutzt, holt das
> C-Geraffel niemals ein.

Ja kauf dir einen PIC mit 512K und mach es dein Lebenswerk dafuer ein 
Assemblerprogramm zu schreiben welches den Speicher wirklich voll 
ausnutzt.

Ich hab dir mal mehrere Male geantwortet weil du in einigen Threads 
Antworten verfasst hast. Alles was ich dir noch mitteilen kann ist das 
ich jahrelang in Assembler programmiert habe, und es bei Licht 
betrachtet Erbsenzaehlerei und Murks war.

von Moby (Gast)


Lesenswert?

Takao K. schrieb:
> und es bei Licht
> betrachtet Erbsenzaehlerei und Murks war.

Na tut mir leid für Dich. Ich progge so seit 20 Jahren und werds 
vermutlich auch die nächsten 20 tun ;-)

Takao K. schrieb:
> Ja kauf dir einen PIC mit 512K und mach es dein Lebenswerk dafuer ein
> Assemblerprogramm zu schreiben welches den Speicher wirklich voll
> ausnutzt.

Möglichst wenig Speicher, möglichst kleine MCs sind das Ziel!
Und nur mit Asm auch wirklich erreichbar ;-)

von (prx) A. K. (prx)


Lesenswert?

Takao K. schrieb:
> Kannste nicht erwarten das alle Welt 18F RISC versteht/ueberhaupt kennt.

Hehe. 8-Bit PIC Assembler erschliesst sich nicht auf den ersten Blick. 
Das verströmt noch einen Hauch aus dem Altertum der Rechnerentwicklung.

von Takao K. (takao_k) Benutzerseite


Lesenswert?

Moby schrieb:
> Takao K. schrieb:
>> und es bei Licht
>> betrachtet Erbsenzaehlerei und Murks war.
>
> Na tut mir leid für Dich. Ich progge so seit 20 Jahren und werds
> vermutlich auch die nächsten 20 tun ;-)
>

Wieso gibt es keine Amigas mehr zu kaufen?
Wieso wird die Playstation oder XBOX nicht in Assy programmiert?
Wieso wirst du in einer Neubuchhandlung nicht ein einziges Assy Buch 
finden?

Weil Assy tot ist, und weil viele schon seit mehr als 10 Jahren nix mehr 
davon halten.

spasseshalber schaue ich mir manchmal alte Assembler sources an z.B. von 
MSDOS oder vom Amiga. Heutzutage gibts ja internet, und mit dessen Hilfe 
kannst du besseres lernen als Assembler.

Klar ist es Erbsenzaehlerei, wenn ich tagelang an einem 1K program 
herumfeile und mir Perversitaeten ausdenke wie ich weitere 50 Words 
einsparen kann und wenns es klappt gleich nocheinmal solange bis ich die 
code Dichte auf mindestens 120$ erhoeht habe, und dann reichts nicht 
mehr um das neueste Feature richtig fertigzuprogrammieren.

einfach 50% leerlassen, na und?

> Takao K. schrieb:
>> Ja kauf dir einen PIC mit 512K und mach es dein Lebenswerk dafuer ein
>> Assemblerprogramm zu schreiben welches den Speicher wirklich voll
>> ausnutzt.
>
> Möglichst wenig Speicher, möglichst kleine MCs sind das Ziel!
> Und nur mit Asm auch wirklich erreichbar ;-)

Ja glaubs halt der C Compiler produziert auch nur ASM, kann er sogar 
weit besser als du, wenn du aber primitiven Murks programmierst, gehst 
du vom Gegenteil aus. Und Verwechselt Ausreizen bis zum Anschlag und 
Code hineinstopfen mehr als 100% mit perverse Tricks mit Wartbarkeit 
Lesbarkeit und Portierbarkeit.

Schlag doch mal bei Microsoft vor die sollten Assembler wieder 
einfuehren. Niemand wird dich ernstnehmen. Das haben die vor 30 Jahren 
mal verwendet und eingemottet, sieh mal die Tatsachen.

Heute gibt es Sticks fuer Digital TV, das sind kleine Android PCs, die 
will und kann kein Schwein in Assy programmieren, Doku fuer die Hardware 
gibts auch nirgendwo so dass du es wie in den 1980ern einfach mit 
direktem Zugriff ansprechen kannst.

Schon mal was von Protected Mode gehoert? Viel Spass diesen manuell in 
Assembler zu programmieren. Und bei Mikrocontrollers zieht das jetzt 
auch ein, also speichermanagement, und Application layers.

habe hier z.B. ein paar 8031, will da bald mal was aufbauen, und nur 
fuers Hobby vielleicht ein kleines Assembler programm schreiben...keine 
Prioritaet. Also das ich den Uralt chip dann ausreizen soll oder was mit 
Tricks und Taktzyklen zaehlen?

An einem 8080 emulator arbeite ich auch schon, auf PIC32, also muss ich 
alle Assy Opcodes in C nachprogrammieren, das macht richtig Spass.

von Peter D. (peda)


Lesenswert?

A. K. schrieb:
> Hehe. 8-Bit PIC Assembler erschliesst sich nicht auf den ersten Blick.

Ich hatte mir auch mal die Scenix/Ubicom/Parallax SX Microcontroller 
angesehen. Als ich den Befehlssatz sah, dachte ich, ich bin im falschen 
Film. Und ganz schnell weggeschmissen die beiden Samples.

von Moby (Gast)


Lesenswert?

Takao K. schrieb:
> Weil Assy tot ist, und weil viele schon seit mehr als 10 Jahren nix mehr
> davon halten.

... nix mehr davon verstehen und leider keinen Schimmer davon haben was 
da sinnlos verbraten wird. Nun ja, dann muß eben die Hardware das 
Defizit ausgleichen.

Takao K. schrieb:
> Und bei Mikrocontrollers zieht das jetzt
> auch ein, also speichermanagement, und Application layers.

Die kannst Du ja gerne verwenden (müssen?)...

Takao K. schrieb:
> oder was mit
> Tricks und Taktzyklen zaehlen?

Ich muß in den seltensten Fällen Taktzyklen und Codesize zählen... Denn 
die optimalen Werte stellen sich meist von ganz alleine ein ;-)

von BastiDerBastler (Gast)


Lesenswert?

Es macht halt einen Unterschied, ob man eine Kaffee-Maschine ohne 
Internet programmieren will oder Feature-Produkte mit immer kürzeren 
Produktzyklen...

Wer immer größere Projekte stemmen will, der wird sich irgendwann ein 
gleichförmiges Muster aneignen, damit er mit seinem Geist eine Ebene 
nach oben wandern und Zusammenarbeit in großen Teams überhaupt erst 
möglich machen kann (Weniger Spezialfälle = weniger kognitive Last, 
weniger Kommunikation).
Genau das macht man mit dem C-Compiler. Und der C-Compiler hat im 
Prinzip alle Möglichkeiten, das umzusetzen, was der 
Assembler-Programmierer per Hand machen würde (solange die 
Compiler-Schreiber sich Mühe geben und natürlich nur bis an die Grenzen 
der InterOp-Spefizifizierung). Viele Optimierungsprobleme sind zudem 
NP-vollständig, da hat der schnellere Ausprobierer (=Compiler) die 
größere Wahrscheinlichkeit, eine (nahezu) optimale Lösung zu finden.
Ich würde soweit gehen und sagen: für jeden Trick, den der kleine 
Assembler-Programmierer in seiner Kammer in stundenlanger Mühe 
erarbeitet, könnte man eine Compiler-Direktive erzeugen, die das ganze 
eine Million Mal schneller und noch 10x besser umsetzt.
Statt also über die Compiler zu jammern, sollter der kleine 
Assembler-Programmierer lieber mithelfen, den Compiler verbessern. 
Schließlich hat der Assembler-Programmierer ja das programmieren 
angefangen, um mithilfe von Software und Hardware manuelle 
Arbeitsschritte zu automatisieren, oder gewisse zeitkritische Dinge 
überhaupt erst möglich zu machen. Ich verstehe nicht, warum er da auf 
der (Meta-)Ebene seiner eigenen Arbeit Halt macht.

Aber trotzdem hat es natürlich seinen Charme, selber Compiler zu 
spielen, genauso wie Leute immernoch stricken, obwohl es dafür 
abgefahrene Maschinen gibt, die tausende Male schneller sind und 
"bessere" Ergebnisse erzielen.

Viele Grüße!

von Takao K. (takao_k) Benutzerseite


Lesenswert?

BastiDerBastler schrieb:
>
> Aber trotzdem hat es natürlich seinen Charme, selber Compiler zu
> spielen, genauso wie Leute immernoch stricken, obwohl es dafür
> abgefahrene Maschinen gibt, die tausende Male schneller sind und
> "bessere" Ergebnisse erzielen.
>
> Viele Grüße!

Ja, als Hobby, also nur um sich privat und in der Freizeit daran zu 
erfreuen, oder weil man es halt interessant findet und alles was 
irgenwie was mit ICs und Programmieren zu tun hat studiert und im 
Internet recherchiert.

z.B. Kiwi 68008 Computer, allerdings schon was fuer snobs. Da sowas u.U. 
gernicht so einfach ist, ist der Weg das Ziel, man lernt was, und gibt 
es dann halt auf, also es wird nicht wirklich verwendet.

Es gibt schon viele Programmierer die Assembler kennen und auch alte 
Computer interessant finden, jedoch zu 95% keinen Assembler verwenden 
und dies auch nicht wollen.

von (prx) A. K. (prx)


Lesenswert?

BastiDerBastler schrieb:
> Aber trotzdem hat es natürlich seinen Charme, selber Compiler zu
> spielen,

Eine Zwischenform für Z80 kann dann beispielsweise so aussehen:
1
#define comd(n)   restart(0x18)(L=n;)
2
#define parb(n)   restart(0x28)(L=n;)
3
#define parw(n)   restart(0x38)(HL:=n;)
4
5
cursor::  /* bit cursor */
6
{
7
  comd (CURS);
8
  HL := q.ysize - 1 - ypos;
9
  DE := HL;
10
  DE := HL << 1 + DE << 4;
11
  parw (xpos >> 4 + DE + base);
12
  parb (xpos.low << 4);
13
}
14
15
get::
16
{
17
  do; while (! @rsr & 0x80);
18
  A = @udr;
19
}
Eine Art Mittelding aus Compiler und auch direkt einstreubarem Assembler 
(hier nicht zu sehen). Selber gestrickt als recht simpler Yacc-Parser.

: Bearbeitet durch User
von Moby (Gast)


Lesenswert?

BastiDerBastler schrieb:
> Es macht halt einen Unterschied, ob man eine Kaffee-Maschine ohne
> Internet programmieren will oder Feature-Produkte mit immer kürzeren
> Produktzyklen...

Stimmt. Die Anwendung gibt den Rahmen für die optimale Lösung vor.

> Wer immer größere Projekte stemmen will...

kann das auch in Asm. Eine gewisse Systematik und Vorarbeit 
vorausgesetzt.

> und Zusammenarbeit in großen Teams überhaupt erst
> möglich machen kann (Weniger Spezialfälle = weniger kognitive Last,
> weniger Kommunikation).

Asm stellt sich da nicht in den Weg.

> Ich würde soweit gehen und sagen: für jeden Trick, den der kleine
> Assembler-Programmierer in seiner Kammer in stundenlanger Mühe
> erarbeitet, könnte man eine Compiler-Direktive erzeugen, die das ganze
> eine Million Mal schneller und  noch 10x besser umsetzt.

Na was für ein schöner Traum!

> Statt also über die Compiler zu jammern, sollter der kleine
> Assembler-Programmierer lieber mithelfen, den Compiler verbessern.

Das kann ja gerne tun wer will-
Wer die vollständige Kontrolle über MC und Code für real suboptimale 
Ergebnisse abgeben will- bitteschön.

> angefangen, um mithilfe von Software und Hardware manuelle
> Arbeitsschritte zu automatisieren, oder gewisse zeitkritische Dinge

Asm, automatisierte Abläufe und erst recht zeitkritische Dinge schließen 
sich nicht aus.

> Ich verstehe nicht, warum er da auf
> der (Meta-)Ebene seiner eigenen Arbeit Halt macht.

Weil die einfach optimale Ergebnisse mit minimalem Organisations- und 
Syntaxaufwand bringt. Die Anstrengung lohnt besonders dann, wenn man 
sich leistungsmäßig auf bestimmte Hardware für alle denkbaren 
Einsatzfälle beschränken und seine Codebasis darauf perfekt abstimmen 
kann. Dann ist nämlich auch der Zeitvorteil, den bequemliche 
Hochsprachenprogrammierung für gewöhnlich bringt dahin.

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Das ist die Bastlersicht.

Die Sicht derer, die damit Geld verdienen müssen, ist naturgemäß eine 
andere :-)

Effizienz gibt es eben in mehreren Bereichen - und die stehen sich 
durchaus gegenüber.

von Moby (Gast)


Lesenswert?

Sehr diplomatisch, Chris.
Aber schon der erhebliche Taktzyklusunterschied zwischen C und Asm bei 
leerem Interrupt ist leider alles andere als nur Bastlersicht und 
bedeutet allgemein für den C Code Speed bestimmt nichts gutes ;-)

von Stefan F. (Gast)


Lesenswert?

Eine leere Interrupt Routine ist meisten sinnlos. Der C Compiler erzeugt 
den minimalen Rahmen, in den C Code eingefügt werden kann. Ganz egal, 
was deine Interrupt Rotuine macht, diese Register müssen gesichert 
werden.

Nur beim Sonderfall (leere Interruptroutine) erzeugt der Compiler 
auffällig schlechten Code.

von Peter D. (peda)


Lesenswert?

Moby schrieb:
> bedeutet allgemein für den C Code Speed bestimmt nichts gutes ;-)

Nö.
Das Zyklen knausern ist in der Regel nicht notwendig, 50..200 Zyklen für 
einen Interrupt kein Problem.
Z.B. UART mit 115200Baud an 14.7456MHz kann sich 1280 Zyklen Zeit 
lassen, mit Puffer 2560.

von Moby (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Das Zyklen knausern ist in der Regel nicht notwendig

Hier knausert zunächst mal niemand (das Pulver kann für wirklich 
kritische Fälle trocken bleiben), aber ich bestreite daß

> Nur beim Sonderfall (leere Interruptroutine) erzeugt der Compiler
> auffällig schlechten Code.

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.