【问题标题】:C with microcontrollers: starting address of struct to be a specific address?带有微控制器的C:结构的起始地址是特定地址?
【发布时间】:2012-05-21 16:40:29
【问题描述】:

我正在阅读一些关于指针和结构的东西,但我就是不明白: 单片机的头文件中有这样的内容:

#define NVIC_BASE (SCS_BASE + 0x0100) /*< NVIC Base Address */ (1)
#define NVIC ((NVIC_Type *) NVIC_BASE) /*< NVIC configuration struct */ (2)

在后面的代码中,可能有这样的:

NVIC->ICER[0] = (1<<4);

这(因为定义)是否对应于:

(NVIC_Type *) NVIC_BASE).ICER[0] = (1<<4);

NVIC_Type 只是一个类型定义的结构,带有一些用于设置和清除中断的寄存器。很明显,(2)以某种方式管理结构起始地址是 NVIC_BASE 地址。 但是怎么做?

括号中的这个结构之后的指针(*)是什么(NVIC_Type *)?

【问题讨论】:

    标签: c pointers struct c-preprocessor


    【解决方案1】:

    NVIC_BASE 是地址。 (NVIC_Type *) 是一个强制转换,这意味着当您引用 NVIC 引用时,它将被解释为指向 NVIC_Type 结构的指针。

    因此,当您编写NVIC-&gt;ICER[0] 时,就好像 NVIC 是一个已声明的结构,但具有一个常量地址。这样,结构的布局与外围内存映射相匹配,并且使用给定的基地址,寄存器排成一行,让您可以操作您的硬件。

    另外,是的,NVIC-&gt;ICER[0] = (1&lt;&lt;4);(*(NVIC_Type *) NVIC_BASE).ICER[0] = (1&lt;&lt;4); 相同

    【讨论】:

    • 不应该是((NVIC_Type *) NVIC_BASE)-&gt;ICER[0] = (1 &lt;&lt; 4);吗?使用额外的(-&gt; 而不是.
    • 我把它改成了(*(NVIC_Type *)NVIC_BASE).ICER[0]。我已经编辑了我的答案以反映这一点。感谢您的关注!
    猜你喜欢
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2022-12-11
    相关资源
    最近更新 更多