ARMv7 프로세서 프로그래밍 [C와 NEON을 이용한 하드웨어 성능 최적화 기법]
- 원서명Professional Embedded ARM Development (ISBN 9781118788943)
- 지은이제임스 랭브리지(James A. Langbridge)
- 옮긴이이유찬
- ISBN : 9788960778450
- 35,000원
- 2016년 04월 08일 펴냄 (절판)
- 페이퍼백 | 400쪽 | 188*235mm
- 시리즈 : 임베디드 시스템
판매처
- 현재 이 도서는 구매할 수 없습니다.
책 소개
요약
이 책은 가장 성공적인 프로세서 중 하나로 손꼽히는 ARM 기반 프로세서를 이용해 프로그래밍하는 노하우를 풀어놓은 책이다. ARM 아키텍처에 대한 자세한 설명과 그 내부 컴포넌트의 하드웨어에 대한 소개뿐만 아니라 ARM 어셈블리 언어에 대한 기능과 사용 방법 등을 소개한다. 이외에도 ARM 기반 프로세서가 장착된 하드웨어 보드(board)를 이용하는 예제 프로그래밍을 다루고 있다. 이 책의 백미는 ARM 하드웨어의 성능을 비약적으로 향상할 수 있는 NEON 명령어의 사용 방법과, C 언어와 NEON을 혼합해 프로그래밍하는 방법을 소개하는 부분이다. 또한 ARM 기반 프로세서를 이용해 프로그래밍할 때 필요한 디버깅 노하우까지도 전수하고 있다. 후반에서 설명한 최적화된 C 언어 프로그래밍 방법은 기존의 C 프로그래밍 서적에서는 얻을 수 없는 최적화 노하우를 볼 수 있다.
이 책에서 다루는 내용
여러 시스템에서 모든 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 명령어도 정리한다.
목차
목차
- 1부 ARM 시스템과 개발
- 1장 ARM의 역사
- ARM의 기원
- 아콘이 새로운 프로세서를 만들기로 결정한 이유
- 아콘은 어떻게 ARM이 되었을까?
- ARM이 실제로 마이크로프로세서를 생산하지 않는 이유
- ARM의 명명 규칙
- 사용하는 프로세서의 이름에 대한 규칙
- ARM7TDMI와 ARM926EJ-S의 차이점
- ARM7과 ARMv7의 차이점
- Cortex-M 및 Cortex-A의 차이점
- 제조사 문서
- 오늘날의 ARM 역할
- 정리
- ARM의 기원
- 2장ARM 임베디드 시스템
- ARM 임베디드 시스템의 정의
- 시스템 온 칩이란 무엇인가?
- 임베디드 시스템과 시스템 프로그래밍의 차이점
- 최적화가 중요한 이유
- RISC 아키텍처의 장점
- 적합한 프로세서의 선택
- 어떤 것부터 시작해야 할까?
- 사용 가능한 보드
- 사용 가능한 운영체제의 종류
- 각자의 목적에 가장 부합하는 컴파일러는 무엇인가?
- 디버깅을 위한 준비
- 모든 게 갖춰진 개발 환경이 존재할까?
- 알아둬야 할 그 밖의 사항들
- 정리
- ARM 임베디드 시스템의 정의
- 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 명령어
- 산술 명령어
- 병렬 산술 명령어
- 이동
- 로드
- 저장
- 논리
- 비교
- 새튜레이트
- 분기
- 확장
- 기타
- Cortex-M 코어에서의 Thumb 명령어
- ARM 명령어