這是一些帶有中斷向量的啟動檔案摘錄。
#pragma DATA_SECTION(interruptVectors, ".intvects")
void (* const interruptVectors[])(void) =
{
(void (*) (void))((uint32_t)&__STACK_END),
resetISR,
nmi_ISR,
fault_ISR,
... /* More interrupt vectors */
void (* const interruptVectors[])(void)
- 是必須包含函式名稱的函式指標陣列,但我無法理解(void (*) (void))((uint32_t)&__STACK_END)
語法。
(void (*) (void))
看起來像一個指向函式的指標,它什么都不回傳,沒有引數,也沒有名稱。可能嗎?
(uint32_t)&__STACK_END
是一個指標。為什么函式指標和指標在一起?
提前致謝!
uj5u.com熱心網友回復:
這看起來像 ARM 處理器或類似的中斷向量表。中斷向量表包含中斷處理程式的地址,因此它本質上是一個函式指標陣列。
該表的第一個條目是堆疊指標的初始化值。顯然不是函式指標,而是資料指標,所以需要進行一些型別轉換。不是因為處理器關心型別,而是因為 C 關心。
因此&__STACK_END
可以推測某些指標型別指向堆疊末尾的資料地址。然后將其轉換為普通的 32 位數字,最后轉換為函式指標。
可能已經可以跳過第一次轉換uint32_t
并直接從資料指標轉換到函式指標,但這樣做可能是為了確保在給定編譯器上正確完成轉換。
嚴格來說,在 C 標準中,這種從資料指標到函式指標的轉換是不合法的,即使中間有整數轉換也是如此。但是,大多數嵌入式編譯器都可以做到這一點,因為這是您需要做的典型事情。
uj5u.com熱心網友回復:
CORTEX-M 的向量表的第一個值是堆疊指標的初始值,看起來像你的情況。此語法是將整個向量表定義為型別為 void(*function)(void) 的函式指標的常量陣列,同時將第一個值定義為堆疊指標值作為常量的一種技巧。
我個人認為有更好的方法可以更清楚地定義這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/496786.html
下一篇:如何使用CMake和-L/usr/include/mariadb/mysql-lmariadbclient編譯C