REAL VIEW ICE 를 이용해서 SMDK2410 보드에서의 디버깅하는 과정을 설명한다.
REAL VIEW ICE 는 크게 두가지 모드의 디버깅을 지원한다.
- Simulator Mode
- Board Mode
Simulator Mode 는 말 그대로 가상으로 디버깅 해 볼 수 있다. 하지만, 가상이기 때문에 여러가지 제약이 따른다.
제약사항
- 하드웨어 쪽 엑세스가 불가능하다.
- 단지 가상 메모리에 올라가있는 주소 어드레스의 값만 수정할 수 있다.
Board Mode 는 직접 REAL VIEW ICE 를 통해서 타겟보드에 접속해서 디버깅 할 수 있는 모드다. 앞서 설명한 Simulator Mode 와 다른점이라면, 접근할 수 있는 영역이 더 넓어졌다고 할 수 있다.
제약사항
- 타겟보드의 Chip 에 따라 지원이 안될 수 있다. (ex : PXA255)
- 타겟보드의 부트 코드가 필요하다(부트로더가 아니다 최소한의 CPU 와 RAM 을 초기화 시킬 명령들이 필요하다).
Board Mode
앞에서는 이론적인 사항들만 나열했다면, 여기서는 이론을 바탕으로한 실제 실습을 해볼 것이다.
RVDS 를 설치하면, 몇가지 관련 프로그램들이 설치되는데, 그중에서 프로그램 작성은 코드 워리어 에서 하고 디버깅은 Real View ICE 에서 할 것이다.
- 프로젝트를 만들고, 간단한 소스파일을 만든다. 'Debug Settings' 라는 항목을 보면, 'RO Base' 라는 항목이 있다. 여기서 '0x30000000' 를 입력한다.
- 컴파일 후에 'F5' 누른다. 그러면, 자동으로 Real View ICE 가 실행된다.
- Connection 창이 뜨면, RealView-ICE → ARM920T 의 네모박스를 체크하지 않고, 마우스 왼쪽 버튼으로 선택만 한 다음, 마우스 오른쪽 버튼으로 Properties 를 선택한다.
- Properties 창에서 CONNECTION=RealView-ICE → Advanced_Information → Default → ARM_config → Top memory 에 '0x34000000' 값을 적는다.
- 그리고 나서 File 탭의 Save and Close 를 선택한다.
- 다시 Connection 창에서 RealView-ICE → ARM920T 의 네모박스를 체크해서 보드에 접속한다.
- 보드 부팅 초기화 명령을 내려야 하는데, 내용은 아래와 같다.
setreg @cpsr=0xd3 // "Disable the Watch Dog Timer" setmem /32 0x53000000=0x00000000 // "PLL Setup" setmem /32 0x4C000004=((0x70<<12)+(0x4<<4)+0x2) setmem /32 0x4C000008=((0x58<<12)+(0x4<<4)+0x2) // "Memory Controller Setup" setmem /32 0x48000000=0x22000000 setmem /32 0x48000004=((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0) setmem /32 0x48000008=((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0) setmem /32 0x4800000c=((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0) setmem /32 0x48000010=((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0) setmem /32 0x48000014=((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0) setmem /32 0x48000018=((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0) setmem /32 0x4800001c=((3<<15)+(0<<2)+1) setmem /32 0x48000020=((3<<15)+(0<<2)+1) setmem /32 0x48000024=((1<<23)+(0<<22)+(0<<20)+(1<<18)+(2<<16)+1113) setmem /32 0x48000028=0x00000031 setmem /32 0x4800002c=0x00000020
다음의 명령어로 읽어들인다.
stop> include c:\a.inc # 참고로 a.inc 파일은 C:\ 에 있다고 가정한다
- axf 파일을 로딩시킨다.
디버깅
이제 본격적으로 디버깅을 하면 된다.
Key Point
여기서는 ARM9 2410 Chip 보드를 기반으로 설명했지만, 다른 Chip 보드를 디버깅해야 한다면 어떻게 해야 할까?
이 때, 고려해야 할 것은 다음과 같다.
- 메모리영역과 주소(처음과 끝)
- 보드 초기화 명령어(.inc)
메모리영역과 주소의 경우, 앞의 설명에서 각각 오브젝트 이미지의 base address 와 top memory 값이 된다.
보드 초기화 명령어의 경우, axj 파일을 RAM 에 올리기 전에 보드를 초기화해야 하기 때문에 반드시 필요하다.
여기에 대해서 덧붙이자면, ARM9 2410 데이터 시트의 메모리맵을 보면, 64M SDRAM 의 경우, bank6 과 bank7 을 사용한다.
BANK6 | 0x30000000 ~ 0x33ffffff |
BANK7 | 0x34000000 ~ 0x37ffffff |
각 주소 영역은 표와 같다. 그래서 REAL VIEW ICE 의 경우, bank6 에 axj 이미지를 올린다.