임베디드 소프트웨어 설계
임베디드 시스템 개발 환경 TARGET 시스템 HOST 시스템 ARM i586 시리얼 케이블 JTAG I/F Parallel, Ethernet, USB, … ARM i586 Cross-Development 환경
Target 시스템과 Host 시스템 Target 시스템 Host 시스템 개발하고자 하는 임베디드 시스템을 말한다. ARM 기반의 PDA 등 Host 시스템 Target 시스템을 개발하기 위한 개발환경을 제공하는 시스템 타겟을 위한 어셈블러, 컴파일러, 링커 등의 호스트 툴 과 타겟을 개발하는데 필요한 디버거를 제공한다. ARM 프로세서용 툴과 디버거를 가지고 있는 Pentium PC
Host 개발 툴 Cross-Compiler IDE(Integrated Development Environment) 개발된 소스 프로그램을 다른 machine의 기계어로 번역하는 프로그램 예를 들면 x86 계열의 호스트에서 개발한 소스 프로그램을 ARM 용 기계어로 번역하는 프로그램을 말한다. IDE(Integrated Development Environment) 컴파일러, 디버거 와 에디터 등이 통합된 CASE(Computer Aided Software Engineering) 툴을 말한다.
디버그 인터페이스 ICE 장비 In-Circuit Emulator (ICE)는 호스트의 디버거와 함께 Target 시스템의 레지스터나 메모리의 내용을 읽거나 변경할 수 있고, Break Point나 Watch Point를 설정할 수도 있고, 프로그램을 step-by-step으로 실행 할 수 있게 해주는 장치 이다. 호스트와는 Parallel, Ethernet 등을 이용하여 연결되고, 타겟과는 JTAG을 통하여 연결된다.
ARM Cross 컴파일러 ARM Cross 컴파일러 ARM Cross 컴파일러의 종류 PC의 x86 계열의 호스트에서 소스 프로그램을 32비트 RISC 프로세서인 ARM 용 기계어를 생성하는 프로그램 ARM Cross 컴파일러의 종류 SDT v2.11, v2.50, v2.51 통합개발환경(IDE) : APM 디버거 : ADW ADS(ARM Developer Suit) v1.01, v1.1, v1.2 통합개발환경(IDE) : CodeWarrior 디버거 : AXD RVDS(RealView Developer Suit) v1.2, v2.0 IDE & 디버거 : RVD Code Warrior for ARM v1.2, v2.0 IDE & 디버거 : CodeWarrior GNU tool chain 어셈블러 & 컴파일러 : gas, gcc 디버거 : GDB, Insight 디버거
ARM 교차툴의 활용
컴파일러의 레지스터 사용 ATPCS or APCS ARM Thumb Procedure Call Standard ARM Procedure Call Standard 컴파일러와 어셈블러에서 레지스터를 사용되는 방법에 대해서 정의 Function Argument 사용 Result passing(return) Stack 사용 General purpose 레지스터의 사용
APCS 레지스터 APCS 역 할 r0 a1 argumect 1 / interger result / scratch register r1 a2 argumect 2 / scratch register r2 a3 argumect 3 / scratch register r3 a4 argumect 4 /scratch register r4 v1 register variable 1 r5 v2 register variable 2 r6 v3 register variable 3 r7 v4 register variable 4 r8 v5 register variable 5 r9 sb/v6 Static base / register variable 6 r10 sl/v7 stack limit / register variable 7 r11 fp frame pointer r12 ip scratch reg. / new sb in inter-link-unit calls r13 sp Lower end of current stack frame r14 lr link address / scratch register r15 pc program counter
APCS 이해
ARM 컴파일러의 데이터 Type char 8 bit Byte short 16 bit Half-word int 32 bit long Integer float IEEE single-precision double 64 bit IEEE double-precision pointer long long 64 bit integer
오브젝트 파일의 자료 구조 오브젝트 파일의 종류 오브젝트 파일의 형식 재배치 가능한 오브젝트 파일 (relocatible file) 실행 가능한 오브젝트 파일 (executible file) 공유 오브젝트 파일 (shared object file) 오브젝트 파일의 형식 COFF(Common Object File Format) ELF(Executable Linkable Format)
실행 가능한 오브젝트 파일의 구성 Section을 설명하는 내용 Text section : 모든 code block Object 파일의 자료 구조 Header Section을 설명하는 내용 Section Text section : 모든 code block Data section : 초기화된 전역 변수 및 초기값 BSS section : 초기화 되지 않은 전역변수 Symbol Table 변수와 함수의 이름과 위치 정보를 가진다.
링커 (Linker) Linker Startup 코드 불완전한 object 파일들을 합쳐 모든 코드와 데이터를 포함하는 새로운 object 파일을 생성해 내는 도구 필요에 따라 라이브러리와 초기화(startup) 파일을 같이 링크 한다. Startup 코드 어셈블러로 구성되며 모든 프로그램에는 반드시 필요 일반적으로 crt0.S(C-runtime 0 의 약자), init.S, startup.S 등의 이름을 많이 사용한다. Startup 코드 동작 시스템 설정 Data 초기화 Stack 영역 할당 Heap 영역 할당 메인 함수(main)를 호출
로케이트 (Locate) 로케이트 (Locate) Linker script 파일 메모리에서 실행 가능하도록 코드와 데이터를 배치하여 최종 바이너리 이미지를 생성하는 도구 대부분 링커에 포함되어 있다 Linker script 파일 코드와 데이터의 메모리 배치를 정의한 파일 # ROM located at address 0x0 # RAM located at address 0x800000 # alignment directives have been removed for clarity MEMORY { TEXT (RX) : ORIGIN = 0x0, LENGTH = 0 DATA (RW) : ORIGIN = 0x800000, LENGTH = 0 } SECTIONS{ .main : { *(.text) *(.rodata) } > TEXT # Locate the initialized data to the ROM area at the end of .main. .main_data : AT( ADDR(.main) + SIZEOF(.main) ) { *(.data) *(.sdata) *(.sbss) } > DATA .uninitialized_data: { *(SCOMMON) *(.bss) *(COMMON) } >> DATA
메모리 제어기와 물리 메모리 할당
메모리 리매핑(Re-mapping) 하드웨어 적으로 메모리의 어드레스 MAP을 바꾸는 동작 메모리 컨트롤러에서 지원 되어야 한다. Re-mapping이 필요한 이유 ROM이나 Flash 만이 전원이 꺼진 후에도 code나 data가 저장되어 있다. 대부분 0x0 번지에 ROM이나 Flash가 위치한다. ARM의 경우 Reset이 발생하면 무조건 0x0 번지의 명령을 수행한다. ROM 이나 Flash는 DRAM에 비하여 data 버스의 width도 좁고, 속도가 느려서 시스템 동작 중에 성능을 저하 시킬 수 있다. ARM의 경우 Exception Vector Table은 항상 0x0 번지에 있는데, ROM 이나 Flash를 0x0 번지 위치에서 계속 사용하게 되면 Vector Table을 수정하기가 용이하지 않다. 대부분의 OS의 경우 Vector Table을 초기화 중에 다시 설정한다.
메모리 리매핑 과정
소프트웨어 동작을 위한 메모리 구조 1
소프트웨어 동작을 위한 메모리 구조 2 스캐터 로딩 (Scatter Loading) 실제 동작에 앞서 프로그램이나 데이터를 재배치 메모리를 분산해서 사용 로드뷰와 실행뷰가 서로 다르다.
다운로드와 디버깅 다운로드 디버깅 생성된 실행 가능한 바이너리 이미지를 타겟 보드의 메모리에 탑재하는 동작 다운로드 및 실행 방법 ROM / Flash에 탑재하여 실행 전용 ICE 없이 DRAM에 탑재하여 실행 전용 ICE를 사용하여 DRAM 탑재하여 실행 디버깅 타겟 시스템을 실행하면서 프로그램의 실행 상태, 메모리, 변수 등을 프로그래머가 확인하거나 제어 하면서 오류를 찾아 수정하는 동작 실행 가능한 이미지가 반드시 디버깅 정보와 함께 메모리에 탑재 되어 있어야 한다. 전용 디버깅 용 ICE 장비와 디버거 소프트웨어를 사용한다
다운로드 방법 ROM / Flash에 탑재하여 실행 전용 ICE 없이 DRAM에 탑재하여 실행 ROM Writer를 사용하는 방법 전용 ROM writer를 사용하여 ROM을 programming하고 타겟 보드에 삽입 JTAG 동글(Dongle)을 이용하는 방법 전용 ICE 없이 DRAM에 탑재하여 실행 Target에 모니터 프로그램, 또는 부트로더를 탑재하고, Serial, ethernet, USB 등을 이용하여 다운로드 JTAG Dongle을 이용하는 방법 전용 ICE를 이용하는 방법 전용 ICE를 사용하여 DRAM 탑재하여 실행 디버깅을 할 때 매우 편리하다.
JTAG(Joint Test Action Group) Boundary-Scan Test Interface JTAG Diagram 각각의 JTAG cell은 서로 연결되어 있다. 회로의 배선과 소자의 전기적 연결상태 Test 디바이스간의 연결상태 Test Registers CELL 디버거 인터페이스 TAP Digital Chip Flash Memory Fusing
JTAG을 이용한 테스트 루프 구성
JTAG 기반의 디버깅 시스템 구성
JTAG 동글 PC의 Parallel 포트와 JTAG을 연결하여 프로토콜을 변환하고 타겟에 맞게 전원을 변환해 주며 TARGET MACHINE TDI CPU 버퍼 (244) DSUB25 Parallel 포트 TDO TMS TCK TRST TAP (Test Access Port) JTAG