2016-10-10 45 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