리눅스에서 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
?
나는 당신이 볼 수 있듯이 조금 혼란 스럽다.
'(uint32_t *)'그것은 캐스트이며,'*'는 방금 캐스팅 한 객체를 역 참조합니다. – user2485710
'sw_addr'은'void *'(포인터)로 정의됩니다. '(uint32_t *)'이것은'void *'가 이제'uint32_t'에 대한 포인터라는 캐스트입니다. 가장 왼쪽의'*'는'(uint32_t *) sw_addr'가 가리키는 정수를 가져 와서 스위치에 저장한다고 말합니다. 주목할 점은'* (int *) sw_addr'으로 변경하거나'uint32_t switches '로'uint32_t'로 정의 된'switches'를 변경하는 것이 좋습니다. 이것은 유형을 일관되게 유지합니다. –
그래서 void 대신 sw_addr을 uint32_t로 정의하는 것이 더 낫습니다. – user3597998