结构式寄存器定义是否消耗 RAM

问题描述

所以我一直在互联网上寻找答案,但一无所获。

我想知道微控制器(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,但选择以struct格式进行...?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)