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
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
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:
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;
}
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
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.
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
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?
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.
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!
ö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.
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.
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.
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.
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
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...
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!
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
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.
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
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?
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...
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?
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
@ 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 ;-)
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!
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?
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.
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.
Peter Dannegger schrieb:> Beim AVR-GCC dauert ein leerer Interrupt 23 ZyklenPeter 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...
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.
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?
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 ;-)
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.
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.
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.
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.
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.
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.
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.
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 ;-)
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.
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.
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.
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 ;-)
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!
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.
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.
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.
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.
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 ;-)
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.
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.
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.