首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解代码行#定义LPC_CCAN_API ((CCAN_API_T *) (LPC_ROM_API->candApiBase))

理解代码行#定义LPC_CCAN_API ((CCAN_API_T *) (LPC_ROM_API->candApiBase))
EN

Stack Overflow用户
提问于 2020-05-18 20:35:54
回答 1查看 77关注 0票数 0

我在给恩智浦控制器LPC11C24编程。在一个LPCOpen示例中,我找到了下面这行我想要理解的代码。

代码语言:javascript
复制
#define LPC_CCAN_API    ((CCAN_API_T *) (LPC_ROM_API->candApiBase))

其中CCAN_API_T是一个结构。

代码语言:javascript
复制
typedef struct CCAN_API {
    void (*init_can)(uint32_t *can_cfg, uint8_t isr_ena);
    void (*isr)(void);
    void (*config_rxmsgobj)(CCAN_MSG_OBJ_T *msg_obj);
    uint8_t (*can_receive)(CCAN_MSG_OBJ_T *msg_obj);
    void (*can_transmit)(CCAN_MSG_OBJ_T *msg_obj);
    void (*config_canopen)(CCAN_CANOPENCFG_T *canopen_cfg);
    void (*canopen_handler)(void);
    void (*config_calb)(CCAN_CALLBACKS_T *callback_cfg);
} CCAN_API_T;

其中LPC_ROM_API和candApiBase被定义为

代码语言:javascript
复制
#define LPC_ROM_API     (*((LPC_ROM_API_T        * *) LPC_ROM_API_BASE_LOC))

#define LPC_ROM_API_BASE_LOC      0x1FFF1FF8 

typedef struct {
    const uint32_t usbdApiBase;             /*!< USBD API function table base address */
    const uint32_t reserved0;               /*!< Reserved */
    const uint32_t candApiBase;             /*!< CAN API function table base address */
    const uint32_t pwrApiBase;              /*!< Power API function table base address */
    const uint32_t reserved1;               /*!< Reserved */
    const uint32_t reserved2;               /*!< Reserved */
    const uint32_t reserved3;               /*!< Reserved */
    const uint32_t reserved4;               /*!< Reserved */
} LPC_ROM_API_T;

我知道LPC_ROM_API_BASE_LOC是只读存储器中的一个固定位置,它包含一个指向只读存储器驱动表的指针。这个只读存储器驱动器表是LPC_ROM_API_T。

那么,LPC_ROM_API是否是指向LPC_ROM_API_T类型指针的指针,该指针所指向的地址是LPC_ROM_API_BASE_LOC?

EN

回答 1

Stack Overflow用户

发布于 2020-05-18 21:12:10

要运行各种宏,请执行以下操作:

  • 如你所说,LPC_ROM_API_BASE_LOC是一个指向LPC_ROM_API_T结构的固定位置。
  • LPC_ROM_API是指向从LPC_ROM_API_BASE_LOC读取的LPC_ROM_API_T的指针,强制转换为LPC_ROM_API_T pointer.
  • LPC_ROM_API->candApiBase是指向CCAN_API_T结构的指针。它被存储为常量uint32_t,而不是指针,因此需要转换为CCAN_API_T指针,因为use.
  • LPC_CCAN_API是指向从LPC_uint32_t_API->candApiBase读取的CCAN_API_T结构的指针,并正确转换为CCAN_API_T指针。

您可以直接在LPC_CCAN_API上调用方法:

代码语言:javascript
复制
uint32_t can_cfg = 456;
LPC_CCAN_API->init_can(&can_cfg, 123);

(我不知道API,所以我不知道这些值应该是什么。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61869733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档