如何在 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?