Forum: Compiler & IDEs Erklärung Codeausschnitt aus LM3S9B95.c


von Alex74 (Gast)


Lesenswert?

Hallo Zusammen!

Ich arbeite gerade an einem Projekt dem Easy MX Pro v7 Board.
Verbaut ist der LM3S9B95 Prozessor mit ARM Architektur.

Beim Durchforsten der mitgelieferten LM3S9B95.c-Datei
stoße ich immer wieder auf folgende (oder ähnliche) Zeilen
Quelltext, die mir noch unklar sind.
1
sfr unsigned long   volatile GPIO_PORTJ           absolute 0x4003D000;
2
sfr unsigned long   volatile GPIO_PORTJ_DATA_BITS absolute 0x4003D000;
3
sfr unsigned long   volatile GPIO_PORTJ_DATA      absolute 0x4003D3FC;
4
    const register unsigned short int GPIO_PORTJ_DATA0 = 0;
5
    sbit  GPIO_PORTJ_DATA0_bit at GPIO_PORTJ_DATA.B0;
6
    const register unsigned short int GPIO_PORTJ_DATA1 = 1;
7
    sbit  GPIO_PORTJ_DATA1_bit at GPIO_PORTJ_DATA.B1;
8
    const register unsigned short int GPIO_PORTJ_DATA2 = 2;
9
    sbit  GPIO_PORTJ_DATA2_bit at GPIO_PORTJ_DATA.B2;
10
    const register unsigned short int GPIO_PORTJ_DATA3 = 3;
11
    sbit  GPIO_PORTJ_DATA3_bit at GPIO_PORTJ_DATA.B3;
12
    const register unsigned short int GPIO_PORTJ_DATA4 = 4;
13
    sbit  GPIO_PORTJ_DATA4_bit at GPIO_PORTJ_DATA.B4;
14
    const register unsigned short int GPIO_PORTJ_DATA5 = 5;
15
    sbit  GPIO_PORTJ_DATA5_bit at GPIO_PORTJ_DATA.B5;
16
    const register unsigned short int GPIO_PORTJ_DATA6 = 6;
17
    sbit  GPIO_PORTJ_DATA6_bit at GPIO_PORTJ_DATA.B6;
18
    const register unsigned short int GPIO_PORTJ_DATA7 = 7;
19
    sbit  GPIO_PORTJ_DATA7_bit at GPIO_PORTJ_DATA.B7;

Hier mal ein etwas größerer Ausschnitt aus der Code-Datei.

Unklarheiten:
1) Was bewirkt das Kürzel sfr? Die Bedeutung der Abkürzung
(-> Special Function Register) ist mir klar, auch wofür ein SFR
da ist. Was tut das Schlüsselwort jedoch im QC?
2) Das Wort >volatile< in dem o.g. Zusammenhang, genauso wie >absolute<.
3) sbit  GPIO_PORTJ_DATA0_bit at GPIO_PORTJ_DATA.B0
sbit ist soweit ich weiss, einfach nur ein Bitsetz-Befehl. Den 
Zusammenhang der obigen Zeile verstehe ich jedoch leider nicht.

Es wäre nett, wenn ihr mir etwas auf die Sprünge helfen könntet.

Viele Grüße
Alexei

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Alex74 schrieb:

> Beim Durchforsten der mitgelieferten LM3S9B95.c-Datei
> stoße ich immer wieder auf folgende (oder ähnliche) Zeilen
> Quelltext, die mir noch unklar sind.

Ich glaube, du bist hier im falschen Forum gelandet.

Ich kann mir nicht vorstellen, dass ein GCC derartiges wirklich
parsen kann.

> 1) Was bewirkt das Kürzel sfr? Die Bedeutung der Abkürzung
> (-> Special Function Register) ist mir klar, auch wofür ein SFR
> da ist. Was tut das Schlüsselwort jedoch im QC?

Das musst du den Compilerhersteller fragen, falls es nicht
irgendwie als Präprozessormakro in einer der Headerdateien
definiert wird.

> 2) Das Wort >volatile< in dem o.g. Zusammenhang, genauso wie >absolute<.

Naja, "volatile" ist komplett entsprechend C-Standard.

Bei "absolute" kann man nur ahnen, dass damit eine Information an
den Linker weitergegeben wird, auf welcher Adresse die damit
deklarierte Variable platziert werden soll.  Wiederum: Compiler-
hersteller fragen.

> 3) sbit  GPIO_PORTJ_DATA0_bit at GPIO_PORTJ_DATA.B0
> sbit ist soweit ich weiss, einfach nur ein Bitsetz-Befehl.

Das kann alles Mögliche sein.  Wenn es nicht in einer Headerdatei
als Makro zu finden ist, ja du ahnst es schon: Compilerhersteller
fragen. ;-)

von Karl H. (kbuchegg)


Lesenswert?

Alex74 schrieb:

Um noch ein wenig auf Jörgs Antwort aufzubauen

> Es wäre nett, wenn ihr mir etwas auf die Sprünge helfen könntet.

Das einzige was in deinem Codeausschnitt Standard-C ist (neben dem 
ganzen Datentyp Geplänkel), ist das (tatsächliche) Schlüsselwort 
'volatile'. Und was es damit auf sich hat, kannst du hier
FAQ: Was hat es mit volatile auf sich
nachlesen.

Alles andere ist herstellerspezifisch.
Man kann das machen, was im amerikanischen Sprachgebrauch ein "educated 
guess" genannt wird.
Also: wenn ich raten müsste, dann würde ich vermuten, dass damit so was 
wie Pseudovariablen (zb GPIO_PORTJ) eingeführt werden, und diese im 
Adressraum des Prozessors an bestimmte Hardwareadressen festgenagelt 
werden. Warum? Weil genau an diesen Adressen der Prozessor seine 
Steuerregister einblendet. Daraus folgt auch, dass hier der 
COmpiler/Linker nicht einfach diese Register-Variablen, so wie bei 
anderen Variablen, einfach irgendwo in den Speicher pappen darf, sondern 
dass diese Register-Zugriffs-Variablen an genau definierten Stellen im 
Adressraum liegen müssen. Also im Prinzip sowas wie: Im Grunde kannst du 
in einem Haus die Gasanschlüsse machen wo du willst. Nur einer nicht - 
der Hausanschluss der von der Strasse kommt. Der liegt schon in der Erde 
und wenn du dein Haus baust, dann musst du zwingend den Hausanschluss an 
dieses Rohr anschliessen, dessen Position der AUstrittsöffnung fix 
vorgegeben ist.

Und dieser sfr - absolute Mechanismus macht genau das, für die Dinge,m 
die eben hardwaremässig vorgegeben sind.

Das wäre mein 'educated guess'

Genaueres weiß der Compiler-Hersteller.

von Alex74 (Gast)


Lesenswert?

Hi ihr Zwei!

Danke für die Infos, das klingt sinnig.

Ich werde mich mit dem Compiler-Hersteller in Verbindung setzen bzw. das 
beim Compiler mitgelieferte 'Büchchen' durchblättern.

Vielen Dank!

Gruß
Alexei

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.