목차
감사의 글 ... ⅳ
옮긴이의 글 ... ⅵ
들어가며 ... xvii
01 개요 ... 1
   1.1 임베디드 시스템이란? ... 2
   1.2 임베디드 소프트웨어 고유의 디자인 목표는? ... 5
   1.3 '실시간'이란? ... 7
   1.4 '멀티태스킹'이란? ... 9
   1.5 임베디드 프로세서는 얼마나 강력한가? ... 10
   1.6 어떤 프로그래밍 언어를 사용하는가? ... 11
   1.7 '실시간 커널'이란? ... 12
   1.8 임베디드 애플리케이션 제작은 왜 특별한가? ... 13
   1.9 보통 임베디드 프로그램의 크기는 얼마나 되는가? ... 16
   1.10 이 책에서 사용하는 소프트웨어 ... 16
02 데이터 표현 ... 21
   2.1 고정 정밀도 이진수 ... 22
      2.1.1 자릿수 체제 ... 24
      2.1.2 2진수를 10진수로 바꾸는 법 ... 25
      2.1.3 10진수를 2진수로 바꾸는 법 ... 25
      2.1.4 수 세기 ... 27
      2.1.5 고정 정밀도와 오버플로우 ... 27
      2.1.6 16진수 표현 ... 28
   2.2 정수의 2진 표현 ... 29
      2.2.1 부호 있는 정수 ... 30
      2.2.2 같은 크기 정수의 양수와 음수 표현 ... 30
      2.2.3 2의 보수의 해석 ... 32
      2.2.4 범위와 오버플로우에 대해서 한 번 더 ... 33
      2.2.5 2의 보수와 하드웨어 복잡도 ... 34
   2.3 실수의 2진 표현 ... 37
      2.3.1 고정 소수점 표현 ... 37
      2.3.2 범용 16.16 포맷의 고정 소수점 ... 40
      2.3.3 범용 32.32 포맷의 고정 소수점 ... 42
      2.3.4 부동 소수점 표현 ... 46
   2.4 텍스트의 ASCII 표현 ... 49
   2.5 이진화 십진 표기법 ... 52
03 C 최대한 활용하기 ... 57
   3.1 정수 데이터 형 ... 58
   3.2 데이터 형 섞어 쓰기 ... 62
   3.3 유용한 TYPEDEF와 DEFINE ... 64
   3.4 메모리에서의 비트 조작 ... 65
      3.4.1 비트 검사 ... 68
      3.4.2 비트 설정, 클리어, 반전 ... 69
      3.4.3 비트 추출 ... 70
      3.4.4 비트 삽입 ... 71
   3.5 I/O 포트에서의 비트 조작 ... 72
      3.5.1 쓰기 전용 I/O 포트 ... 73
      3.5.2 읽기와 쓰기로 구별하는 포트 ... 73
      3.5.3 쓰는 순서로 구별하는 포트 ... 74
      3.5.4 쓰는 데이터 비트 값으로 구별하는 포트 ... 75
   3.6 메모리 맵 I/O장치의 액세스 ... 75
      3.6.1 포인터를 통한 데이터 접근 ... 76
      3.6.2 배열, 포인터, '주소' 연산자 ... 77
   3.7 구조체 ... 79
      3.7.1 빈틈없이 채운 구조체 ... 80
      3.7.2 비트 필드 ... 82
   3.8 가변 접근 ... 84
      3.8.1 객체 주소 캐스팅 ... 84
      3.8.2 유니온 ... 86
04 프로그래머 관점에서 바라본 컴퓨터 구조 ... 91
   4.1 메모리 ... 92
   4.2 CPU ... 94
      4.2.1 ALU ... 95
      4.2.2 기타 레지스터 ... 96
      4.2.3 제어 유닛 ... 96
   4.3 입출력 ... 98
   4.4 인텔 아키텍처 개요 ... 99
      4.4.1 명령어 포맷 ... 101
      4.4.2 명령어 오퍼랜드 ... 102
      4.4.3 오퍼랜드 제약사항 ... 103
      4.4.4 레지스터 ... 105
      4.4.5 스택 ... 108
   4.5 인텔 리얼 모드 아키텍처 ... 110
      4.5.1 세그먼트 어드레싱 ... 110
      4.5.2 주소 지정 방식 ... 113
   4.6 인텔 보호 모드 아키텍처 ... 116
      4.6.1 세그먼트 레지스터와 GDT ... 116
      4.6.2 플랫 메모리 모델 ... 118
      4.6.3 주소 지정 방식 ... 118
   4.7 오퍼랜드와 주소 크기 오버라이드 프리픽스 ... 119
   4.8 인텔 데이터 조작 명령어 ... 120
      4.8.1 데이터 이동, 스택, I/O 명령 ... 121
      4.8.2 산술 연산 명령어 ... 123
      4.8.3 비트 연산 명령어 ... 126
      4.8.4 시프트 명령어 ... 126
05 C와 어셈블리 섞어 쓰기 ... 133
   5.1 어셈블리 프로그래밍 ... 134
   5.2 레지스터 사용 관례 ... 136
   5.3 전형적인 주소 지정 방식 ... 137
      5.3.1 상수 주소 데이터 접근 ... 138
      5.3.2 변수 주소 데이터 접근 ... 139
   5.4 명령어 실행 순서 ... 140
      5.4.1 복합 조건식 ... 143
      5.4.2 If-Then-Else 문 ... 145
      5.4.3 루프 ... 145
      5.4.4 문자열 명령어를 이용한 더 빠른 루프 ... 147
   5.5 프로시저 호출과 복귀 ... 149
   5.6 파라미터 전달 ... 151
   5.7 파라미터 읽기 ... 153
   5.8 모든 것을 값으로 전달 ... 155
   5.9 임시변수 ... 156
