Top

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 명령어도 정리한다.

저자/역자 소개

지은이의 말

임베디드 시스템의 세계에서는 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 시스템에 대해 소개한다. 시스템을 동작시키는 방법과 해당 플랫폼에서 개발하는 방법을 알아보고, 이 거대한 에코시스템에서 사용 가능한 디바이스로는 어떤 것들이 있는지도 소개한다.

지은이 소개

제임스 랭브리지(James A. Langbridge)

다른 사람에게 자기 이야기를 하는 것을 그다지 좋아하진 않지만, 그래도 해야 할 때는 하려고 노력하는 편이다. 싱가폴에서 태어났고 부모님을 따라 프랑스 낭트에 정착하기 전까지 여러 나라에서 거주했다. 현재 프랑스 낭트에서 부모님을 모시고 딸과 함께 살고 있다. 임베디드 시스템 컨설턴트며 기업, 군대, 모바일 텔레폰, 항공 보안 회사에서 15년이상 근무했다. 주로 어셈블리로 부트로더를 만들거나 최적화하는 등의 로우 레벨 개발을 했으며, 거의 대부분 작은 프로세서를 사용해왔다. 이 책과 관련한 계약을 하지 않았을 때는, 임베디드 시스템과 관련하여 엔지니어들을 교육하는 일을 하거나 파트너들을 당황케 하는 신기한 물건을 만들곤 했다. 여섯 살 때 첫 번째 컴퓨터 프로그램을 만들었으며 그 이후로 계속 프로그래밍을 하고 있다. BBC 마이크로Micro와 아미가Amiga 전에는 애플 II, ZX80, ZX81을, 그 이후로는 PC를 사용하고 있다.

옮긴이의 말

이 책은 애플의 아이폰과 삼성의 갤럭시 시리즈는 물론이고 현재 판매되고 있는 스마트 폰의 90% 이상(아마 거의 99%에 해당될 것으로 생각된다)을 점유한 ARM 기반 프로세서를 이용하는 노하우를 기술한 책이다. ARM 기반 프로세서는 스마트폰뿐만 아니라 주변에서 쉽게 볼 수 있는 TV, 냉장고, 세탁기 등의 가전제품과 프린터/복사기, 네트워크 장비 등의 전문화된 전자 장비까지 PC를 제외하고는 거의 대부분의 전자 제품에 탑재되어 있다고 해도 과언이 아니다. 근래에는 자동차의 제어 장치나 전자 장치까지도 그 영역이 확대되고 있다.

이 책은 단순히 ARM의 역사와 아키텍처만 소개하는 데 그치지 않는다. ARM의 어셈블리 명령어와 Thumb 명령어의 자세한 내용은 물론이고, 기존 서적에서는 거의 다루지 않는 NEON 명령어의 사용 방법도 설명하고 있다. ARM을 이용해 프로그래밍을 하는 실제 개발자들 중에서도 NEON 명령어를 자유자재로 사용하는 개발자는 드물다.

ARM 기반 프로세서가 장착된 스마트폰이든 ARM 프로세서를 사용하는 전문적인 장비이든 상관없이 자신이 개발하는 애플리케이션의 성능(여기서 성능은 실행 속도 혹은 연산 속도를 의미한다)을 폭발적으로 끌어올리고 싶은 개발자들은 반드시 NEON을 사용해야 한다. 또한 이 책에서는 NEON뿐만 아니라 C 언어를 사용할 때의 최적화 기법에 대해서도 설명한다. 여기서 언급한 최적화 기법들은 당장 실전에 도입하더라도 손색이 없을 만큼 강력한 기능들이다.

나 역시 종종 ARM 프로세서를 사용해 개발하는 개발자이기 때문에 이 책의 번역을 처음 의뢰받았을 때 기대 반 걱정 반으로 시작했다. 내가 경험해보지 못한 어떤 기능들을 접하게 될지 기대했고, 너무 하드웨어에 치중한 설명이나 예제로 인해 번역서를 접하는 독자들이 읽기에 어렵지는 않을지 걱정했다.

그러나 이 책의 번역을 모두 끝낸 지금, 시작할 때의 기대는 두 배가 됐고 시작할 때의 걱정은 기우였다. ARM의 역사를 소개하는 1장부터 최적화된 C 언어를 이용하는 프로그래밍을 소개하는 10장까지 흥미진진한 역사서를 읽는 기분이었고, ‘옮긴이의 말’을 작성하는 지금은 ARM에 대한 지식으로 배가 부른 포만감에 흐뭇하게 웃고 있다.

옮긴이 소개

이유찬

중학교 때 처음 컴퓨터를 접하고 컴퓨터에 미쳐 살다가 대학에서 컴퓨터 공학을 전공하고 나서야 컴퓨터라는 학문이 얼마나 어려운지 뼈저리게 깨달은 전형적인 전산쟁이다. 대학 졸업 후 시스템 최적화 분야의 업무를 담당하고 있는 모바일 개발자로, 틈틈이 게임을 즐기며 새로운 프로그래밍 기법을 공부하는 늦깎이 프로그래머이기도 하다. 좋아하는 분야는 자바와 C#, C++ 같은 객체 지향 프로그래밍이며, 현재는 함수형 프로그래밍에 푹 빠져 있다.

목차

목차
  • 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 명령어
      • 산술 명령어
      • 병렬 산술 명령어
      • 이동
      • 로드
      • 저장
      • 논리
      • 비교
      • 새튜레이트
      • 분기
      • 확장
      • 기타
    • Cortex-M 코어에서의 Thumb 명령어

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안