[C] Problem bei einer C-Codezeile (Verständisfrage)

OP #4241504
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?
@_@
#4241515
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.
#4241535
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren