mmap 함수 질문입니다.
안녕하세요. 질문이 있습니다.
보드에 TACT 스위치가 32개가 74_16C245를 통해서 연결되어 있습니다.
아래 소스는 간단하게 키 스캔한걸 1초에 한번씩 시리얼로 내보내는건데요.
아래 소스는 short 로 선언이 되어있으니깐 당연히 키 16개만 읽혀지는데요.
그래서 32개 키 값을 다 읽기 위해 2번 처럼(long) 바꿨는데요.
역시 16개만 읽혀지네요.
별짓을 여러가지고 바꿀거 바꿔봤는데요 결과는 똑같구요.
간단한 mmap 함수 사용이니깐 특별할것 없는것 같은데 안되네요.
제가 모르는 부분이 있으시면 지적해주세요.
/////////////////////////////////////////////// ------ 1 번
#define ADDR_PUSHBUTTON 0x14000000
int key_scan(void)
{
unsigned short *button;
button = (volatile short *) mmap(NULL,4,PROT_READ,MAP_SHARED,fd,ADDR_PUSHBUTTON);
if((int)button<0){button=NULL; printf("mmap error\n"); return -1; }
while(1)
{
printf("key_value : %08x\n",*button);
sleep(1);
}
return 0;
}
/////////////////////////////////////// ------------- 2 번
#define ADDR_PUSHBUTTON 0x14000000
int key_scan(void)
{
unsigned long *button;
button = (volatile long *) mmap(NULL,4,PROT_READ,MAP_SHARED,fd,ADDR_PUSHBUTTON);
if((int)button<0){button=NULL; printf("mmap error\n"); return -1; }
while(1)
{
printf("key_value : %08x\n",*button);
sleep(1);
}
return 0;
}
/////////////////////////////////////////////// ------ 1 번
#define ADDR_PUSHBUTTON 0x14000000
int key_scan(void)
{
unsigned short *button;
button = (volatile short *) mmap(NULL,4,PROT_READ,MAP_SHARED,fd,ADDR_PUSHBUTTON);
if((int)button<0){button=NULL; printf("mmap error\n"); return -1; }
while(1)
{
printf("key_value : %08x\n",*button);
sleep(1);
}
return 0;
}
/////////////////////////////////////// ------------- 2 번
#define ADDR_PUSHBUTTON 0x14000000
int key_scan(void)
{
unsigned long *button;
button = (volatile long *) mmap(NULL,4,PROT_READ,MAP_SHARED,fd,ADDR_PUSHBUTTON);
if((int)button<0){button=NULL; printf("mmap error\n"); return -1; }
while(1)
{
printf("key_value : %08x\n",*button);
sleep(1);
}
return 0;
}
mmap 의 2번째 인수가 크기입니다. 4로 지정했으니 4byte 가 됩
mmap 의 2번째 인수가 크기입니다. 4로 지정했으니 4byte 가 됩니다. 캐스팅을 뭐로 했는가가 중요한게 아니라 만들어진 메모리맵이 4바이트니까 당연히 그만큼만 읽히죠.
캐스팅쪽 문제가 아니라 보드에서 값을 넣어주지 못하거나 하는 것입니다. 아니면 뒷부분 4바이트가 더 있다면 2번째 인수가 8이 되어야 합니다.
========================================
* The truth will set you free.
네
물론 인수를 8로도 바꿔봤구요
그래도 결과는 마찬가지입니다.
그리고 인수가 4byte 라고 해도 32bit access 하는데는
문제가 없지 않나요?
보드 reference manual을 잘 읽어보시기 바랍니다. 일단 0x
보드 reference manual을 잘 읽어보시기 바랍니다. 일단 0x14000000에 32개의 키가 다 mapping되어 있는지 여부가 가장 중요합니다. 이게 아니라면 mmap을 아무리 바꿔봐야 소용 없습니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
아 .그리고
보드에서는 물리적으로 확실하게 키 값이 들어갑니다.
cinsk님의 말은 해당 버스폭이 정확하게 32bits인지를 말씀하시는
cinsk님의 말은 해당 버스폭이 정확하게 32bits인지를 말씀하시는 것 같은데요...
만약 해당 보드에서 스위치에 대한 버스가 16bits로 설정되어 있다면 아무리 해도 읽혀지지 않겠죠...
댓글 달기