c - 指向端口寄存器中位的指针

标签 c pointers bit

我有一些代码需要在 2 个不同的 PCB 上运行。启动时,代码确实会检测/知道它在哪个硬件上运行并设置一个标志。

现在,一些信号根据硬件改变端口,即: 在 HW1 上,信号 A 位于 P9 上的 0x08,而在其他硬件上,信号 A 位于 P14 上的 0x02。

我可以轻松地检查使用信号 A 的所有位置的标志 - 但是这个解决方案对我来说似乎不太“好”。

我还可以轻松地在启动时更改端口,如下所示:

if(cIsHW1) Reg = &P14;         
      else Reg = &P9;

并使用 Reg 访问每个硬件上的正确端口。

但是,如何更改位位置呢?我现在不存在指向寄存器中某个位的指针之类的东西 - 这实际上是我认为我需要的。

我需要读取这些端口位并设置/清除它。

我是否错过了某些东西,或者我真的需要在需要访问该端口位的所有地方检查标志(如果..否则)吗?

谢谢 麦克L

最佳答案

只需收集结构中与硬件相关的数据,并找出启动时使用哪一个:

struct hw_config {
  volatile uint32_t *reg;
  uint32_t mask;
} boardA = { .reg = &P14, .mask = 8 },
  boardB = { .reg = &P9,  .mask = 2 },
  * board;

int main(void)
{
  // Figure out which board we're on, and set the board pointer.
  board = running_on_board_a() ? &boardA : boardB;

  // Example usage.
  *board->reg |= board->mask;
}

如果您可以在编译时确定使用哪一个,那么您当然可以通过不定义冗余的来优化它。

关于c - 指向端口寄存器中位的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39955086/

相关文章:

c - 从c中的字符串中获取整数

c - 动态数组的大小

c++ - vector in struct 耗时吗?使用指针更好吗?

c++ - 将 Big Endian 格式位转换为预期的十进制值,同时忽略第一位

swift - 创建二进制 header

c - 如何在 Linux 中获取 C/C++ 中的内存访问类型

c - 套接字上带有 sendfile 的管道 C 损坏

c - 在C中有效地初始化结构内部的指针

c - 在C中如何将字符串的每一行保存到一个新字符串中?

java - Java 中将位打包到 byte[] 并读回的最有效方法是什么?