2013-03-12 5 views
0

안녕하세요,암 컨트롤러 lm3s8962

저는 임베디드 코딩에 초보입니다. ARM lm3s8962 컨트롤러에서 일하고 있습니다.

누구든지 아래 코드가하는 일을 설명 할 수 있습니까? 그것은 비트 뱅킹을 구현하지만 그것을 구현하는 방법을 알고 싶습니다.

//***************************************************************************** 
// 
// Macros for hardware access, both direct and via the bit-band region. 
// 
//***************************************************************************** 
#define HWREG(x)                \ 
     (*((volatile unsigned long *)(x))) 
#define HWREGH(x)                \ 
     (*((volatile unsigned short *)(x))) 
#define HWREGB(x)                \ 
     (*((volatile unsigned char *)(x))) 
#define HWREGBITW(x, b)              \ 
     HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 |    \ 
       (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) 
#define HWREGBITH(x, b)              \ 
     HWREGH(((unsigned long)(x) & 0xF0000000) | 0x02000000 |    \ 
       (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) 
#define HWREGBITB(x, b)              \ 
     HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 |    \ 
       (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) 
+0

어, 그게 뭐야? 그것들은 단지 매크로/프로그래머 단축키 일뿐입니다. 그들은 혼자서 아무것도하지 않습니다. – tangrs

+0

답장을 보내 주셔서 감사합니다. hWREG가 hwregh 및 b와 동일한 주소를 반환하는 것처럼 프로세스가 어떻게 진행되는지 알고 싶습니다. 그러나 HWREGBITB (X, b)는 비트를 설정합니다 (그렇지 않은 경우). 잘못) 나는이 비트를 어떻게 세우고 있는지 알고 싶다. 나는 많은 교대 조작에서 혼란 스럽다. plz가 그것을 설명 할 수 있을까? 다시 고맙습니다 – user2159417

답변

1

매크로에 대한 선언입니다. 그들은 기능이 아니며 아무것도 반환하지 않습니다. 그것들은 단지 약간 더 똑똑한 검색 및 교체 일뿐입니다. 귀하의 코멘트에 대한 응답으로

HWREG(x)는이 프리 프로세서를 통해 실행하면 그 매개 변수와 substitues x (포인터 존중 즉 주소 x에서 가치를 얻을 수있는) (*((volatile unsigned long *)(x)))로 대체됩니다.

HWREG은 어떤 형태로든 어떤 종류의 주소를 사용한다고 추론 할 수 있습니다. 이것은 HWREGBITB이하는 일을 해결하는 데 도움이 될 것입니다. (가정의 long은 32 비트 넓은)

  • (| 0x02000000) 가장 중요한 4 개 비트를 제외한 모든 비트를 클리어 :

    HWREGBITB(x, b)x 값,

    1. (((unsigned long)(x) & 0xF0000000))가있어 소요되는 다음 4를 설정합니다 비트를 값 2로 바꿉니다.
    2. (| (((unsigned long)(x) & 0x000FFFFF) << 5)) : 원본의 하위 20 비트를 가져와 x 왼쪽으로 5 비트 이동합니다. 그런 다음 OR 결과로.
    3. (| ((b) << 2)) : b을 가져 와서 2 비트 시프트하고 결과로 OR합니다. 그것은 당신이 다른 매크로의 의미를 해결하기 위해 비슷한 방법을 사용할 수 있습니다 HWREG

    를 사용하여 역 참조

  • 는 주소로 최종 결과를 치료합니다.

    하드웨어 측면에서 구체적으로 무엇을할지는 액세스하는 하드웨어와 주변 장치의 레지스터에 따라 다릅니다. 추측을해야만한다면 AXI 버스에서 일종의 트랜잭션을 수행하고 있다고 말할 수 있습니다.

    +0

    고맙습니다. 덕분에 도움이됩니다. – user2159417

    +0

    개념을 지웠습니다. 메모리에 액세스하는 것이 좋습니다. 예 : WHREGBITW (& g_ulFlags, 0)^= 1; 여기에 그것은 비트를 토글하는 것입니다, 지금 당신은 그것을 액세스하는 방법을 명확하게 plz 수 있습니다. – user2159417

    +0

    간단히 말해, 매크로를 사용하면 변수처럼 하드웨어 레지스터에 액세스 할 수 있습니다. 'gHWREGBITW (& g_ulFlags, 0)^= 1'을'var^= 1'과 같이 생각하면됩니다. – tangrs