Объясните подробно строчки на Си
Это от микроконтроллеров 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 шт):
После сложения, где, например, получается 0x5012 мы преобразовываем это число в адрес указателя, в типе даных uint8_t
А volatile нужен, чтобы предупредить компилятор не делать дополнительных оптимизаций, переносов таких значений в регистр и т.д., чтобы мы прямо работали именно в оперативной памяти в этом месте (подробнее про volatile тут)
А потом мы разыменовываем указатель
То есть у нас был указатель на uint8_t (без знаковый 1 байт), на байт в памяти, и мы сразу после этого получаем значение по этому адресу, и можем спокойно делать с этими областями памяти read/write
Таким образом мы обращаемся к регистрам PD_ODR, PD_DDR и PD_CR1, которые строго лежат по какому-то адресу