2014-11-01 3 views
0

리눅스에서 ARM A9를 코딩하는 법을 배우고 있습니다. 지금 나는 LED와 같은 주변 장치에 접근한다. 내 코드는 실제로 작동하지만 부분적으로 자습서를 기반으로합니다. 이해가 안 유일한 한 부분은 다음과 같습니다누군가이 포인터 사용법을 설명해 주시겠습니까?

void *virtual_base; 
    void *led_addr; 
    void *sw_addr; 
    int fd; 
    int switches; 
    switches=*(uint32_t *)sw_addr; 

`

내가 이해하지 못하는 부분 내가 *(uint32_t *)sw_addr;

*sw_addr 의미를 작성해야 할 이유가 변수입니다 어떤 경우에는 특정 주소를 가리 킵니다. 제 경우에는 특정 주변 장치 레지스터를 가리 킵니다.이 주소에서 읽으면 내 보드에있는 스위치의 상태를 읽습니다. 하지만 무엇이

*(uint32_t *)sw_addr 을 의미합니까? 어떻게 해석합니까? 왜 내가 쓸 수 없습니까? switches= sw_addr?

나는 당신이 볼 수 있듯이 조금 혼란 스럽다.

+0

'(uint32_t *)'그것은 캐스트이며,'*'는 방금 캐스팅 한 객체를 역 참조합니다. – user2485710

+0

'sw_addr'은'void *'(포인터)로 정의됩니다. '(uint32_t *)'이것은'void *'가 이제'uint32_t'에 대한 포인터라는 캐스트입니다. 가장 왼쪽의'*'는'(uint32_t *) sw_addr'가 가리키는 정수를 가져 와서 스위치에 저장한다고 말합니다. 주목할 점은'* (int *) sw_addr'으로 변경하거나'uint32_t switches '로'uint32_t'로 정의 된'switches'를 변경하는 것이 좋습니다. 이것은 유형을 일관되게 유지합니다. –

+0

그래서 void 대신 sw_addr을 uint32_t로 정의하는 것이 더 낫습니다. – user3597998

답변

2

sw_addr은 void 포인터입니다. void 포인터는 역 참조 할 수 없습니다. void는 유형이 없기 때문입니다. 즉 변수 선언에 void a; 같은 것이 없습니다. 따라서 포인터가 참조 해제되기 전에 포인터는 uint32_t*으로 캐스팅됩니다. sw_addr의 주소 값은 역 참조 될 때 uint32_t로 해석됩니다.

편집 : 부호가있는 특정 연산은 부호가있는 int (부호가있는 반면에 uint32_t은 부호가 없음)의 결과를 지정하므로 안전하지 않을 수 있습니다. intuint32_t에 저장된 번호를 나타낼 수 없습니다. unsigned int은 더 큰 수를 저장할 수 있기 때문에 int은 32 비트 크기가 보장되지 않기 때문입니다.

0

은의이 단계로 그것을 분해 보자

  1. sw_addr가 변수입니다. 변수 값은 X입니다.
  2. 메모리에서 X 주소는 변수 "switches"에 읽고 자하는 32 비트 (4 바이트) 값을 저장합니다.
  3. *sw_addr은 "주소 X의 값"을 의미합니다. 즉, "스위치"로 읽으려는 값을 의미합니다. 컴파일러가 읽고 자하는 데이터의 크기를 알 수 없기 때문에 sw_addr 이후
  4. 유형 void *의, 우리는 switches = *sw_addr;을 쓸 수 없습니다. 어쩌면 당신은 단지 1 바이트, 아마도 2 바이트, 아마도 4 바이트를 읽으 려하고있을 것입니다.
  5. 캐스팅 (uint32_t *)sw_addr은 에 대한 포인터 인 것처럼 sw_addr을 보도록 컴파일러에 지시합니다. 이는 부호없는 32 비트 값에 대한 포인터를 의미합니다.
  6. *((uint32_t *)sw_addr);은 (내가 명확성을 위해 괄호의 또 다른 한 쌍을 추가했지만, 그것은 중요하지 않습니다)에 캐스팅으로 주소 X.
  7. 에서 4 바이트 부호없는 값, 즉 우리의 (uint32_t *)sw_addr 포인터가 가리키는 값을 의미 장소에서 우리는 switches=*(uint32_t *)sw_addr;을 쓸 수 있으며 주소 X에서 4 바이트를 읽어 switches에 넣으려는 것이 분명합니다.

또한, 우리는 쓸 수 있었다 다음

uint32_t *sw_addr; 
int switches; 

switches=*sw_addr; 
0

는 "인형에 대한"대답은 :

그것은 의미
*(uint32_t *)sw_addr means? 

, 나에게 데이터의 uint32_t 가치 (32 비트)에서 제공 여기서 sw_addr가 가리 킵니다. 알 수없는 크기의 뭔가

How do you interpret it? 

void *sw_addr 점은, 그것은 void pointer입니다. uint32_t 포인터로 전송하면 32bit unsigned integer을 가리 킵니다. 그런 다음 데이터가 필요하면 32 bits (모든 캐스트가 정확하고 만들어 질 수 있다고 가정)을 얻습니다. 이 말처럼 때문에

Why I just cant write switches= sw_addr? 

당신이 switches = *sw_addr을 의미 가정, 그건 : 나에게 포인터 sw_addr 데이터의 알 수없는 양을 지정 (우리는 유형의 너무 가리키는 모른다).

관련 문제