2015-02-12 95 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) 
相关问题