圖書信息
書 名: 深入淺出:嵌
入式底層軟體開發作 者:楊鑄 唐攀
出版社: 北京航空航天大學出版社
出版時間: 2011年6月1日
ISBN: 9787512403826
開本: 16開
定價: 79.00元
內容簡介
第1篇(第1~3章)以ARMCPU及其彙編語言為背景,深入淺出地講解軟體是如何控制硬體的。第2篇(第4~7章)以S3C2440開發板為硬體,講解製作嵌入式Linux系統的完整過程,具有很強的實用性和可操作性。第3篇(第8~11章)以儘可能通俗的方式講解Linux設備驅動中涉及的複雜理論,在此基礎上,以驅動程式的2個接口(向下與硬體接口、向上與核心子系統接口)為突破口,由淺入深地編寫和剖析了嵌入式真實典型硬體(LED燈、按鍵、網卡、LCD、觸控螢幕)的驅動程式。所有的驅動程式均能在實際硬體上正常運行,幫助讀者揭開Linux驅動的神秘面紗。第12章以實戰的方式,深入淺出地剖析了嵌入式Linux系統中最重要的2類驅動(LCD和觸控螢幕)的代碼實現。並簡介了塊設備驅動和usb設備驅動。本書適合硬體工程師、軟體工程師、嵌入式軟體的從業人員、教授嵌入式軟體開發課程的老師、意欲從事嵌入式軟體開發工作的大學生閱讀。
作者簡介
楊鑄教育背景:電子科技大學通信與信息工程工學碩士;北京郵電大學工學學士 學位,專業為計算機軟體。重大經歷:作為主要組織人員,組織完成了中國移動四川分公司最早的簡訊系統平台的建設;早期專注於Microsoft的OS和Database的技術研究與職業培訓,是微軟在中國的早期MCT之一,MCP號1694198;參與完成國家863計畫項目——信息安全產品演示和驗證平台的子課題並與合作公司完成產品化開發—內部網路監管系統;中後期專注於嵌入式軟體開發的研究與職業培訓,精於ARM體系結構與嵌入式Linux。
圖書目錄
1 第1章 ARM彙編編程基礎 9
1.1 ARM CPU暫存器 9
1.1.1 普通暫存器R0 – R15 10
1.1.2 狀態暫存器cpsr與spsr 11
1.1.3 流水線對PC值的影響 13
1.2 基本定址方式與基本指令 15
1.2.1 最常見定址方式精解 15
1.2.2 最常見指令精解 16
1.3 ARM彙編偽操作 18
1.3.1 彙編偽操作在彙編程式中的使用範例 18
1.3.2 最常見彙編偽操作精解 19
1.3.3 彙編偽操作列表 21
1.4 ADS開發環境的使用 23
1.4.1 在ADS中進行裸機程式的編輯、編譯、運行 24
1.4.2 在AXD中進行裸機程式調試的方法與步驟 32
1.5 RealView MDK開發環境的使用 40
1.5.1 在MDK開發環境下編寫裸機程式 40
1.5.2 MDK調試裸機程式的方法與步驟 55
1.6 其他常見定址模式與常見指令 58
1.6.1 其他常見定址模式(基址定址、多暫存器定址、堆疊定址、暫存器移位定址、相對定址) 58
1.6.2 其他常見指令(訪存指令、數據處理指令、乘法指令) 62
2 第2章 ARM編程進階 65
2.1 ARM彙編偽指令 65
2.1.1 精解ldr偽指令 65
2.1.2 精解adr 67
2.1.3 精解adrl偽指令 68
2.1.4 nop偽指令 69
2.2 ATPCS與混合編程 70
2.2.1 ATPCS規則精解 70
2.2.2 精解C和ARM彙編程式間的相互調用 74
2.3 裸機硬體的控制方法與例程 76
2.3.1 建立真實硬體的開發和調試環境 77
2.3.2 軟體控制(驅動)硬體的編程原理 90
2.3.3 裸機硬體控制程式實例 91
2.3.4 啟動例程 96
2.4 看門狗定時器(Watchdog) 102
2.4.1 看門狗定時器的用途 103
2.4.2 看門狗工作原理 104
2.4.3 看門狗實驗 106
2.5 系統時鐘 107
2.5.1 系統工作時鐘頻率 107
2.5.2 時鐘驅動實驗 112
2.6 SDRAM記憶體 116
2.6.1 S3C2440存儲器地址段(Bank) 117
2.6.2 SDRAM記憶體工作原理 119
2.6.3 SDRAM的讀操作 123
2.6.4 SDRAM預充電操作 124
2.6.5 SDRAM突發操作 124
2.6.6 SDRAM寫操作 125
2.6.7 SDRAM的刷新 126
2.6.8 記憶體驅動實驗 130
2.7 UART串口 134
2.7.1 異步通信和同步通信 135
2.7.2 數據的串列和並行通信方式 135
2.7.3 數據通信傳輸模式 136
2.7.4 S3C2440 UART控制器 137
2.7.5 S3C2440 UART串口工作原理 138
2.7.6 UART串口驅動實驗 147
3 第3章 ARM體系結構 151
3.1 ARM處理器工作模式 151
3.1.1 ARM處理器不同模式下暫存器 152
3.1.2 ARM處理器模式切換(含MRS,MSR指令) 153
3.2 ARM處理器異常處理 155
3.2.1 異常分類 155
3.2.2 異常發生的硬體操作 156
3.2.3 異常返回地址 157
3.2.4 異常向量表 158
3.2.5 異常處理的返回 160
3.3 S3C2440系統中斷 161
3.3.1 中斷的產生-中斷源 162
3.3.2 中斷優先權 164
3.3.3 中斷控制相關暫存器 166
3.3.4 系統中斷流程 169
3.3.5 按鍵控制LED燈實驗 171
3.4 semihosting與硬體重定向 179
3.4.1 semihosting半主機調試 179
3.4.2 硬體重定向 184
3.5 系統調用與軟體中斷SWI的實現 190
3.5.1 系統調用 190
3.5.2 軟體中斷 191
3.5.3 軟中斷處理 192
3.5.4 led系統調用實驗 193
3.6 進程切換的實現 199
3.6.1 進程 199
3.6.2 進程控制塊PCB 200
3.6.3 進程創建 201
3.6.4 進程佇列 201
3.6.5 進程調度(schedule) 202
3.6.6 上下文切換 205
3.7 MMU與記憶體保護的實現 208
3.7.1 存儲管理單元MMU 209
3.7.2 Cache 221
3.7.3 CP15協處理器 223
3.8 實戰:小型多任務作業系統miniOS的實現 227
3.8.1 miniOS代碼分析 227
3.8.2 miniOS應用程式接口 261
3.8.3 miniOS應用程式系統調用接口 262
4 第4章 嵌入式Linux軟體開發環境搭建 265
4.1 體驗嵌入式linux系統 265
4.2 Linux作業系統安裝 266
4.2.1 在Window上安裝虛擬機 266
4.2.2 在虛擬機上安裝Linux作業系統ubuntu9.10 277
4.3 在ubuntu9.10中安裝基本的開發環境 280
4.4 ubuntu9.10上網路服務的安裝與配置 281
4.4.1 設定vmware網路 282
4.4.2 安裝、配置和使用ftp服務 286
4.4.3 安裝、配置nfs服務 286
5 第5章 建構bootloader 287
5.1 準備工作 287
5.1.1 嵌入式Linux系統概述 287
5.1.2 構建交叉編譯工具鏈 288
5.1.3 bootloader概述 289
5.2 深入剖析U-boot代碼 293
5.2.1 安裝和使用原始碼閱讀工具Source Insight 293
5.2.2 u-boot的編譯初步 295
5.2.3 分析u-boot的第1階段代碼(cpu/arm920t/start.S) 297
5.2.4 分析u-boot的第2階段代碼 301
5.2.5 繼續移植、編譯u-boot 303
5.2.6 u-boot常用命令使用簡介 307
5.2.7 u-boot命令實現框架的分析 310
5.2.8 u-boot引導Linux作業系統的過程分析 315
5.2.9 讓u-boot支持從usb slave接口獲得數據 320
6 第6章 建構嵌入式Linux核心 322
6.1 Linux核心簡介 322
6.1.1 Linux核心版本歷史 322
6.1.2 核心源碼目錄結構 322
6.1.3 Linux核心構造系統簡介 323
6.2 移植、裁減及配置Linux核心到s3c2440開發板 324
6.2.1 體驗Linux核心配置、編譯與使用 324
6.2.2 為S3C2440移植核心 327
6.2.3 配置並裁減核心 328
6.2.4 運行核心並驗證核心被配置的功能 331
6.3 核心Kconfig與Makefile檔案分析 333
6.3.1 核心構造系統簡介 333
6.3.2 Kconfig檔案精解 333
6.3.3 .config檔案說明 335
6.3.4 Makefile檔案精解 335
6.3.5 實戰:修改Kconfig和Makefile,完成向核心中添加新的功能組件——網卡、音效卡、LCD、觸控螢幕驅動 336
7 第7章 建構嵌入式Linux檔案系統 345
7.1 嵌入式Linux檔案系統簡介 345
7.1.1 嵌入式檔案系統概述 345
7.1.2 MTD設備與Flash檔案系統簡介 346
7.1.3 嵌入式Linux系統中的tmpfs檔案系統 347
7.2 詳解製作根檔案系統 349
7.2.1 FHS標準介紹 349
7.2.2 編譯/安裝busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目錄 350
7.2.3 利用交叉編譯工具鏈,構建/lib目錄 351
7.2.4 手工構建/etc目錄 353
7.2.5 手工構建最簡化的/dev目錄 354
7.2.6 使用啟動腳本完成/proc、/sys、/dev、/tmp、/var等目錄的完整構建 355
7.2.7 製作根檔案系統的jffs2映像檔案 359
7.3 建構嵌入式Linux應用程式系統 360
7.3.1 輔助處理工具的移植 360
7.3.2 mp3播放器 madplay的移植 363
7.3.3 主要網路伺服器的移植與使用 366
7.3.4 資料庫程式的移植與使用 371
7.4 建構GUI系統 374
7.4.1 移植tslib庫 374
7.4.2 移植Qtopia 375
8 第8章 Linux驅動程式開發基礎 378
8.1 Linux設備驅動程式簡介 378
8.1.1 設備驅動分類和核心模組 379
8.1.2 設備檔案和設備驅動 380
8.1.3 核心模組的編譯和使用 381
8.2 字元設備驅動基本編程 388
8.2.1 字元設備驅動體驗 388
8.2.2 實現字元設備驅動的工作 388
8.3 驅動程式中的並發控制方法 401
8.3.1 並發控制原理簡介 401
8.3.2 信號量的編程實戰 402
8.3.3 自旋鎖的編程實戰 404
8.3.4 Linux核心提供的其他並發控制方法 408
8.4 驅動程式中的阻塞與非阻塞編程 409
8.4.1 體驗阻塞I/O 409
8.4.2 如何在驅動程式中實現阻塞I/O 411
8.4.3 體驗非阻塞I/O 413
8.4.4 如何在驅動程式中實現非阻塞I/O 415
8.5 字元設備驅動程式對一些高級特性的實現 416
8.5.1 non-seekable的實現 416
8.5.2 select的實現 417
9 第9章 Linux字元設備驅動開發實戰 422
9.1 IO記憶體與硬體通信 422
9.1.1 驅動中的記憶體分配 422
9.1.2 使用 I/O 連線埠地址空間與硬體進行通信的核心API介紹 423
9.1.3 使用 I/O 記憶體地址空間與硬體進行通信的核心API介紹 424
9.1.4 通過I/O記憶體驅動硬體的實戰——LED燈驅動 425
9.1.5 驅動程式對ioctl的規範實現 433
9.2 核心misc設備架構分析 435
9.2.1 定義全局變數 435
9.2.2 註冊主設備號為10的misc設備 436
9.2.3 導出核心API —— misc_register函式 437
9.2.4 實施乾坤大挪移的misc設備open函式 438
9.2.5 導出核心API —— misc_deregister函式 440
9.3 watchdog驅動 441
9.3.1 相關概念 441
9.3.2 Watchdog硬體結構分析 443
9.3.3 Watchdog驅動的初始化和卸載 443
9.3.4 探測函式watchdog_probe的實現 444
9.3.5 實現misc設備中對設備檔案的操作 447
9.3.6 Watchdog平台驅動的設備移除、掛起和恢復接口函式的實現 450
9.3.7 測試watchdog驅動 451
9.4 核心編碼規範與風格 452
9.4.1 縮進、長行、{}與空格的放 453
9.4.2 變數和函式 453
9.4.3 注釋.macros和enums 454
9.4.4 快樂使用核心提供的實現常用功能的宏 455
10 第10章 Linux驅動中的中斷編程 456
10.1 驅動程式調測方法與技巧 456
10.1.1 利用printk 456
10.1.2 詳解OOP訊息 457
10.1.3 利用strace 461
10.1.4 利用核心內置的hacking選項 462
10.1.5 其他調測方法簡介 465
10.2 驅動程式中的中斷處理 466
10.2.1 中斷簡述 466
10.2.2 驅動程式中進行中斷處理涉及到的最基本的核心API 466
10.2.3 驅動程式進行中斷處理的實例代碼分析 467
10.2.4 其他關於中斷的核心API 469
10.3 核心時間與核心定時器 470
10.3.1 核心中如何記錄時間 470
10.3.2 核心定時器API 471
10.3.3 核心定時器與核心時間的套用案例——按鍵消抖 471
10.3.4 如何在核心中實現延時 474
10.4 中斷頂半部與底半部 474
10.4.1 區分和使用中斷頂半部與底半部的原因 474
10.4.2 tasklet機制與編程實例 475
10.4.3 workqueue機制與編程實例 478
10.4.4 tasklet與workqueue的區別和不同套用環境總結 485
10.5 Linux中斷處理系統的架構與共享中斷 486
10.5.1 裸機程式中的中斷編程與有作業系統下的中斷編程的區別 486
10.5.2 Linux中斷處理系統的架構 487
10.5.3 關於共享中斷的說明 487
10.5.4 共享中斷實例 487
11 第11章 Linux網路設備驅動開發實戰 489
11.1 網路設備驅動基礎 489
11.1.1 體驗網卡驅動 489
11.1.2 網卡驅動的基本知識——2個結構體和5個函式 489
11.1.3 虛擬網卡snull驅動代碼分析 494
11.1.4 網卡驅動的編寫主要內容總結 499
11.2 網路設備驅動實例——CS8900 499
11.2.1 虛擬網卡驅動與真實網卡驅動的主要區別 499
11.2.2 真實網卡驅動的整體框架分析 500
11.2.3 驅動中關於cs8900硬體操作的探討 507
12 第12章 其他重要設備驅動開發實戰 519
12.1 塊設備驅動初步(以ramdisk為例) 519
12.1.1 體驗塊設備驅動 519
12.1.2 塊設備驅動框架介紹 519
12.1.3 塊設備的簡單讀寫實現代碼分析 522
12.1.4 塊設備的高效讀寫實現代碼分析 523
12.1.5 塊設備的其他操作接口fops 526
12.2 LCD驅動 528
12.2.1 LCD裸機驅動 528
12.2.2 幀緩衝(FrameBuffer)設備驅動框架結構 536
12.2.3 LCD驅動實例代碼 542
12.2.4 LCD驅動代碼的主幹結構的總結 555
12.2.5 測試LCD驅動程式 556
12.3 觸控螢幕驅動 556
12.3.1 觸控螢幕裸機驅動 556
12.3.2 Linux輸入子系統 561
12.3.3 Linux下觸控螢幕驅動的實現步驟 564
12.3.4 測試觸控螢幕驅動程式 572
12.4 USB驅動初步 572
12.4.1 Linux下4種USB驅動簡介與功能體驗 572
12.4.2 USB接口與規範 574
12.4.3 USB設備驅動基本知識 575
12.4.4 USB設備驅動實例 578