2016-10-10 7 views
0

2 개의 다른 PCB에서 실행해야하는 코드가 있습니다. 부팅시 코드는 실행되는 하드웨어를 감지/인식하여 플래그를 설정합니다.비트 레지스터의 포인터 레지스터

일부 신호는 하드웨어에 따라 포트를 변경합니다 (예 : HW1의 경우 ). 신호 A는 다른 하드웨어의 P14에서는 0x02에 있지만 P9에서는 0x08에 있습니다.

신호 A가 사용되는 모든 곳에서 플래그를 쉽게 확인할 수 있습니다. 그러나이 솔루션은 나에게 '좋은'것 같지 않습니다.

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

을 각 HW에 올바른 포트에 액세스하기 위해 등록을 사용

또한 쉽게 이런 일에 부팅 할 때 포트를 변경할 수 있습니다.

그러나 비트 위치도 어떻게 변경합니까? 이제는 레지스터에있는 포인터에 대한 포인터 같은 것이 없습니다. 실제로 필요한 것이 무엇인지 생각해보십시오.

이 포트 비트를 읽고 설정해야합니다.

무언가를 놓치거나 그 포트 비트에 액세스해야하는 모든 곳의 깃발을 확인해야합니까?

감사 MCL

+0

단일 비트에 대한 포인터를 가질 수 있더라도'if' 문 없이는 어떻게 검사할까요? –

+0

비트 마스크를 사용하여 'if (cIsHW1) mask = 0x02; else mask = 0x08;'그리고 나서'== 0' 또는'! = 0'이 될'Reg & mask'로 포트 비트를 읽습니다. –

+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

감사. 선택을 결정하는 결정에 고전적인 if-else를 사용하는 것보다 빠르다면 아이디어가 있습니까? ... 사실 그렇게 생각합니다. – McLion

+0

@McLion 그게 달려 있습니다. 이 접근법은 레지스터 스트림과 마스크를로드하는 대신에 명령 스트림에서 인라인 할 수있는 여분의 메모리 액세스를 유도하지만 다른 한편으로는 점프가 발생하지 않습니다. – unwind

+0

감사. ... 여전히 그걸로 싸우고 있습니다 : HWcur-> TXreg | = HWcur-> mask; 무효를 반환합니다 = 피연산자 ... 레지스터에 대한 내 Pxy 포인터와 함께 뭔가가 여전히 잘못입니다. – McLion

관련 문제