Forum: Compiler & IDEs ARM7 Bit setzen mit Konstante oder Variable


von Geri (Gast)


Lesenswert?

Hallo zusammen

Werden die zwei Varianten auf einem LPC2148 / ARM7 eigentlich gleich 
schnell ausgeführt (gcc)?
1
// Variante 1
2
#define MODULE_LED  0x00000010
3
FIO0SET = MODULE_LED;
4
5
// Variante 2
6
uint32_t MODULE_LD = 0x000000010
7
FIO0SET = MODULE_LED;

Variante 2 dünkt mich halt schon flexibler, wenn man mal einen Pin 
ändert

Beste Grüsse und Danke für eure Infos

Geri

von Karl H. (kbuchegg)


Lesenswert?

Geri schrieb:
> Hallo zusammen
>
> Werden die zwei Varianten auf einem LPC2148 / ARM7 eigentlich gleich
> schnell ausgeführt (gcc)?

Was schneller ist, musst du ausprobieren.

> Variante 2 dünkt mich halt schon flexibler, wenn man mal einen Pin
> ändert

Wie kommst du zu dieser Einsicht?
Wenn sich ein Pin ändert, änderst du in der ersten Version das #define, 
compilierst neu und alles ist wieder in Butter.

Variante2 brauchst du nur dann, wenn sich die Pinnummer zur Laufzeit des 
Programms ändern kann. Zb weil das benutzerkonfigurierbar sein soll.

von Geri (Gast)


Lesenswert?

Hallo Karlheinz

Danke für deine Infos.

>>Was schneller ist, musst du ausprobieren.
:) Habe mir gedacht, das kann man pauschal schon sagen.


>>Wie kommst du zu dieser Einsicht?
>>Wenn sich ein Pin ändert, änderst du in der ersten Version das #define,
>>compilierst neu und alles ist wieder in Butter.

Wie du auch angemerkt hast, kann man die Pinkonfiguration später per 
Software ändern. Wenn man nun die Register auch noch in Variablen 
anlegt, dann hat ma halt ein sehr flexibl konfigurierbares System

Eine Mögklichkeit wären vielleicht auch Compiler-Direktive. Wenn es aber 
keine Performanceeinbussen gibt, dann würde ich die flexiblere Variante 
bevorzugen.

Beste Grüsse

Geri

von Geri (Gast)


Lesenswert?

Wen es interessiert

Mein gcc macht aus den folgenden Anweisungen folgenden Code.

1
// gcc mit Optimierung auf Speed 
2
#define Mask #0x00000001
3
FIO0SET = 0x00000001;
4
5
0x000052C0  E3E03103  MVN       R3,#0xC0000000
6
0x000052C4  E2433A03  SUB       R3,R3,#0x00003000
7
0x000052C8  E3A02001  MOV       R2,#Maske(0x00000001)
8
0x000052CC  E5032FE7  STR       R2,[R3,#-0x0FE7]
9
10
11
uint32_t Mask = 0x00000001;
12
FIO0SET = Mask; // Variable
13
14
0x000052B0  E59F3030  LDR       R3,[PC,#0x0030]
15
0x000052B4  E3E02103  MVN       R2,#0xC0000000
16
0x000052B8  E5931000  LDR       R1,[R3]

Ich bin kein Assembler-Experte, der erste Fall kommt mir aber doch recht 
umständlich vor und sieht grausig aus.

Eigentlich hätte ich erwartet:
1.) Lade Portregister bzw. dessen Adresse
2.) Lade Konstante in ein Register
3.) Schreibe Inhalt der Konstanten an die Portadresse


Liegt es es vielleicht an Code der zuvor ausgeführt wurde?

Das wären dann meiner Ansicht nach drei Instruktionen


Beste Grüsse

Geri

von (prx) A. K. (prx)


Lesenswert?

Es gibt keine direkte Adressierung von Speicher/IO-Adressen und keinen 
Befehl, der in nur einem 32-Bit Befehlswort eine komplette 32-Bit 
Adresse ins Register laden kann. Adressen können also:

- PC-relativ aus dem Codesegment geladen werden. Das ist hier die zweite 
Version. Sie ist aufgrund des ROM-Zugriffs langsamer und braucht 1 
Wort/Halbwort für den Befehl und 1 Wort für die Adresse. Hier also 4 
Worte insgesamt, von denen nur 3 gezeigt sind, das vierte Wort liegt im 
constant pool.

- aus mehreren Befehlen mit Konstanten Werten zusammengesetzt werden. 
Das ist die erste Version. Die ist schneller, benötigt aber abhängig vom 
Wert der Adresse u.U. mehr als 2 Worte allein dafür.

Von der Länge her sind also hier beide Versionen effektiv gleich, die 
erste ist aber schneller.

von Geri (Gast)


Lesenswert?

Hallo Andreas

Vielen Dank für die Klarstellung. Ich habe mir gedacht, hier läuft es 
auch einfach mit Instruktionen zählen:). Wenn es aber so ist wie du 
schreibst, dann bekommt die Ausgabe des gcc doch wieder einen Sinn.

Beste Grüsse

Geri

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.