使用宏设置位

问题描述 投票:0回答:1

我正在学习MCU编程(使用RISC-V)。为了设置某些功能的位,定义了宏。这些使用位地址。这是一个示例宏。

`#define Red_V_enable_output(x) *((uint32_t *) 0x10012008) |= (1<<(x))

称为使用引脚启用输出,即

Red_V_enable_output(5);

我的理解是,使用值 5 进行按位或,将第 5 位设置为 1,即启用引脚 5。不清楚的是为什么宏实际上设置了该值,为什么它不返回存储在该地址中的值(OR 之后)?

请详细解释宏的作用。

宏有效,我只是不明白为什么。

pointers macros
1个回答
0
投票

如果查看“uint32_t *”转换,编译器会采用数字“0x10012008”并将其视为指向 uint32_t 的指针。 换句话说,内存中的一个位置。然后前面有一个star,所以“|=”并不作用于地址,而是作用于它所指向的内容。所以它设置的结果是 1 的或等于结果左移传入的值 - 5。

© www.soinside.com 2019 - 2024. All rights reserved.