谁能解释一下这个复杂的指针表达式?
Can anyone explain this complicated pointer expression?
我在下面的代码行中找到了它,它是驱动程序库中的一个函数调用。我试图理解这个指针表达式。但是很难理解。
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)
它是用ROM_SYSCTLTABLE的第7项的数据作为函数指针(函数的地址)调用它,并传递SYSCTL_PERIPH_GPIDA作为它的uint32_t参数。返回的任何值都不可用于调用方。
ROM_SYSCTLTABLE[6]
保存了一些 data.That 数据是函数所在的内存位置 stored.This 函数接受类型为 uint32_t
和 returns 的参数。当你写
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
这意味着您通过将参数传递为 0xf0000800
来调用该函数
整行形成一个函数调用,函数地址在 ((0x010001d)+6) 中,类型转换为以一个 uint32_t 作为参数,没有 return 值,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)
我在下面的代码行中找到了它,它是驱动程序库中的一个函数调用。我试图理解这个指针表达式。但是很难理解。
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)
它是用ROM_SYSCTLTABLE的第7项的数据作为函数指针(函数的地址)调用它,并传递SYSCTL_PERIPH_GPIDA作为它的uint32_t参数。返回的任何值都不可用于调用方。
ROM_SYSCTLTABLE[6]
保存了一些 data.That 数据是函数所在的内存位置 stored.This 函数接受类型为 uint32_t
和 returns 的参数。当你写
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
这意味着您通过将参数传递为 0xf0000800
整行形成一个函数调用,函数地址在 ((0x010001d)+6) 中,类型转换为以一个 uint32_t 作为参数,没有 return 值,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)