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

박진수님의 프로필 이미지

작성한 질문수

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

s402_메모리 맵 IO

메모리 맵 질문

23.10.07 15:08 작성

·

198

0

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

답변 1

0

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

2023. 10. 08. 14:55

안녕하세요. 박진수님

말씀하신 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비트라서 그렇습니다.

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

 

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

2023. 10. 10. 09:29

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

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

2023. 10. 10. 09:40

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

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

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

2023. 10. 10. 10:02

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

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

2023. 10. 10. 10:21

네네 맞습니다 ^^