我有一些代码需要在 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/