Forum: Mikrocontroller und Digitale Elektronik Auf Speicherstelle direkt zugreifen


von sloti (Gast)


Lesenswert?

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

von Floh (Gast)


Lesenswert?

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.
:-)

von sloti (Gast)


Lesenswert?

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.

von maveric00 (Gast)


Lesenswert?

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

von Random .. (thorstendb) Benutzerseite


Lesenswert?

irgendwie so ...
1
#define BB_PIN   *((volatile unsigned int *) 0x23E79068)
2
3
if(BB_PIN) BB_PIN = 0;
4
else BB_PIN = 1;

von Albert .. (albert-k)


Lesenswert?

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.

von sloti (Gast)


Lesenswert?

Das ist P2.0. Der liegt auf 0x2009C054.
das macht dann 0x22000000+ 9c054*32 => 0x22000000+1E79068 = 0x23E79068 .
Kommst du auf ein anderes Ergebnis?

von sloti (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.