2016-10-10 25 views
0

我有一些代码需要在2个不同的PCB上运行。在启动时,代码会检测/知道它运行的硬件并设置标志。指向端口寄存器位的指针

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

我可以很容易地检查到处使用信号A的标志 - 但是这个解决方案对我来说似乎并不“好”。

我也可以很容易地像这样更改端口在启动:

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

,并使用注册来访问每个HW正确的端口。

但是,如何更改位的位置呢?我现在没有像寄存器中的某个指针那样的东西 - 这实际上是我认为我需要的东西。

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

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

感谢 MCL

+0

即使你*可能*有一个指向单个位的指针,你将如何在没有'if'语句的情况下检查它? –

+0

通过使用位掩码,说'if(cIsHW1)掩码= 0x02; else mask = 0x08;'然后用'Reg&mask'读取端口位,它将是'== 0'或'!= 0'。 –

+0

使用位移运算符。设置:'var | =(1 << bitnum)',阅读:'res =(var >> bitnum)&1' –

回答

1

只是收集在一个结构依赖于硬件的数据,并找出在启动时使用哪一个:

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; 
} 

如果你能找出在编译使用哪一个当然,你可以通过永远不要定义冗余的来优化它。

+0

谢谢。你有一个想法,如果这会比经典的如果 - 其他决定选择的决定更快? ...我其实是这么认为的。 – McLion

+0

@McLion这取决于。这种方法会导致额外的内存访问来加载寄存器和掩码,而不是将它们内联到指令流中,但另一方面不会跳转。 – unwind

+0

谢谢。 ...仍在与之战斗:HWcur-> TXreg | = HWcur-> mask;返回无效| =操作数...用我的Pxy指针指向寄存器的东西仍然是错误的。 – McLion