[Embedded] ARM Cortex-M Memory map 정리 ­

ST Microelectronics의 ARMCortex-M4(401RE) manual을 보면 다음과 같이 어드레스 맵이 구성되어 있는 것을 알 수 있다.32bit bus system 이므로 총주소맵은 0~0xFFFFF까지 구성되어 있으며 아래와 같이 주요 메모리 영역이 설정되어 있습니다. Flash memory: 0x08000000~0x0807FF. RAM:0x20000000~0x20017FFF 이와 같이 주소가 정해져 있으므로 IAR Embedded Workbench의.icf 파일에서 메모리 영역 값이 왜 그렇게 되어 있는지 이해할 수 있다.

>

간단한 test program을 test board(Nucleo)에 올려서 확인해 보시면 memory system이 어떻게 구성되어 있는지 잘 이해가 됩니다. Dissembly 창을 활용해 관심 있는 주소 영역을 넘나든다.ROM(Flash memory) 영역의 Firmware를 compile하여 image를 만듭니다.out 파일을 작성하게 되면 거기에는 기본적으로 code가 들어가 있고 static 변수의 symbol과 초기값이 들어가 있습니다. 특히 이 시작번지에는 stackpointer 시작 주소값이 들어가 있고 그 다음 번지에는 Resetvectortable 주소가 들어가 있어 MCU 구동시 hw적으로 resethandler로 껑충 뛰어서 program이 시작되도록 해줍니다.

>

아래와 같이 Flash memory의 개시 번지의 0 x 8000000번지에 0 x 20000578이라는 값이 들어가 있어 CSTACK $ Limit라는 symbol이 붙어 있는 것을 볼 수 있다. 이 값이 초기 stack pointer가 되는 값인데 아래쪽에 RAM영역을 참고하면 무슨 뜻인지 이해가 될 것입니다.

>

RAM 영역

>

초기 stack pointer는 0x20000578번지인데, 사실 이것은 Heap영역의 시작주소입니다. ARMCortex-M 에서는 stack이 새로운 data를 push 하기 전에 address를 감소시켜 시작을 하기 위해 적합한 구성이다.(ARM Cortex는 full descending stack을 사용한다)

>

Stack 끝은 0x20000178번지이지만 그보다 작은 주소 앞에는 static 변수 등이 배치되어 있다. RAM 시작번지인 0x20000000 주소까지 이렇게 이어지는 것을 볼 수 있다. 즉, linker가 먼저 static 변수들을 먼저 배치하고 그 다음에 stack이 시작되도록 하기 위해서 stack 끝부분이 0x20000178이라고 하는 주소값이 된 것입니다. static 변수의 사용량에 변화가 있으면 stack의 시작 및 종료 주소가 바뀌게 된다. 현재 stack size는 0x400으로 설정되어 있는데(.icf 파일 또는 IAR Embedded Workbench에서 확인) 따라서 0x20000178이 stack 끝이며 0x20000578이 stack 시작 주소입니다. 그리고 이어서 Heap 주소가 시작됩니다.(낮은 주소가 끝난 이유는 ARMCortex-M의 stack은 낮은 주소로 떨어지기 때문입니다.)

>

>

댓글 달기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다