gpt4 book ai didi

c - 为 32 位微 Controller 编写掩码的替代方法

转载 作者:太空狗 更新时间:2023-10-29 16:39:58 25 4
gpt4 key购买 nike

我正在从事一个涉及32 位 ARM 微 Controller 编程的项目。与许多嵌入式软件编码工作一样,设置和清除位是必不可少且重复性很强的任务。当使用微处理器而不是 32 位来设置和清除位时,屏蔽策略很有用。但是当使用 32 位微 Controller 时,每次我们需要设置/清除一位时都写掩码是不切实际的。

编写函数来处理这个问题可能是一个解决方案;然而,拥有一个功能会占用内存,这对我来说并不理想。

在使用 32 位微处理器时,是否有任何更好的选择来处理位设置/清除?

最佳答案

在 C 或 C++ 中,您通常会为位掩码定义宏并根据需要组合它们。

/* widget.h */
#define WIDGET_FOO 0x00000001u
#define WIDGET_BAR 0x00000002u

/* widget_driver.c */
static uint32_t *widget_control_register = (uint32_t*)0x12346578;

int widget_init (void) {
*widget_control_register |= WIDGET_FOO;
if (*widget_control_register & WIDGET_BAR) log(LOG_DEBUG, "widget: bar is set");
}

如果您想从位位置而不是绝对值定义位掩码,请根据移位操作定义常量(如果您的编译器不优化这些常量,那是无望的)。

#define WIDGET_FOO (1u << 0)
#define WIDGET_BAR (1u << 1)

您可以定义宏来设置位:

/* widget.h */
#define WIDGET_CONTROL_REGISTER_ADDRESS ((uint32_t*)0x12346578)
#define SET_WIDGET_BITS(m) (*WIDGET_CONTROL_REGISTER_ADDRESS |= (m))
#define CLEAR_WIDGET_BITS(m) (*WIDGET_CONTROL_REGISTER_ADDRESS &= ~(uint32_t)(m))

您可以定义函数而不是宏。这具有在编译期间添加类型验证的优点。如果您在 header 中将函数声明为 static inline(或什至只是 static),一个好的编译器会在任何地方内联该函数,因此在您的源代码中使用一个函数会赢不会花费任何代码内存(假设为函数体生成的代码小于函数调用,对于仅在寄存器中设置一些位的函数来说应该是这种情况)。

/* widget.h */
#define WIDGET_CONTROL_REGISTER_ADDRESS ((uint32_t*)0x12346578)
static inline void set_widget_bits(uint32_t m) {
*WIDGET_CONTROL_REGISTER_ADDRESS |= m;
}
static inline void set_widget_bits(uint32_t m) {
*WIDGET_CONTROL_REGISTER_ADDRESS &= ~m;
}

关于c - 为 32 位微 Controller 编写掩码的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24128884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com