C语言 谁能解释一下这个复杂的指针表达式?

z9smfwbn  于 2023-08-03  发布在  其他
关注(0)|答案(3)|浏览(108)

我在下面的代码行中发现了这个,这是驱动程序库中的一个函数调用。我在试着理解这个指针表达式。但这很难理解。

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)

ahy6op9u

ahy6op9u1#

ROM_SYSCTLTABLE[6]

字符集
保存一些数据。该数据是存储函数的内存位置。此函数接受uint32_t类型的参数,并不返回任何内容。当你写作的时候

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);


这意味着您通过将参数作为0xf0000800传递来调用该函数

rqenqsqc

rqenqsqc2#

它使用ROM_SYSCTLTABLE的第七个条目中的数据作为函数指针(函数的地址),调用它并传递SYSCTL_PERIPH_GPIDA作为其uint32_t参数。返回的任何值对调用方都不可用。

yqhsw0fo

yqhsw0fo3#

整行构成一个函数调用,函数的地址在 (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)

字符集

相关问题