인프런 커뮤니티 질문&답변

박진수님의 프로필 이미지
박진수

작성한 질문수

ARM Cortex-M 프로세서 프로그래밍

s402_메모리 맵 IO

메모리 맵 질문

작성

·

209

0

메모리 맵 자체는 data width가 1바이트인데, 0xE000ED00의가 가리키는 값은 왜 4바이트 인가요?

답변 1

0

홍영기님의 프로필 이미지
홍영기
지식공유자

안녕하세요. 박진수님

말씀하신 0xE000ED00 는 SCB(system control block) - CPUID 하드웨어 레지스터의 주소입니다.

이 레지스터는 32비트 크기를 갖고 있고요.

C 프로그램에서 이 레지스터를 접근하려고 하면 다음과 같은 방법으로 가능합니다.

volatile unsigned int* hwreg_cpuid = (unsigned int*)0xE000ED00;

temp = *hwreg_cpuid

여기서 unsigned char* 나 unsigned short* 을 사용하지 않고 unsigned int* 을 사용한 이유는 그 레지스터의 크기가 32비트라서 그렇습니다.

메모리맵과 버스에 대한 이해를 위하여 다음의 정보 글을 읽어보시기를 추천드립니다.

 

박진수님의 프로필 이미지
박진수
질문자

답변 감사드립니다. 궁금한게 하나 더있는데요. 32bit 레지스터에 들어가는 값이 int 형이라 주소를 4씩 증가시키잖아요. 근데 만약에 32bit 레지스터에 short 형이나 double 형으로 들어간다고 가정하면 어떤식으로 동작 할까요? short 형이면 2 byte니 4byte가 되야 레지스터가 차고 double형은 8 byte인데 주소 2개가 0x0000_0000 ~ 0X0000_0007 이 같은 값을 가지게 될까요?

홍영기님의 프로필 이미지
홍영기
지식공유자

메모리는 동일한 위치(주소)의 변수를 필요하다면 1, 2, 4 바이트 서로 다른 사이즈로 접근해도 되지만, 하드웨어 레지스터는 원래의 정해진 사이즈로만 접근해야 합니다.

원래의 크기가 아닌 다른 사이즈로 레지스터를 접근하였을 때는 정상적인 액세스를 보장할 수 없습니다.(될 수도 있고 안 될 수도 있다는 뜻)

박진수님의 프로필 이미지
박진수
질문자

음 만약에 16bit 레지스터면 short로 32bit 레지스터면 int, 64bit 레지스터면 double로 접근하면 된다 이렇게 생각하면 될까요??

홍영기님의 프로필 이미지
홍영기
지식공유자

네네 맞습니다 ^^

 

박진수님의 프로필 이미지
박진수

작성한 질문수

질문하기