이미 소장하고 있다면 판매해 보세요.
|
1부 ARM 시스템과 개발
1장 ARM의 역사 __ARM의 기원 ____아콘이 새로운 프로세서를 만들기로 결정한 이유 ____아콘은 어떻게 ARM이 되었을까? ____ARM이 실제로 마이크로프로세서를 생산하지 않는 이유 __ARM의 명명 규칙 ____사용하는 프로세서의 이름에 대한 규칙 ____ARM7TDMI와 ARM926EJ-S의 차이점 ____ARM7과 ARMv7의 차이점 ____Cortex-M 및 Cortex-A의 차이점 __제조사 문서 __오늘날의 ARM 역할 __정리 2장ARM 임베디드 시스템 __ARM 임베디드 시스템의 정의 ____시스템 온 칩이란 무엇인가? ____임베디드 시스템과 시스템 프로그래밍의 차이점 ____최적화가 중요한 이유 ____RISC 아키텍처의 장점 __적합한 프로세서의 선택 __어떤 것부터 시작해야 할까? ____사용 가능한 보드 ____사용 가능한 운영체제의 종류 ____각자의 목적에 가장 부합하는 컴파일러는 무엇인가? ____디버깅을 위한 준비 ____모든 게 갖춰진 개발 환경이 존재할까? ____알아둬야 할 그 밖의 사항들 __정리 3장 ARM 아키텍처 __기본적인 이해 ____레지스터 ____스택 ____내부 RAM ____캐시 __다른 ARM 서브시스템 알아보기 ____프로세서 레지스터의 표현 ____CPSR ____연산 유닛 ____파이프라인 ____밀접하게 연결된 메모리 ____코프로세서 __그 밖의 개념 이해 ____예외란 무엇인가? ____각기 다른 예외 처리 ____연산 모드 ____벡터 테이블 ____메모리 관리 __다른 기술 ____JTAG 디버그(Debug, D) ____강화된 DSP(Enhanced DSP, E) ____벡터 부동소수점(Vector Floating Point, F) ____EmbeddedICE(I) ____제이젤(Jazelle, J) ____롱 멀티플라이(Long Multiply, M) ____Thumb(T) ____합성 가능(Synthesizable, S) ____트러스트존(TrustZone) ____NEON ____big.LITTLE __정리 4장ARM 어셈블리 언어 __어셈블리 언어의 소개 __컴퓨터와의 대화 __어셈블리를 배워야 하는 이유 ____속도 ____용량 ____재미! ____컴파일러는 완벽하지 않다 ____어셈블리를 통해 컴퓨터 과학 이해하기 ____직접 어셈블리로 작성하면 안 될까? __어셈블리의 사용 ____부트로더의 작성 ____리버스 엔지니어링 ____최적화 __ARM 어셈블리 언어 ____레이아웃 ____명령어 포맷 ____조건 코드 ____조건 플래그 업데이트 ____어드레싱 모드 __ARM 어셈블리 프라이머 ____로드와 저장 ____값에 대한 설정 ____분기 ____수학 연산 ____예제 프로그램의 이해 __정리 5장 첫발 내딛기 __Hello, World! __좀 더 자세하게 살펴보기 __Hello World, 실제로 적용해보자! __소프트웨어 구현 __메모리 매핑 __실제 예제 ____실리콘 랩의 STK3800 ____실리콘 랩의 STK3200 ____아트멜 D20 Xplained Pro __케이스 스터디: U-Boot __머신 스터디: 라즈베리 파이 ____부트 과정 ____라즈베리 파이를 위한 프로그램 컴파일 ____다음 작업 __정리 6장 Thumb 명령어 세트 __Thumb __Thumb-2 기술 __Thumb을 실행하는 방법 __Thumb을 사용할 때의 장점 __Thumb을 사용하는 코어 __ARM-Thumb 인터워킹 __Thumb-1의 소개 ____레지스터 사용 가능성 ____제거된 명령어 ____조건이 없음 ____플래그 설정 ____배럴 시프터가 없음 ____즉시값의 감소 ____스택 연산 __Thumb-2의 소개 ____새로운 명령어 ____코프로세서 ____DSP ____FPU __Thumb으로 작성하기 __정리 7장 어셈블리 명령어 __이동 ____MOV ____MVN ____MOVW ____MOVT ____NEG ____예제: 명령어 스트림에서 32비트 상수의 로드 __산술 ____ADD ____ADC ____SUB ____SBC ____RSB ____RSC ____예제: 기본적인 수학 __제한된 산술 ____QADD ____QSUB ____QDADD ____QDSUB __데이터 전송 ____LDR ____STR ____예제: memcpy __논리 ____AND ____EOR ____ORR ____BIC ____CLZ __비교 ____CMP ____CMN ____TST ____TEQ __분기 ____B ____BL ____BX ____BLX ____예제: 0을 카운트하기 ____예제: Thumb 인터워킹 ____MOV pc, lr이란? __곱셈 ____MUL ____MLA ____UMULL ____UMLAL ____SMULL ____SMLAL __나눗셈 ____SDIV ____UDIV __다중 레지스터 데이터 전송 ____STM ____LDM __배럴 시프터 ____LSL ____LSR ____ASR ____ROR ____RRX __스택 연산 ____PUSH ____POP ____예제: 서브루틴으로부터의 리턴 __코프로세서 명령어 ____MRC ____MCR __추가적인 명령어 ____SVC ____NOP ____MRS ____MSR __정리 8장 NEON __NEON을 사용할 때의 이점 __NEON에서 지원하는 데이터 타입 __어셈블리에서 NEON의 사용 ____레지스터의 표현 ____데이터의 로드와 저장 ____최적화된 memcpy ____NEON 명령어 __C 언어에서 NEON의 사용 ____인트린직 ____NEON 인트린직의 사용 ____이미지를 그레이스케일로 변환 __정리 9장 디버깅 __디버거란? ____디버거의 기능 ____ARM 디버깅 능력 __디버깅 타입 ____루프 ____루틴 ____인터럽트 컨트롤러 ____부트로더 __디버거 ____GNU 디버거 ____J-Link GDB 디버거 __디버깅 예 ____무한 루프 ____알려지지 않은 예외 ____0으로 나눗셈 __상세한 분석 ____데이터 취소 ____시리얼 라인의 문제 ____64비트 연산 ____시간 응답 __정리 10장 최적화된 C 코드의 작성 __코드 최적화의 규칙 ____최적화로 시작하지는 말자 ____컴파일러에 대한 지식 ____여러분이 작성한 코드에 대한 지식 __프로파일링 ____운영체제 안에서의 프로파일링 ____베어 메탈 시스템에서의 프로파일링 __C 최적화 ____기본적인 예제 ____카운트를 높이는 것이 아니라 줄여야 한다. ____정수 ____나눗셈 ____너무 많은 파라미터를 사용하지는 말자 ____객체가 아닌 포인터 ____시스템 메모리를 자주 업데이트해서는 안 된다 ____정렬 __어셈블리 최적화 ____특별한 루틴 ____인터럽트의 처리 __하드웨어 설정 최적화 ____주파수 설정 ____캐시 설정 __정리 2부 레퍼런스 부록 A 용어 __분기 예측 __캐시 ____캐시 히트 ____캐시 라인 ____캐시 미스 __코프로세서 __CP10 __CP11 __CP14 __CP15 __사이클 __예외 __인터럽트 __제이젤 __JTAG __MIPS __NEON __비순차 실행 __파이프라인 __레지스터 __SIMD __SoC __합성 가능 __트러스트존 __벡터 테이블 부록 B ARM 아키텍처 버전 __ARMv1 __ARMv2 __ARMv3 __ARMv4 __ARMv5 __ARMv6 __ARMv6-M __ARMv7-A/R __ARMv7-M __ARMv8 부록 C ARM 코어 버전 __ARM6 __ARM7 __ARM7TDMI __ARM8 __StrongARM __ARM9TDMI __ARM9E __ARM10 __XScale __ARM11 __Cortex ____Cortex-A ____Cortex-R ____Cortex-M 부록 D NEON 인트린직과 명령어 __데이터 타입 __레인 타입 __어셈블리 명령어 __인트린직 명명 규칙 부록 E 어셈블리 명령어 __ARM 명령어 ____산술 명령어 ____병렬 산술 명령어 ____이동 ____로드 ____저장 ____논리 ____비교 ____새튜레이트 ____분기 ____확장 ____기타 |
|
★ 이 책에서 다루는 내용 ★
■ 여러 시스템에서 모든 ARM 프로세서에 공통적으로 사용하는 기술을 명확하게 설명해 임베디드 ARM 개발의 세계에 좀 더 쉽게 적응하도록 해준다. ■ 보드, 소프트웨어, 레퍼런스를 포함해 ARM 시스템에서 개발에 필요한 여러 가지 툴을 소개한다. ■ 어셈블리 언어를 사용해 빠른 속도로 로우 레벨 프로그래밍과 디버깅을 시작할 수 있게 해준다. ■ ARM 프로세서를 통해 빠른 코드를 개발하는 데 필요한 최적화 방법을 알려준다. ★ 이 책의 대상 독자 ★ 주로 임베디드 분야에서 처음 시작하는 개발자들을 대상으로 한다. C 언어에 대한 기본적인 이해가 있어야 이 책에 나오는 대부분의 예제 코드를 이해할 수 있지만 어셈블리 언어에 대한 지식은 굳이 필요하지 않다. 또한 이 책은 프로세서의 내부 지식에 대해 좀 더 공부하고 싶은 개발자와 코어 내부를 좀 더 깊게 이해하고 싶은 개발자를 위해 작성됐다. ★ 이 책의 구성 ★ 이 책은 ARM 프로세서를 사용해본 경험이 없는 독자들에게 가능한 한 많은 정보를 주기 위한 목적으로 만들어졌다. ARM의 철학을 이해하려면, ARM이 어디서부터 왔으며 ARM 프로세서가 어떻게 탄생했는지를 이해해야 한다. 따라서 이 책은 임베디드 프로젝트의 모든 영역을 다룬다. 또한 프로세서와 그 확장 모델에 대한 이해, 어셈블러의 이해, 그리고 더 친숙한 C 언어를 사용한 첫 번째 프로그램의 작성과 디버깅 및 최적화 방법에 대해서도 설명한다. 1장, 'ARM의 역사'에서는 ARM의 역사를 개괄적으로 다루는데, ARM이 어디서부터 왔고 왜 오늘날의 ARM이 되었는지에 대해 설명한다. 2장, 'ARM 임베디드 시스템'에서는 임베디드 시스템이 무엇인지 알아보고, ARM 시스템의 강점을 살펴본다. 3장, 'ARM 아키텍처'에서는 ARM 프로세서를 구성하는 여러 가지 항목을 설명하고, 이를 효과적으로 사용하는 방법을 배워본다. 4장, 'ARM 어셈블리 언어'에서는 ARM 어셈블리 언어를 소개하고, 어셈블리 언어를 이해하는 일이 왜 중요한지 살펴본다. 5장, '첫발 내딛기'에서는 프로그램을 작성하기 위한 시뮬레이터와 실시간 카드에 대해 소개한다. 이 두 가지를 사용해 ARM 프로세서를 시작할 수 있으며, 더 복잡한 프로그램을 만들기 위한 기본에 대해 설명한다. 또한 실제 시나리오 프로젝트에 대해서도 설명한다. 6장, 'Thumb 명령어 세트'에서는 Thumb 모드와 Thumb-2 확장에 대해 설명한다. Cortex-M 프로세서에서는 Thumb 모드만 사용할 수 있지만, Thumb은 코드의 밀도(density)가 필요한 모든 현대 프로세서에서 사용할 수 있다. 7장, '어셈블리 명령어'에서는 ARM의 UALUnified Assembly Language에서 제공하는 어셈블리 명령어와 그 어셈블리 명령어를 사용해 쉽게 프로그램을 작성하는 방법을 배워본다. 8장, 'NEON'에서는 ARM의 향상된 SIMDSingle Instruction Multiple Data 프로세서인 NEON에 대해 살펴보고, 이 NEON을 사용해 수학적으로 복잡한 루틴을 가속화하는 방법을 알아본다. 9장, '디버깅'에서는 프로그램을 디버깅할 때 필요한 디버깅 방법에 대해 설명한다. 또한 실제 예제도 다룬다. 10장, '최적화된 C 언어 작성'에서는 애플리케이션을 작성하는 마지막 단계인 최적화를 다룬다. 몇 가지 간단한 예제를 통해 최적화된 코드를 작성하는 방법과, 더 나은 최적화를 구현하기 위해 프로세서 내부에서 일어나는 일들을 이해할 수 있다. 부록 A, '용어'에서는 임베디드 시스템에서 작업할 때 접하게 되는 용어들을 알아본다. 특별히 ARM 임베디드 시스템과 관련된 용어들을 살펴본다. 부록 B, 'ARM 아키텍처 버전'에서는 각기 다른 ARM 아키텍처와 각 버전을 기술적 향상 측면에서 설명한다. 또한 어떤 프로세서가 어떤 아키텍처를 기반으로 설계됐는지에 대해서도 살펴본다. 부록 C, 'ARM 코어 버전'에서는 ARM 코어에 대해 그리고 각 프로세서의 차이점에 대해 좀 더 자세히 알아본다. ARM6부터 각 프로세서에 대해서는 간략하게 설명하고, 현재의 Cortex 계열 프로세서에 대해서는 자세히 설명한다. 부록 D, 'NEON 인트린직과 명령어'에서는 ARM NEON 엔진에서 사용 가능한 명령어들을 정리하고, C를 사용한 최적화된 방법에서 NEON 연산을 수행할 때 사용되는 인트린직에 대해 설명한다. 부록 E, '어셈블리 명령어'에서는 UAL에서 사용되는 여러 가지 어셈블리 언어에 대해 각각 설명하며, 다른 Cortex-M 클래스 프로세서에서 사용되는 Thumb 명령어도 정리한다. ★ 지은이의 말 ★ 임베디드 시스템의 세계에서는 ARM CPU를 사용하지 않고는 일을 하기가 어렵다. ARM CPU는 저전력 기능에 최적화되어 있아 모바일 임베디드 시스템을 만드는 데는 최고의 CPU다. 2012년 이후로 거의 모든 PDA와 스마트폰에는 ARM CPU가 탑재됐으며, ARM은 모든 32비트 임베디드 시스템의 약 75%를 차지하게 됐고 임베디드 RISC 시스템의 약 90%를 점유하게 됐다. 2005년에 팔린 모바일 폰 10억 대 중 98%에 적어도 하나의 ARM 프로세서가 사용됐다. 모바일 폰, 태블릿, MP3 플레이어, 게임용 콘솔, 계산기, 심지어는 컴퓨터 부품인 블루투스 칩과 하드디스크 드라이버에서조차 ARM 프로세서를 볼 수 있다. 두 달마다 10억 대의 ARM 프로세서가 선적되지만 ARM이 직접 프로세서를 제작하지 않는다는 사실이 놀라울 따름이다. ARM은 코어를 설계하며 ARM 파트너들이 이 설계를 사용해 자신들의 프로세서를 제작한다. 그리고 외부 디바이스와 주변장치를 추가 하거나 속도와 소비 전력의 이점을 부각시키기 위해 설계를 수정하기도 한다. 제조사와 밀접하게 일을 하면서 ARM은 거대한 에코시스템을 만들어왔다. 그 결과 프로세서의 놀라운 영역을 구축하게 됐으며, 모든 클래스의 디바이스에서 모든 타입에 적용하게 됐다. 또한 공통된 아키텍처를 사용해 실행하게 했으며 개발자들이 하나의 프로세서에서 다른 프로세서로 쉽게 옮겨갈 수 있도록 했다. ARM 프로세서는 더 이상 성능 제약이 있는 작은 프로세서가 아니다. ARM 프로세서는 가장 작은 시스템에서 사용하는 마이크로컨트롤러부터 서버에서 사용되는 64비트 프로세서까지 그 영역을 확대해왔다. 이 책은 여러분에게 임베디드 ARM 시스템에 대해 소개한다. 시스템을 동작시키는 방법과 해당 플랫폼에서 개발하는 방법을 알아보고, 이 거대한 에코시스템에서 사용 가능한 디바이스로는 어떤 것들이 있는지도 소개한다. ★ 옮긴이의 말 ★ 이 책은 애플의 아이폰과 삼성의 갤럭시 시리즈는 물론이고 현재 판매되고 있는 스마트 폰의 90% 이상(아마 거의 99%에 해당될 것으로 생각된다)을 점유한 ARM 기반 프로세서를 이용하는 노하우를 기술한 책이다. ARM 기반 프로세서는 스마트폰뿐만 아니라 주변에서 쉽게 볼 수 있는 TV, 냉장고, 세탁기 등의 가전제품과 프린터/복사기, 네트워크 장비 등의 전문화된 전자 장비까지 PC를 제외하고는 거의 대부분의 전자 제품에 탑재되어 있다고 해도 과언이 아니다. 근래에는 자동차의 제어 장치나 전자 장치까지도 그 영역이 확대되고 있다. 이 책은 단순히 ARM의 역사와 아키텍처만 소개하는 데 그치지 않는다. ARM의 어셈블리 명령어와 Thumb 명령어의 자세한 내용은 물론이고, 기존 서적에서는 거의 다루지 않는 NEON 명령어의 사용 방법도 설명하고 있다. ARM을 이용해 프로그래밍을 하는 실제 개발자들 중에서도 NEON 명령어를 자유자재로 사용하는 개발자는 드물다. ARM 기반 프로세서가 장착된 스마트폰이든 ARM 프로세서를 사용하는 전문적인 장비이든 상관없이 자신이 개발하는 애플리케이션의 성능(여기서 성능은 실행 속도 혹은 연산 속도를 의미한다)을 폭발적으로 끌어올리고 싶은 개발자들은 반드시 NEON을 사용해야 한다. 또한 이 책에서는 NEON뿐만 아니라 C 언어를 사용할 때의 최적화 기법에 대해서도 설명한다. 여기서 언급한 최적화 기법들은 당장 실전에 도입하더라도 손색이 없을 만큼 강력한 기능들이다. 나 역시 종종 ARM 프로세서를 사용해 개발하는 개발자이기 때문에 이 책의 번역을 처음 의뢰받았을 때 기대 반 걱정 반으로 시작했다. 내가 경험해보지 못한 어떤 기능들을 접하게 될지 기대했고, 너무 하드웨어에 치중한 설명이나 예제로 인해 번역서를 접하는 독자들이 읽기에 어렵지는 않을지 걱정했다. 그러나 이 책의 번역을 모두 끝낸 지금, 시작할 때의 기대는 두 배가 됐고 시작할 때의 걱정은 기우였다. ARM의 역사를 소개하는 1장부터 최적화된 C 언어를 이용하는 프로그래밍을 소개하는 10장까지 흥미진진한 역사서를 읽는 기분이었고, ‘옮긴이의 말’을 작성하는 지금은 ARM에 대한 지식으로 배가 부른 포만감에 흐뭇하게 웃고 있다. |