Forum: Mikrocontroller und Digitale Elektronik [C] Problem bei einer C-Codezeile (Verständisfrage)


von X. A. (wilhem)


Lesenswert?

Hi,

in dem freien Quellcode (Autoquad 6: http://autoquad.org/?lang=de) habe 
ich folgende C-Zeile gefunden:
1
#define FLASH_WRITE_ADDR    (0x08000000 + (uint32_t)FLASH_PAGE_SIZE * 63)    // use the last KB for storage

Soweit ich verstehe, handelt es sich darum, um die Bestimmung der 
Adressen in der FLASH des Mikrocontrollers (ein STM32F103).

Ok. In einer anderen Datei wird dann eine
1
float
 Variable deklariert und der folgende Wert zugewiesen:
1
ver = *(float *)FLASH_WRITE_ADDR;

Mir ist diese Zuweisung nicht klar. Was wird zugewiesen? Eine Adresse 
eines Zeigers? Oder ein Zeiger?
Verblüffend finde ich, dass es dann geprüft wird, ob die Variable var 
einen gültigen float Wert besitzt oder nicht.
1
    if (isnan(ver))
2
  configWriteFlash();
3
    else if (ver >= p[CONFIG_VERSION])
4
  configReadFlash();
5
    else if (p[CONFIG_VERSION] > ver)
6
  configWriteFlash();

Dann wird es doch in ver ein float Wert zugewiesen?
@_@

: Verschoben durch User
von Max H. (hartl192)


Lesenswert?

Überelgen wir mal was der Präprozessor hier macht:
Er sersezt
1
ver = *(float *)FLASH_WRITE_ADDR;
durch
1
ver = *(float *)(0x08000000 + (uint32_t)FLASH_PAGE_SIZE * 63);
Du nimmst also die Adresse (als uint32_t) castest sie in einen (float-) 
Pointer und dereferenzierst diesen. Du interpretierst also die Bytes die 
an der Stelle (0x08000000 + (uint32_t)FLASH_PAGE_SIZE * 63) ff. im 
Speicher stehen als float und weist sie ver zu.

Kurz gesagt: ver wird die float zugewiesen die an der Adresse 
FLASH_WRITE_ADDR im Speicher steht.

: Bearbeitet durch User
von Philipp M. (spannungsabfall)


Lesenswert?

Die Zeile interpretiert das, was an der Speicheradresse ist als Float 
und speichert diesen Float-Wert in der Variablen var.

(float*)X ist ein Cast von X auf einen Float-Zeiger. Sprich dem Compiler 
wird gesagt: an Speicherstelle X sind Daten, die er als Float 
interpretieren soll.

Mit dem * vorne wird der Floatzeiger derefernziert, also der Wert aus 
der Speicherstelle gelesen, auf den der Zeiger zeigt.

 ver = *((float*)FLASH_WRITE_ADDR); //wäre deutlicher.

Konstruiere einen Float-Zeiger der auf FLASH_WRITE_ADDR zeigt. 
Anschließend gib mir den Wert auf den der konstruierte Zeiger zeigt. Da 
der Zeiger ein Float-Zeiger ist, werden die Daten in der Speicherstelle 
auch automatisch als Float interpretiert.

: Bearbeitet durch User
von X. A. (wilhem)


Lesenswert?

Super Erklärung!!!

Ja, mit dem Befehl
1
 ver = *((float*)FLASH_WRITE_ADDR)
wäre es viel deutlicher.

Danke!!!!

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.