文章總列表

[書評] ARM System Developer's Guide

ARM System Developer's Guide

Designing and Optimizing System Software

http://www.arm.com/documentation/books/4975.html


----


這本書是聖經等級的書, 有興趣的人, 我相信很多地方都可以取得 PDF 檔
在新竹 NOVA 書耕也有翻譯的中文書可以看

總而言之, 推薦 !!

如果修過 computer architecture 的人, 看這本書會更有感覺
這一系列的連載將會把我讀過的心得陸續寫上


----


Chapter 1

ARM Embedded Systems

這一章是嵌入式簡介, 在很多地方都看得到類似的文字
不知道什麼是嵌入式系統的人可以看看


----


Chapter 2

ARM Processor Fundamentals

在 ARM上寫程式, 瞭解 ARM architecture 是必要的
這顆 CPU 有以下的特性...

* 16 General Purpose Registers
* Support ARM(32-bit), Thumb(16-bit), Jazelle(8-bit) instruction sets
* Conditional Execution (很威的功能)

這一章針對這些特性作概略性的描述, 真的要精通, 寫點 ARM 組語是免不了的

另外 2.7 ARM Processor Families 這一章也很有意思
他列出 ARM7 ~ ARM11 常見的型號, 以及代表的意義

ARM7 ARM9 ARM10 ARM11
Typical Mhz 80 150 260 335
mW/Mhz [44;1m0.06 [m 0.19 0.5 0.4
+cache +cache +cache
MIPS/MHZ 0.97 1.1 1.3 1.2

從上面這張表來看, ARM7 有極低的耗電量, 不錯的效能, 難怪會暢銷了...


----


Chapter 3

Introduction to the ARM Instruction Set

所有講 ARM 的書都會介紹指令集, 但是這一本書講得更詳細
比如 ARM 因為內建一個 Barrel Shifter, 可以做些很特別的操作

example: R3 = R1 + 2*R2
-> R3 = R1 + (R1 << 1)

-> add R3, R1, [44;1mR2, LSL #1 [m

ARM 指令中, 其中一個 operand 都可以做這種 shift operation
上面這種運算經常出現在程式中, 善用 CPU 的特性, 就能少掉好幾道指令

ARM 的 conditional execution 也是極有特色的指令編碼
書中舉了算最大公因數為例, 說明 conditional exection 的威力

ARM 在一些特定的型號, 也提供 DSP 指令支援, 例如 MAC (multiply-add-accumulate)
還有 CLZ (count-leading-zero), 還有些 Saturated Add 指令

藉著讀 ARM 的指令集, 能瞭解這顆 CPU 的確切能力, 以及限制


----


Chapter 4

Introduction to the THUMB Instruction Set

THUMB 是 ARM 的 16-bit 指令集, 執行效能比較差, 但是程式碼比較短
在手機上, Flash 也斤斤計較的場合, 這種指令集就有他的用處了

ARM 能支援 32-bit 和 16-bit 指令互相切換, 具體切換的方式書上有寫
切換的程式段叫 veneer (我第一次看到這個詞, 完全不知道在說什麼)

這一章看看即可


--

Chapter 5
Efficient C Programming

這本書約 700 pges, 如果只想看精華, 就是這一章了
這章的主題是 C code 和 assembly 之間的對應
我一直到學會這件事, 才敢小聲的說, 我會一點 C 程式設計


這章包括了...

Basic C data types

C 語言很多 data type 都有 machinie level 的支援
了解機器對這些 data type 的支援, 是了解 C -> assembly 的重要關鍵

寫 C 時經常會宣告 local variable, 他們在機器底層的對應都是 register
就算放到 stack 去, 也是一個又一個 32-bit 的數值
所以除非是陣列, 不然直接宣告 unsigned int 即可

Function parameter 也是重要的點, function參數直接宣告成 u32/ s32
執行效能最好, 書上用 assembly 的觀點解釋這些事

C Looping Structure

迴圈怎麼寫效果最好, 執行速度最快, 這一段書上用組合語言有精闢的分析
現代 compiler 已經能做好很多事, 如果了解 compiler 最佳化的方式和限制
對程式功力會有大幅的幫助

Register Allocation / Function Calls

了解呼叫函數時 compiler 是怎麼配置暫存器, 對於寫好程式極重要
這個主題也是寫 C 程式的重要課題, 怎麼平衡函數的 overhead 和結構化設計

Pointer Aliasing

這章講解 compiler 沒辦法把 code 最佳化的原因, 值得細讀

Structure Arrangement

C 語言宣告的 structure, 怎麼對應到記憶體配置, 這是 C 的進階主題
這也是每個 C programmer 需要知道的事

Convert Division to Multiplication


Others...


Chapter 6
Writing and Optimizing ARM Assembly Code


如果有一天, 有人逼你用組語寫程式, 對某段程式做最佳化, 讀這一章就對了.
如果沒有, 這一章可以當作增廣見聞來讀


Pipeline 的處理器都各種 dependency 要 handle
寫組語的好處是, 程式設計師可以調整指令的順序, 避開這些限制

這一章讀起來的感覺很像 Computer Architecture/ Organization.
只是那兩本聖經本用 MIPS 舉例, 這章用 ARM 舉例


ARM 很有特色的 conditional execution 這一章也有說明
善用這些指令, 能很漂亮的避開 branch 指令



Chapter 7
Optimized Primitives

這一章其實可以跳過, 有需要再回來看

他講了包括平方根, 除法, log/sin/cos/exp, bit-reversal, 這些運算的作法
老實講, 沒有實際上用, 還真的很難讀下去 XD



Chapter 8
Digital Signal Processing

老實講, 用 ARM 來做 DSP, 那鐵定是找自己麻煩的 XD

有些 ARM 有 DSP extension, 其實讀讀這些章節, 也可以理解 DSP 需要哪些指令支援
這章教你怎麼實作 FIR/ IIR/ FFT, 有需要再回來看


全書從這一章開始, 進入一些 Embedded System 的主題
這些主題比較接近怎麼 plan 一個完整的系統, designer 有哪些東西可用

我覺得每一章都有可讀之處, 接下來, 連載繼續了


Chapter 9
Exception And Interrupt Handling

中斷的處理是每顆 CPU 的重要主題, 這一章提示了 ARM 的中斷模型
一般的 CPU 中斷其實都不複雜, 事件來了, CPU 會跳去某個地方執行指令


反倒是軟體這裡的控制, 花樣多很多


有時候我們希望中斷反應時間很快, 希望中斷還沒結束, 就開啟中斷
這樣軟體的架構就會複雜很多

其實故事多發生在軟體這裡, 這一章講了好幾種 IRQ handling 的方式
我看了幾種就受不了了(笑), 自己以前玩的就是最簡單的
哪天有興致, 再來實作其他方式



Chapter 10
Firmware

這章很短, 他簡單介紹了 bootloader 的故事
bootloader 一開始都會有一段組合語言, 這章講解了其中一段, 值得一看



Chapter 11
Embedded Operating System

如果想知道一個 OS 簡單的組成, 這一章其實有些東西
我因為看過 uC/OS II 這個 OS 的 source code, 所以這一章是跳著看
我個人覺得, 移植一次 uC/OS II, 感覺會更踏實



Chapter 12
Cache

講 Cache 原理的書很多, Computer Architecture/Organization 都有專門的章節
這章不免俗的也講解了原理, 有以前的基礎, 看起來不會吃力

這章最主要的價值是, ARM上面的 cache 怎麼配置, 這本書講得離應用更近
包括那個該死的 CP15 要怎麼設定 :p

我自己玩 ARM 的時候就感受過 cache 的威力, 開了以後, 速度快很多, 殺很大



Chapter 13
Memory Protection Unit (MPU)

寫程式最怕記憶體存取超過邊界, C 語言沒有提供記憶體邊界保護的功能
有些 ARM 有提供硬體支援, 避免程式設計師做傻事

MPU 的功能和下一章要講的 MMU 相比, 功能比較弱
我還沒玩過 ARM 的 MPU, 這一章我是當作增廣見聞在看得



Chapter 14
Memory Management Unit (MMU)

不管是 computer organization/ architecture, OS, 都會講講 virtual memory
歌頌一下他會提供多大的彈性, 有多好有多好

但是實際上要怎麼用, 怎麼在彈性和效率之間取得平衡, TLB是什麼
這些主題我認為, 挑一顆有 MMU 的處理器玩過一次, 鐵定一生難忘

我自己玩 MMU 的時候, 也處在極痛苦的狀態
怎麼把課本學到的, 和硬體連結起來, 這不是普通的麻煩

一般工作時, 其實這些東西摸到的機會不多, 因為這些會有專門的 team 弄得好好的
但是有自己玩過一次, 知道他的痛苦, 真的是很好的經驗



Chapter 15
The Future of the Architecture

* DSP instructions
* SIMD
* Thumb-2



APPENDIX A
ARM and Thumb Assembler Instructions

去書店買任何 ARM 的書, 幾乎都會講一講 ARM 指令集
這個主題是如此的枯燥乏味, 但又如此的重要, 以至於每本書都要提一提

這本書的附錄我沒看, 但是我在別本書看過
我真的是一道一道指令看, 而且反覆看很多次, 查了又查
了解組合語言, 是認識 CPU 能力的最好方式, 確實有看的價值

我是寫 bootloader 時, 被逼著看別人寫的組語, 那時候學會的



APPENDIX B
ARM and Thumb Instruction Encodings

指令的編碼... 機械碼的格式... 其實可以跳過 Orz



APPENDIX D
Instruction Cycle Timings

如果想寫出超威的assembly, 這一章會是好朋友
但是這個機率通常... 滿低的 XD


後記


以前看書都是逐字逐句看, 這本書一開始也這麼讀
只是後來實在受不了, 尤其是 DSP那段, 這本書真的適合當工具書用


這本書足足 700 pages, 雖然沒看完裡每個字
倒也從頭到尾走了一次, 也寫下自己的讀書心得, 自我感覺挺不錯的 XD


最近的獵人漫畫, 畫了會長的練功過程
一拳又一拳充滿感激的正拳, 累積了基本功夫
最新一期(#291), 最後一個鏡頭會長說

"萬分感謝, 與你相會前, 我所經歷的一切"

謹以這個過程勉勵自己, 練功沒有捷徑
要成為絕世高手, 沒別的辦法, 一點一點的繼續學下去吧

留言

Unknown寫道…
請問您有這本書所提及的SLOS的source code嗎?

或是有作者的MAIL

因為書上有提及可以再作者網上找到可是我怎麼就是找不到作者網站

以上
吳小毛寫道…
Nylon7 你好

我沒有特別去找過這份source code
剛剛簡單在 google 撈了一下
還真的沒看到

如果你認識OS, 我推薦uC/OS II
這是open-source

如果你想知道 ARM 怎麼開機, bootloader, 我的blog裡有滿多文章的, 你可以參考

這個網誌中的熱門文章

STM32 UART + DMA,使用HAL實作TX/RX,以及不定長度接收

幼犬書桌椅選擇心得 升降桌 兒童桌椅

CANON G3000 廢墨瓶改裝