임베디드 시스템
Chapter 4 교차 개발 환경
임베디드 시스템 설계 개발환경을 이해하는 것이 중요 호스트 시스템 타겟 시스템 백엔드 TARGET 시스템 HOST 시스템 ARM i586 Cross-Development 환경 시리얼 케이블 Parallel, Ethernet, USB, … JTAG I/F
호스트 시스템 타겟 시스템을 개발하기 위한 컴퓨팅 환경을 제공하는 시스템 Pentium 급 컴퓨터 운영체제 툴체인(toolchain) 타겟 보드에 맞는 ARM용 교차 컴파일러 및 관련된 각종 라이브러리 등을 의미 호스트 시스템과 타겟 시스템의 플랫폼이 다르기 때문에 필요
타겟 시스템 개발하고자 하는 임베디드 시스템을 말함 백엔드 ARM 기반의 PDA 등 호스트 시스템과 타겟 시스템 간 통신을 위한 매개체를 의미 직렬 포트(Serial port) 병렬 포트(parallel port) LAN
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을 통하여 연결
Cross 컴파일러 ARM Cross 컴파일러 ARM Cross 컴파일러의 종류 (1) PC의 x86 계열의 호스트에서 소스 프로그램을 32비트 RISC 프로세서인 ARM 용 기계어를 생성하는 프로그램 ARM Cross 컴파일러의 종류 (1) SDT v2.11, v2.50, v2.51 통합개발환경(IDE) : APM 디버거 : ADW ADS(ARM Developer Suit) v1.01, v1.1, v1.2 통합개발환경(IDE) : CodeWarrior 디버거 : AXD
ARM Cross 컴파일러의 종류 (2) RVDS(RealView Developer Suit) v1.2, v2.0 IDE & 디버거 : RVD Code Warrior for ARM v1.2, v2.0 IDE & 디버거 : CodeWarrior GNU 교차 툴 어셈블러 & 컴파일러 : gas, gcc 디버거 : GDB, Insight 디버거
ARM 교차툴의 활용
오브젝트 파일의 자료 구조 오브젝트 파일의 종류 오브젝트 파일의 형식 재배치 가능한 오브젝트 파일 (relocatible file) 실행 가능한 오브젝트 파일 (executible file) 공유 오브젝트 파일 (shared object file) 오브젝트 파일의 형식 COFF(Common Object File Format) ELF(Executable Linkable Format)
실행 가능한 오브젝트 파일의 구성 Header Section Symbol Table Object 파일의 자료 구조 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이 필요한 이유 메모리 컨트롤러에서 지원 되어야 함 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을 초기화 중에 다시 설정한다.
메모리 리매핑 과정
윈도우 기반의 호스트 시스템 설정 ARM 명령어 실습 및 독립형 프로그램 작성할 때 사용 가능 MinGW MSYS 윈도우 환경에서 사용 가능한 GNU 툴 MSYS 윈도우 환경에서 POSIX/Bourne 쉘 환경 제공 Makefile과 각종 스크립트를 수행 할 수 있도록 하는 툴 ARM용 교차 개발 툴 Win32에서 임베디드 ARM 프로세서용으로 코드를 생성하는 GNU 툴 어셈블러, 링커, 컴파일러 등 다양한 툴을 포함 OCD Commander 위글러와 호환되는 JTAG 동글과 함께 ELF 형식의 프로그램 다운로드, 싱글 스텝, 메모리 읽기 쓰기, 플래시 프로그래밍 등을 할 수 있는 툴 DevC++ 무료로 사용 가능한 편집기 하이퍼 터미널 윈도우에서 제공하는 시리얼 통신 에뮬레이터 시리얼(UART)는 콘솔 및 디버깅용으로 사용 됨
리눅스 기반의 호스트 시스템 설정 임베디드 리눅스 개발 용 호스트 시스템 리눅스 설치 교차 개발 툴 설치 RedHat 리눅스 9.0 또는 이후 버전 개발자 용으로 설치 교차 개발 툴 설치 ARM 용 교차 개발 툴 (arm-linux 타깃) 시리얼 통신 에뮬레이터 minicom 리눅스에서 제공하는 시리얼 통신 에뮬레이터 시리얼(UART)는 콘솔 및 디버깅용으로 사용 됨 네트워킹 설정 고정 IP 주소를 사용하는 것이 유리 TFTP 서버 및 NFS 서버 USB 로더 USB를 이용한 프로그램 탑재용으로 사용