Итак, я искал ответ в Интернете и нигде не получил.
Что я хочу знать, так это то, потребляют ли определения регистров в стиле структуры для микроконтроллеров (ARM mcu, AVR mcu) оперативную память. Я знаю, что если объект структуры создан, он будет потреблять ОЗУ (либо в стеке, либо где-то еще).
Но как насчет определений регистров, подобных приведенным ниже, которые используются ARM в их CMSIS и аналогичны тому, что новая серия ATTiny использует для своих определений регистров, насколько мне известно.
Они специально потребляют оперативную память. Я совершенно уверен, что они будут несколько потреблять флэш-память/программное пространство, но ОЗУ?
#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. Ссылка находится здесь.
РЕДАКТИРОВАТЬ: я понимаю, что у микроконтроллеров есть регистры, и доступ к этим регистрам не потребляет ОЗУ. Но меня смущает способ обращения к этим регистрам. Например :
// 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;
Таким образом, доступ к самим регистрам не будет занимать место в ОЗУ, но метод, который мы используем для простого обращения к этим адресам, в данном случае с использованием структур, - это то, что меня смущает.
Все регистры могут быть #define'd один за другим, что не будет потреблять ОЗУ, но выбор сделать это в формате структуры ...?
PORT
, в котором даже отсутствует сама переменная-указатель. - person Gerhardh   schedule 04.02.2021