【问题标题】:Can anyone explain this complicated pointer expression?谁能解释这个复杂的指针表达式?
【发布时间】:2015-02-12 07:29:41
【问题描述】:

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

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_SysCtlPeripheralEnable,就好像它是返回void并接受uint32_t参数的函数的名称。

标签: c arm embedded microcontroller cortex-m3


【解决方案1】:
ROM_SYSCTLTABLE[6] 

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

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这是ROM_SYSCTLTABLE 的第七个条目,而不是ROM_APITABLE。它不是一个指针。它是一个存储为uint32_t 的地址,被转换为函数指针。
    • @user694733:是的,你是对的。我已经更新了我的答案。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      相关资源
      最近更新 更多