2016-08-05 26 views
0

Ich kann diesen Teil des Codes nicht verstehen Kann mir jemand erklären, was vor sich geht?Funktionsname umgewandelt in uint32_t

Ich habe ein 2 Funktionen:

void timer_irq_handler(void) { 
    .... 
} 

void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) { 
    .... 
} 

dann habe ich so etwas wie dieses:

NVIC_SetVector(TIM_MST_IRQ, (uint32_t)timer_irq_handler); 

Ich verstehe nicht leer Funktion (uint32_t)

+0

Es wirft den Funktionszeiger (vom Typ 'void (*) (void)') auf ein 'uint32_t', vermutlich um es in einem Interrupt-Vektor zu speichern. –

+0

Danke für die schnelle Antwort, jetzt verstehe ich mehr, aber eine weitere Frage, um vollständig erzogen werden. Was ist das Ergebnis dieses Castings? ist es die Adresse dieses Zeigers? – Wodji

+0

Es ist geradezu tödlich, wenn das System ein 64-Bit-System ist. Bei einem 32-Bit-System wird der Zeiger als Zahl übertragen - keine besonders gute Übung, aber es würde wahrscheinlich "funktionieren". Der Code sollte 'uintptr_t'; Es wird dann auf Maschinen arbeiten, wo 'sizeof (void *) == sizeof (void (*) (void))', das ist die meisten (aber nicht alle) Maschinen. –

Antwort

-1

Funktionsnamen zu werfen ist ein Zeiger, werfen Sie einen Zeiger auf uint32_t ist in Ordnung.

+0

Nicht auf einem 64-Bit-System: dort ist eine Umwandlung vom Zeiger auf "uint32_t" eine Möglichkeit; es gibt keinen Weg zurück zum ursprünglichen Wert, wenn Sie die Hälfte der Bits weggeworfen haben. –

+0

@ JonathanLeffler obwohl es einige Bits fallen lassen wird, aber immer noch kann zu werfen. vielleicht eine Warnung. C ist gefährlich. – zzn

+0

Ich möchte hinzufügen, meine Frage ist über Stm32 Mikroprozessor mit 32-Bit-Architektur. – Wodji