Moin, ich verwende den IAR Kickstart Compiler und benutzte einen NXP LPC 1768 ARM Cortex M3. Für eine Zeitkritische aufgabe ist es nötig ein paar Zeilen in Assembler zu schreiben, um sie so effektiv wie möglich zu machen. Ich will eine bestimmte stelle im SRAM auslesen, um genau zu sein einen I/O PIN. Über das Bit-Banding ist der Pin auf die Addresse 0x23E79068 gemapped. Jetzt meine Frage: Wie kann ich am schnellsten auf den Wert zugreifen. Ich hab mir das eigentlich ungefähr so vorgestellt: LDR r0,[0x0x23E79068], aber das wäre wohl zu einfach. Es funktioniert auf jeden Fall nicht. Ich hoffe es kann mir jemand helfen. mfg Erik
sloti schrieb: > Für eine Zeitkritische aufgabe ist es nötig ein paar > Zeilen in Assembler zu schreiben, um sie so effektiv wie möglich zu > machen. Wenn du noch keine Erfahrung damit hast (so hört es sich für mich an), schlägt dich der Compiler sowieso. Schreibs doch erstmal in Hochsprache und schau, obs reicht. :-)
Das habe ich schon gemacht. Das Programm steht schon in C. Allerdings will(oder muss) ich jetzte einen kleinen Teil mit inline Assembler ersetzen, da es eben noch schneller sein müsste.
Hallo, dann lass Dir das Programm zuerst einmal in Assembler zwischenübersetzen und sieh nach, ob diese Stelle wirklich noch optimierbar ist. Gerade bei einfachen Elementen ist die Wahrscheinlichkeit eher gering - vor allem, wenn man keine detaillierten Kenntnisse über die Abläufe innerhalb des Zielprozessors hat (wie z.B. mögliches Prefetching, Pipelining o.ä.). Selbst ohne den ganzen Kram muss man dann noch zumindest wissen, welche Zugriffe am schnellsten ablaufen (so wie darmals John Carmac bei Doom float-Memory-Zugriffe für Integergrößen verwendet hat, da diese im 486 schneller waren als die Integer-Zugriffe). Bei einer Wette Amateur gegen Compiler würde ich definitiv auf Compiler setzen. Schöne Grüße, Martin
irgendwie so ...
1 | #define BB_PIN *((volatile unsigned int *) 0x23E79068)
|
2 | |
3 | if(BB_PIN) BB_PIN = 0; |
4 | else BB_PIN = 1; |
Bist du dir sicher das du die Addresse für das Bit Banding richtig berechnet hast? Sag mal den Pin und die Port adresse die du auslesen willst.
Das ist P2.0. Der liegt auf 0x2009C054. das macht dann 0x22000000+ 9c054*32 => 0x22000000+1E79068 = 0x23E79068 . Kommst du auf ein anderes Ergebnis?
Die Addresse war falsch. Sie lautet eigentlich 0x23380A80. Und ich hab die Anzahl der Befehle von 20 auf 10 reduzieren können. Sieht wohl so aus als hätte hier jemand ne Wette verloren :P.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.