目錄
第1章 ARM概述及其基本編程模型
1.1 ARM技術的套用領域及其特點 1
1.2 ARM體系結構的版本及命名方法 2
1.2.1 ARM體系結構的版本 2
1.2.2 ARM體系的變種 4
1.2.3 ARM/Thumb體系版本的命名
格式 6
1.3 ARM處理器系列 7
1.3.1 ARM7系列 7
1.3.2 ARM9系列 8
1.3.3 ARM9E系列 9
1.3.4 ARM10E系列 9
1.3.5 SecurCore系列 10
1.4 ARM處理器的運行模式 11
1.5 ARM暫存器介紹 11
1.5.1 通用暫存器 12
1.5.2 程式狀態暫存器 15
1.6 ARM體系的異常中斷 17
1.6.1 ARM中異常中斷的種類 17
1.6.2 ARM處理器對異常中斷的
回響過程 18
1.6.3 從異常中斷處理程式中返回 19
1.7 ARM體系中的存儲系統 19
1.7.1 ARM體系中的存儲空間 19
1.7.2 ARM存儲器格式 19
1.7.3 非對齊的存儲訪問操作 20
1.7.4 指令預取和自修改代碼 21
第2章 ARM指令分類及其定址方式 22
2.1 ARM指令集概要介紹 22
2.1.1 ARM指令的分類 22
2.1.2 ARM指令的一般編碼格式 22
2.1.3 ARM指令的條件碼域 23
2.2 ARM指令的定址方式 24
2.2.1 數據處理指令的運算元的
定址方式 24
2.2.2 字及無符號位元組的Load/Store
指令的定址方式 34
2.2.3 雜類Load/Store指令的
定址方式 46
2.2.4 批量Load/Store指令的
定址方式 52
2.2.5 協處理器Load/Store指令的
定址方式 56
第3章 ARM指令集介紹 61
3.1 ARM指令集 61
3.1.1 跳轉指令 61
3.1.2 數據處理指令 65
3.1.3 乘法指令 78
3.1.4 雜類的算術指令 84
3.1.5 狀態暫存器訪問指令 85
3.1.6 Load/Store記憶體訪問指令 88
3.1.7 批量 Load/Store記憶體訪問
指令 97
3.1.8 信號量操作指令 102
3.1.9 異常中斷產生指令 104
3.1.10 ARM協處理器指令 106
3.2 一些基本的ARM指令功能段 110
3.2.1 算術邏輯運算指令的套用 111
3.2.2 跳轉指令的套用 112
3.2.3 Load/Store指令的套用 114
3.2.4 批量Load/Store指令的
套用 115
3.2.5 信號量指令的套用 116
3.2.6 與系統相關的一些指令
代碼段 117
3.3 Thumb指令介紹 120
第4章 ARM彙編語言程式設計 122
4.1 偽操作 122
4.1.1 符號定義偽操作 122
4.1.2 數據定義偽操作 126
4.1.3 彙編控制偽操作 135
4.1.4 數據幀描述偽操作 138
4.1.5 信息報告偽操作 139
4.1.6 其他的偽操作 141
4.2 ARM彙編語言偽指令 151
4.3 ARM彙編語言語句的格式 153
4.3.1 ARM彙編語言中的符號 154
4.3.2 ARM彙編語言中的表達式 157
4.4 ARM彙編語言程式的格式 162
4.4.1 彙編語言程式的格式 162
4.4.2 彙編語言子程式的調用 163
4.5 ARM彙編編譯器的使用 164
4.6 彙編程式設計舉例 166
4.6.1 ARM中偽操作的使用實例 166
4.6.2 ARM彙編程式的實例 169
第5章 ARM的存儲系統 175
5.1 ARM存儲系統概述 175
5.2 ARM中用於存儲管理的系統控制
協處理器CP15 176
5.2.1 訪問CP15暫存器的指令 176
5.2.2 CP15中的暫存器 178
5.3 存儲器管理單元MMU 186
5.3.1 存儲器管理單元MMU
概述 186
5.3.2 禁止/使能MMU 188
5.3.3 MMU中的地址變換過程 189
5.3.4 MMU中的存儲訪問許可權
控制 198
5.3.5 MMU中的域 199
5.3.6 關於快表的操作 199
5.3.7 ARM中的存儲訪問失效 201
5.4 高速緩衝存儲器和寫緩衝區 205
5.4.1 基本概念 205
5.4.2 Cache的工作原理和地址映像
方法 206
5.4.3 Cache的分類 208
5.4.4 Cache的替換算法 209
5.4.5 緩衝技術的使用注意事項 210
5.4.6 存儲系統的一致性問題 211
5.4.7 Cache內容鎖定 213
5.4.8 與Cache和寫緩衝區相關的
編程接口 214
5.5 快速上下文切換技術 217
5.5.1 快速上下文切換技術原理 217
5.5.2 快速上下文切換技術編程
接口 219
5.6 與存儲系統相關的程式設計指南 219
5.6.1 地址空間 219
5.6.2 存儲器的格式 220
5.6.3 非對齊的存儲訪問操作 221
5.6.4 指令預取和自修改代碼 222
5.6.5 IMB 223
5.6.6 存儲器映射的I/O空間 224
5.7 ARM存儲系統的實例 225
5.7.1 L7205的存儲系統概述 225
5.7.2 L7205中的SDRAM 226
5.7.3 L7205中的MMU 235
第6章 ATPCS介紹 242
6.1 ATPCS概述 242
6.2 基本ATPCS 242
6.2.1 暫存器的使用規則 243
6.2.2 數據棧的使用規則 244
6.2.3 參數傳遞規則 245
6.3 幾種特定的ATPCS 246
6.3.1 支持數據棧限制檢查的
ATPCS 246
6.3.2 支持唯讀段位置無關
(ROPI)的ATPCS 248
6.3.3 支持可讀寫段位置無關
(RWPI)的ATPCS 248
6.3.4 支持ARM程式和Thumb程式
混合使用的ATPCS 248
6.3.5 處理浮點運算的ATPCS 249
第7章 ARM程式和Thumb程式混合
使用 250
7.1 概述 250
7.2 在彙編語言程式中通過用戶代碼
支持interwork 251
7.2.1 可以實現程式狀態切換的
指令 251
7.2.2 與程式狀態切換相關的
偽操作 254
7.2.3 進行狀態切換的彙編程式
實例 255
7.3 在C/C++程式中實現interwork 256
7.4 在彙編語言程式中通過連線器
支持interwork 259
7.4.1 利用veneers實現彙編程式間的
程式狀態切換 259
7.4.2 利用veneers實現彙編程式
與C/C++程式間的程式狀態
切換 261
第8章 C/C++以及彙編語言的混合
編程 263
8.1 內嵌彙編器的使用 263
8.1.1 內嵌的彙編指令用法 263
8.1.2 內嵌的彙編器和armasm的
區別 265
8.1.3 在C/C++程式中使用內嵌的
彙編指令 265
8.1.4 內嵌彙編指令的套用舉例 267
8.2 從彙編程式中訪問C程式變數 270
8.3 彙編程式、C程式以及C++程式的
相互調用 271
8.3.1 在C++程式中使用C程式
頭檔案 271
8.3.2 彙編程式、C程式以及C++
程式的相互調用舉例 272
第9章 異常中斷處理 276
9.1 ARM中的異常中斷處理概述 276
9.1.1 ARM體系中的異常中斷
種類 276
9.1.2 異常中斷向量表及異常中斷
優先權 277
9.1.3 異常中斷使用的暫存器 278
9.2 進入和退出異常中斷的過程 279
9.2.1 ARM處理器對異常中斷的
回響過程 279
9.2.2 從異常中斷處理程式中
返回 282
9.3 在應用程式中安排異常中斷處理
程式 285
9.3.1 在系統復位時安排異常中斷
處理程式 285
9.3.2 在C程式中安排異常中斷
處理程式 286
9.4 SWI異常中斷處理程式 288
9.4.1 SWI異常中斷處理程式的
實現 288
9.4.2 SWI異常中斷調用 292
9.5 FIQ和IRQ異常中斷處理程式 297
9.5.1 IRQ/FIQ異常中斷處理
程式 298
9.5.2 IRQ異常中斷處理程式
舉例 300
9.6 復位異常中斷處理程式 302
9.7 未定義指令異常中斷 302
9.8 指令預取中止異常中斷處理程式 303
9.9 數據訪問中止異常中斷處理程式 303
第10章 ARM C/C++編譯器 304
10.1 ARM C/C++編譯器概述 304
10.1.1 ARM C/C++編譯器及語言庫
介紹 304
10.1.2 ARM編譯器中與搜尋路徑
相關的一些基本概念 305
10.2 ARM編譯器命令行格式 306
10.2.1 過程調用標準 307
10.2.2 設定源程式語言類型 308
10.2.3 指定搜尋路徑 309
10.2.4 設定預處理選項 309
10.2.5 設定輸出檔案的類型 310
10.2.6 指定目標處理器和ARM
體系版本 311
10.2.7 生成調試信息 312
10.2.8 代碼生成的控制 313
10.2.9 控制警告信息的產生 315
10.2.10 編譯時進行的一些額外的
檢查 317
10.2.11 控制錯誤信息 318
10.3 ARM編譯器中的pragmas 319
10.4 ARM編譯器特定的關鍵字 321
10.4.1 用於聲明函式的關鍵字 321
10.4.2 用於聲明變數的關鍵字 333
10.4.3 用於限定數據類型的
關鍵字 333
10.5 ARM編譯器支持的基本數據
類型 335
10.6 ARM編譯器中的預定義宏 337
10.7 ARM中的C/C++庫 339
10.7.1 ARM中的C/C++運行時庫
概述 339
10.7.2 建立一個包含C/C++運行時
庫的C/C++應用程式 340
10.7.3 建立不包含C運行時庫的
應用程式 344
10.7.4 裁減C/C++運行時庫以適應
特定的目標運行環境 345
第11章 ARM連線器 347
11.1 ARM映像檔案 347
11.1.1 ARM映像檔案的組成 347
11.1.2 ARM映像檔案的入口點 349
11.1.3 輸入段的排序規則 350
11.2 ARM連線器介紹 351
11.3 ARM連線器生成的符號 353
11.3.1 連線器生成的與域相關的
符號 353
11.3.2 連線器生成的與輸出段相關的
符號 354
11.3.3 連線器生成的與輸入段相關的
符號 354
11.4 連線器的最佳化功能 354
11.5 運行時庫的使用 355
11.5.1 C/C++運行時庫與目標
檔案 356
11.5.2 查找需要的C/C++
運行時庫 356
11.5.3 選擇合適種類的C/C++
運行時庫 357
11.5.4 掃描C/C++運行時庫 359
11.6 從一個映像檔案中使用另一個映像
檔案中的符號 359
11.6.1 symdefs檔案 359
11.6.2 建立symdefs檔案 361
11.6.3 symdefs檔案的使用 361
11.7 隱藏或者重命名全局符號 362
11.7.1 steering檔案的格式 362
11.7.2 steering檔案中的命令 362
11.8 ARM連線器的命令行選項 363
11.9 使用scatter檔案定義映像檔案的
地址映射 371
11.9.1 scatter檔案概述 371
11.9.2 scatter檔案中各部分的
介紹 373
11.9.3 scatter檔案使用舉例 376
第12章 嵌入式應用程式示例 384
12.1 嵌入式應用程式設計的基本知識 384
12.1.1 嵌入式套用系統中的存儲
映射 384
12.1.2 系統初始化 385
12.2 使用semihosting的C語言程式
示例 388
12.2.1 源程式分析 388
12.2.2 生成映像檔案 391
12.3 一個嵌入式套用系統示例 392
12.3.1 源程式分析 393
12.3.2 生成映像檔案 400
12.3.3 本例中地址映射模式 401
12.4 進行ROM/RAM地址重映射的
嵌入式套用系統 401
12.4.1 地址映射模式 401
12.4.2 源程式分析 403
12.4.3 生成映像檔案 404
12.5 一個嵌入式作業系統示例 405
第13章 使用CodeWarrior 412
13.1 CodeWarrior for ARM概述 412
13.2 簡單工程項目的使用 413
13.2.1 工程項目視窗 413
13.2.2 簡單工程項目的使用 416
13.3 配置生成目標 424
13.3.1 Debug Settings對話框
介紹 424
13.3.2 設定生成目標的基本選項 425
13.3.3 彙編器選項的設定 430
13.3.4 編譯器的選項設定 435
13.3.5 連線器的選項設定 443
13.3.6 fromELF工具的選項設定 449
13.4 複雜工程項目的使用 451
13.4.1 建立一個新的生成目標 451
13.4.2 將一個生成目標更名 453
13.4.3 建立生成目標之間的依賴
關係 453
13.4.4 子工程項目的使用 455
13.5 工程項目模板 456
13.5.1 ADS中工程項目模板的
使用 457
13.5.2 建立用戶工程項目模板 461
13.6 編譯和連線工程項目 461
13.6.1 編譯檔案 462
13.6.2 生成工程項目 463
第14章 ARM體系中的調試方法 465
14.1 ARM體系中的調試系統概述 465
14.2 基於Angel的調試系統 466
14.2.1 基於Angel的調試系統的
概述 466
14.2.2 使用Angel開發應用程式 469
14.2.3 Angel執行的操作 474
14.2.4 將Angel移植到特定的目標
系統 476
14.3 基於JTAG的調試系統 495
14.3.1 基於JTAG的調試系統的
特點 495
14.3.2 基於JTAG的調試系統
結構 495
14.3.3 目標系統中的調試功能擴展
部件 496
14.3.4 基於JTAG的調試過程 498
14.4 ADW使用介紹 498
14.4.1 ADW概述 498
14.4.2 ADW中的視窗 501
14.4.3 ADW使用介紹 505
參考文獻 513