Очень часто встречается во всех разработках по внедрению встроенного ПО (не забывайте ключевое слово volatile
).
*(volatile int *)LOCATION = a;
и способ его печати
printf("a is : %d\n, *(volatile int *)LOCATION);
или если выхотите сохранить адрес a
*(volatile int **)LOCATION = &a;
и как его распечатать
printf("Address if a is : %p, a is: %d\n, (void *)*(volatile int **)LOCATION, **(volatile int **)LOCATION);
Пример из реальной жизни:
#define GPIOA_BASE 0x40000000
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
{
__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint16_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
uint16_t RESERVED0; /*!< Reserved, 0x06 */
__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
__IO uint16_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */
uint16_t RESERVED1; /*!< Reserved, 0x12 */
__IO uint16_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
uint16_t RESERVED2; /*!< Reserved, 0x16 */
__IO uint32_t BSRR; /*!< GPIO port bit set/reset registerBSRR, Address offset: 0x18 */
__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
__IO uint32_t AFR[2]; /*!< GPIO alternate function low register, Address offset: 0x20-0x24 */
__IO uint16_t BRR; /*!< GPIO bit reset register, Address offset: 0x28 */
uint16_t RESERVED3; /*!< Reserved, 0x2A */
}GPIO_TypeDef;
и использование:
GPIOA -> MODER = value;
__IO
определяется как volatile
#define __IO volatile