06 I/O 프로그래밍 ... 163
   6.1 인텔 I/O 명령어 ... 165
   6.2 동기화, 전송 속도, 대기 시간 ... 166
   6.3 폴링 대기 루프 ... 167
   6.4 인터럽트 구동 I/O ... 170
      6.4.1 하드웨어 응답 ... 170
      6.4.2 ISR ... 173
      6.4.3 PIC ... 175
      6.4.4 버퍼와 큐 ... 176
      6.4.5 어셈블리로 ISR 작성하기 ... 179
      6.4.6 C로 ISR 작성하기 ... 180
      6.4.7 NMI ... 182
      6.4.8 소프트웨어 인터럽트 ... 182
      6.4.9 예외 ... 183
   6.5 DMA ... 185
      6.5.1 이중 버퍼링 ... 185
   6.6 비교 ... 186
07 병행 소프트웨어 ... 191
   7.1 전경/배경 시스템 ... 192
      7.1.1 스레드 상태와 직렬화 ... 193
      7.1.2 지연시간 관리 ... 193
      7.1.3 인터럽트 초과 실행 방지 ... 197
      7.1.4 작업을 배경으로 이동 ... 199
   7.2 멀티스레드 프로그래밍 ... 200
      7.2.1 독립된 스레드의 병행 실행 ... 201
      7.2.2 문맥 전환 ... 201
      7.2.3 비선점형 (협조적) 멀티태스킹 ... 203
      7.2.4 선점형 멀티태스킹 ... 203
   7.3 공유 자원과 크리티컬 섹션 ... 205
      7.3.1 인터럽트 금지 ... 206
      7.3.2 태스크 전환 금지 ... 206
      7.3.3 스핀 락 ... 207
      7.3.4 뮤텍스 ... 208
      7.3.5 세마포어 ... 209
08 스케줄링 ... 212
   8.1 스레드 상태 ... 214
   8.2 대기 스레드 ... 215
   8.3 문맥 전환 ... 216
   8.4 라운드 로빈 스케줄링 ... 219
   8.5 우선순위 기반 스케줄링 ... 220
      8.5.1 우선순위 반전 ... 220
      8.5.2 우선순위 상속 프로토콜 ... 221
      8.5.3 우선순위 상한 프로토콜 ... 222
   8.5 우선순위 할당 ... 222
      8.6.1 데드라인 구동 스케줄링 ... 223
      8.6.2 주기 단조 스케줄링 ... 224
   8.7 데드락 ... 225
   8.8 와치독 타이머 ... 226
09 메모리 관리 ... 231
   9.1 C에서의 객체 ... 232
   9.2 스코프 ... 233
      9.2.1 지역 스코프 ... 234
      9.2.2 전역 스코프 ... 235
   9.3 수명 ... 237
   9.4 자동 할당 ... 237
      9.4.1 저장 클래스 '레지스터' ... 239
   9.5 정적 할당 ... 239
   9.6 정적 할당과 자동 할당을 구별하기 위한 세 가지 프로그램 ... 241
      9.6.1 객체 생성 ... 241
      9.6.2 객체 초기화 ... 242
      9.5.3 객체 제거 ... 243
   9.7 동적 할당 ... 245
      9.7.1 단편화 ... 246
      9.7.2 메모리 할당 풀 ... 247
   9.8 가변 크기 자동 할당: ALLOCA ... 247
      9.8.1 가변 크기 배열 ... 248
   9.9 재귀 함수와 메모리 할당 ... 249
10 공유 메모리 ... 259
   10.1 공유 객체 인식 ... 260
      10.1.1 공유 전역 데이터 ... 261
      10.1.2 공유 사적 데이터 ... 261
      10.1.3 공유 함수 ... 261
   10.2 재진입 가능 함수 ... 262
   10.3 읽기 전용 데이터 ... 263
      10.3.1 타입 수식어 'const' ... 263
   10.4 피해야 할 코딩 습관 ... 264
      10.4.1 내부 상태를 지역 정적 객체에 보관하는 함수 ... 265
      10.4.2 지역 정적 객체의 주소를 리턴하는 함수 ... 267
   10.5 공유 메모리 접근 ... 268
      10.5.1 프로세서 워드 크기의 영향 ... 270
      10.5.2 읽기 전용과 쓰기 전용 액세스 ... 271
      10.5.3 타입 수식어 'volatile' ... 272
11 시스템 초기화 ... 279
   11.1 메모리 레이아웃 ... 280
   11.2 CPU ... 282
      11.2.1 플랫 메모리 모델 설정 ... 282
      11.2.2 보호 모드로 전환 ... 285
   11.3 C 런타임 환경 ... 286
      11.3.1 롬에서 램으로 복사 ... 287
      11.3.2 초기값 없는 정적 변수를 0으로 초기화 ... 288
      11.3.3 힙 설정 ... 288
   11.4 시스템 타이머 ... 290
      11.4.1 타이머 0: 타이머 틱 ... 291
      11.4.2 타이머 1: 메모리 리프레시 ... 291
      11.4.3 타이머 2: 스피커 주파수 ... 292
   11.5 인터럽트 시스템 ... 293
      11.5.1 IDT 초기화 ... 293
      11.5.2 8259 PIC 초기화 ... 296
      11.5.3 새로운 ISR의 설치 ... 298
부록 A 부록 CD 내용 ... 301
부록 B DJGPP 컴파일러 ... 303
부록 C NASM 어셈블러 ... 307
부록 D 프로젝트 프로그래밍 ... 310
부록 E libepc 라이브러리 ... 339
부록 F 부트 로더 ... 352
찾아보기 ... 359
닫기