如何在 C++ 中为位设置定义通用函数?
How to define universal function for bit setting in C++?
我在 C++ 中遇到以下问题。我有一个变量,它是一个指向 mcu 外设寄存器的指针
uint32_t volatile * ctrl_reg;
我已经为给定的 32 位字中的位设置定义了一个函数。此函数不仅用于设置外围寄存器中的位,而且还用于公共 32 位变量。
uint32_t bitMask(uint8_t bitPos)
{
return 1UL << bitPos;
}
void setBit(uint32_t *word, uint8_t bitPos)
{
*word = *word | bitMask(bitPos);
}
我的问题是我一打电话
setBit(ctrl_reg, enable_bit);
编译器警告我指向 volatile uint32_t
的指针与指向 uint32_t
的指针不兼容。我明白了,但我不知道如何以干净的方式解决我的问题,即如何使用通用函数在寄存器和通用变量中进行位设置。有人可以帮忙吗?提前致谢。
// Example program
#include <iostream>
template<class T>
uint32_t bitMask(T bitPos)
{
return 1UL << bitPos;
}
template<class T>
void setBit(uint32_t *word, T bitPos)
{
*word = *word | bitMask(bitPos);
}
int main()
{
{
uint32_t j = 2;
uint32_t * ctrl_reg = &j;
std::cout <<"\n"<< j;
for(uint32_t enable_bit = 2; enable_bit < 8; enable_bit++)
{
setBit(ctrl_reg, enable_bit);
}
std::cout <<"\n" << j;
}
{
uint32_t j = 2;
uint32_t * ctrl_reg = &j;
std::cout <<"\n" << j;
for(uint64_t enable_bit = 2; enable_bit < 8; enable_bit++)
{
setBit(ctrl_reg, enable_bit);
}
std::cout <<"\n" << j;
}
}
输出:
2
254
2
254
简单地不要编写英国媒体报道软件来隐藏简单和可读的位操作。
ctrl_reg |= 1u << n;
已经超快且可读性超强。此代码无法 得到改进。每个 C 程序员都可以快速浏览一下它的功能,它与代码一样规范。
唯一可能的改进是使用命名位掩码,例如:
#define CTRL_FOO (1u << 5)
#define CRTL_BAR (1u << 6)
...
ctrl_reg = CRTL_FOO | CTRL_BAR;
有关如何 access/declare 硬件注册的更多信息,请点击此处:
How to access a hardware register from firmware?
我在 C++ 中遇到以下问题。我有一个变量,它是一个指向 mcu 外设寄存器的指针
uint32_t volatile * ctrl_reg;
我已经为给定的 32 位字中的位设置定义了一个函数。此函数不仅用于设置外围寄存器中的位,而且还用于公共 32 位变量。
uint32_t bitMask(uint8_t bitPos)
{
return 1UL << bitPos;
}
void setBit(uint32_t *word, uint8_t bitPos)
{
*word = *word | bitMask(bitPos);
}
我的问题是我一打电话
setBit(ctrl_reg, enable_bit);
编译器警告我指向 volatile uint32_t
的指针与指向 uint32_t
的指针不兼容。我明白了,但我不知道如何以干净的方式解决我的问题,即如何使用通用函数在寄存器和通用变量中进行位设置。有人可以帮忙吗?提前致谢。
// Example program
#include <iostream>
template<class T>
uint32_t bitMask(T bitPos)
{
return 1UL << bitPos;
}
template<class T>
void setBit(uint32_t *word, T bitPos)
{
*word = *word | bitMask(bitPos);
}
int main()
{
{
uint32_t j = 2;
uint32_t * ctrl_reg = &j;
std::cout <<"\n"<< j;
for(uint32_t enable_bit = 2; enable_bit < 8; enable_bit++)
{
setBit(ctrl_reg, enable_bit);
}
std::cout <<"\n" << j;
}
{
uint32_t j = 2;
uint32_t * ctrl_reg = &j;
std::cout <<"\n" << j;
for(uint64_t enable_bit = 2; enable_bit < 8; enable_bit++)
{
setBit(ctrl_reg, enable_bit);
}
std::cout <<"\n" << j;
}
}
输出:
2
254
2
254
简单地不要编写英国媒体报道软件来隐藏简单和可读的位操作。
ctrl_reg |= 1u << n;
已经超快且可读性超强。此代码无法 得到改进。每个 C 程序员都可以快速浏览一下它的功能,它与代码一样规范。
唯一可能的改进是使用命名位掩码,例如:
#define CTRL_FOO (1u << 5)
#define CRTL_BAR (1u << 6)
...
ctrl_reg = CRTL_FOO | CTRL_BAR;
有关如何 access/declare 硬件注册的更多信息,请点击此处:
How to access a hardware register from firmware?