【发布时间】:2021-02-04 12:05:37
【问题描述】:
所以我一直在互联网上寻找答案,但没有得到任何答案。
我想知道的是微控制器(ARM mcu、AVR mcu)的结构样式寄存器定义是否消耗 RAM。我知道如果实例化结构的对象,它将消耗 RAM(在堆栈上或其他地方)。
但是据我所知,ARM 在其 CMSIS 中使用的寄存器定义类似于下面的寄存器定义,类似于新的 ATTiny 系列用于其寄存器定义的寄存器定义。
这些是否专门消耗 RAM 内存。我很确定它们会在一定程度上消耗闪存/程序空间,但是 RAM?
#define PORT ((Port *)0x41008000UL) /**< \brief (PORT) APB Base Address */
typedef struct {
PortGroup Group[4]; /**< \brief Offset: 0x00 PortGroup groups [GROUPS] */
} Port;
typedef struct {
__IO PORT_DIR_Type DIR; /**< \brief Offset: 0x00 (R/W 32) Data Direction */
__IO PORT_DIRCLR_Type DIRCLR; /**< \brief Offset: 0x04 (R/W 32) Data Direction Clear */
__IO PORT_DIRSET_Type DIRSET; /**< \brief Offset: 0x08 (R/W 32) Data Direction Set */
__IO PORT_DIRTGL_Type DIRTGL; /**< \brief Offset: 0x0C (R/W 32) Data Direction Toggle */
__IO PORT_OUT_Type OUT; /**< \brief Offset: 0x10 (R/W 32) Data Output Value */
__IO PORT_OUTCLR_Type OUTCLR; /**< \brief Offset: 0x14 (R/W 32) Data Output Value Clear */
__IO PORT_OUTSET_Type OUTSET; /**< \brief Offset: 0x18 (R/W 32) Data Output Value Set */
__IO PORT_OUTTGL_Type OUTTGL; /**< \brief Offset: 0x1C (R/W 32) Data Output Value Toggle */
__I PORT_IN_Type IN; /**< \brief Offset: 0x20 (R/ 32) Data Input Value */
__IO PORT_CTRL_Type CTRL; /**< \brief Offset: 0x24 (R/W 32) Control */
__O PORT_WRCONFIG_Type WRCONFIG; /**< \brief Offset: 0x28 ( /W 32) Write Configuration */
__IO PORT_EVCTRL_Type EVCTRL; /**< \brief Offset: 0x2C (R/W 32) Event Input Control */
__IO PORT_PMUX_Type PMUX[16]; /**< \brief Offset: 0x30 (R/W 8) Peripheral Multiplexing */
__IO PORT_PINCFG_Type PINCFG[32]; /**< \brief Offset: 0x40 (R/W 8) Pin Configuration */
RoReg8 Reserved1[0x20];
} PortGroup;
注意:以上代码块中提供的所有代码都是来自 EEVBlog 用户的直接引用。它与 CMSIS 中提供的寄存器定义有关。链接是here。
编辑:我知道 MCU 有寄存器并且访问这些寄存器不会消耗 RAM。但我的困惑在于这些寄存器被引用的方式。例如:
// if a register address is 0x50
#define address 0x50 // This consumes no RAM as it is resolved during compilation
uint8_t addr = 0x50; // This consumes RAM because it is now a variable
// So what about this??
typedef struct {
uint8_t addr = 0x50;
} address_group;
所以访问寄存器本身不会占用 RAM 空间,但我们用来轻松引用这些地址的方法,在这种情况下使用结构,是我感到困惑的地方。
所有寄存器都可以一个一个地#define'd,这不会消耗RAM,但是选择以结构格式进行......?
【问题讨论】:
-
不,它们不消耗任何内存
-
它们也不消耗闪存。
-
不需要内存。
-
哇,3 个人说他们不消耗 RAM。那么它们在编译过程中都解决了吗?还是在预处理器阶段?
-
通常您定义一个指向该数据类型的指针并将内存映射寄存器块的地址分配给该指针。通过取消引用指针,您可以直接访问硬件寄存器。这就是第一行对
PORT宏的作用,它甚至省略了指针变量本身。