Объясните подробно строчки на Си

Это от микроконтроллеров STM8. Объясните пожалуйста что тут происходит, желательно "для самых маленьких".

#define _SFR_(mem_addr)     (*(volatile uint8_t *)(0x5000 + (mem_addr)))

/* PORT D */
#define PD_ODR      _SFR_(0x0F)
#define PD_DDR      _SFR_(0x11)
#define PD_CR1      _SFR_(0x12)

Понятно что например тут складывается 0x5000 c 0x12, чтоб получился адрес регистра PD_CR1 0x5012. Зачем тут все эти скобки и звездочки, что тут происходит.


Ответы (1 шт):

Автор решения: LolPopGames

После сложения, где, например, получается 0x5012 мы преобразовываем это число в адрес указателя, в типе даных uint8_t

А volatile нужен, чтобы предупредить компилятор не делать дополнительных оптимизаций, переносов таких значений в регистр и т.д., чтобы мы прямо работали именно в оперативной памяти в этом месте (подробнее про volatile тут)

А потом мы разыменовываем указатель

То есть у нас был указатель на uint8_t (без знаковый 1 байт), на байт в памяти, и мы сразу после этого получаем значение по этому адресу, и можем спокойно делать с этими областями памяти read/write

Таким образом мы обращаемся к регистрам PD_ODR, PD_DDR и PD_CR1, которые строго лежат по какому-то адресу

→ Ссылка