2015-02-12 66 views
2

我在驅動程序庫的函數調用代碼行下面找到了它。我正試圖理解這個指針表達式。但很難理解。任何人都可以解釋這個複雜的指針表達式嗎?

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); 

下面的代碼行是上述代碼組件的定義。

#define SYSCTL_PERIPH_GPIOA  0xf0000800 // GPIO A 
#define ROM_SysCtlPeripheralEnable           \ 
    ((void (*)(uint32_t ui32Peripheral))ROM_SYSCTLTABLE[6]) 
#define ROM_SYSCTLTABLE   ((uint32_t *)(ROM_APITABLE[13])) 
#define ROM_APITABLE   ((uint32_t *)0x01000010) 
+1

這是一個函數指針演員陣容,這意味着你可以用'ROM_SysCtlPeripheralEnable'就好像它是返回'void',並採取了'uint32_t'參數的函數的名稱。 – 2015-02-12 07:31:41

回答

3
ROM_SYSCTLTABLE[6] 

持有一些data.That數據是存儲位置,其中一個功能是stored.This函數採用uint32_t類型的參數,並返回什麼。當你寫

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); 

這意味着你通過傳遞參數作爲0xf0000800調用該函數

1

它是利用在ROM_SYSCTLTABLE的第七項作爲函數指針(一個函數的地址)中的數據,調用它並傳遞SYSCTL_PERIPH_GPIDA作爲其uint32_t的參數。返回的任何值都不可用於調用者。

+1

它是「ROM_SYSCTLTABLE」的第七項,而不是「ROM_APITABLE」。它不是一個指針。它是一個存儲爲'uint32_t'的地址,它被轉換爲函數指針。 – user694733 2015-02-12 07:42:33

+0

@ user694733:是的,你是對的。我已經更新了我的答案。 – wallyk 2015-02-12 08:32:08

0

整線形成與功能的地址的函數調用是(0x010001d)+6)的類型轉換爲一個uint32_t作爲參數,並且沒有返回值,0xf0000800是傳遞的值。

((void (*)(uint32_t ui32Peripheral))( -->TypeCasted to take uint32_t as parameter 
     *((uint32_t*) (*(((uint32_t *)0x01000010) + 13))) + 6) --> Function Address 
    ) (0xf0000800); --> Function Parameter (as per the type casting) 
相關問題