星期二, 9月 13, 2005

[note] ARM Architecture Fundamentals

Thumb:改善 code density。省memory。
不可能全用Thumb mode完成code,需要切換mode。
用組語寫要注意,需要自行設定(BX指令,Branch+modify state)
用C寫,complier階段個別compiler,link階段會處理。

ARM:hardware do everything
Real time 表現好,但受限於 hardware,彈性差。

MIPS:software do everything
software 應用的變化多

SPSR與CPSR的切換是用來處理Exception:
SPSR,用來儲存CPSR,進由ARM作,出需軟體完成。

User切換到FIQ時,
r0-r7相同。
r8-r12 使用banking技巧,為此mode獨有,可放入使用頻率高的指令,
免去堆疊。

User切換到IRQ
r13 r14 spsr,關係到Exception,

ARM的不能直接對memory作運算處理,要作load save,透過register memory搬遷
來處理。

Thumb:運算只能使用r0-r7,因為只有3 bit,只能定義8個,
(ARM有4 bit,可以使用r0-r15)

Qadd和add的差別:溢位時,Q flag會鎖住被set,不會溢位,值會鎖在saturation,
需用程式清除 Q flag。避免極正跳極負或極負跳極正。

T bit:read only,不能寫,寫的話compiler不會出錯,但執行會出錯。

在privileged mode可透過改mode bits來設定/強制改變mode。

exception發生時,自動進入ARM state,只能使用ARM instruction。

network多使用big endian,MS多使用little endian。有些chip在硬體上
可設定endian轉換機制,可視使用需求設定big或little,以硬體轉換。

[Quiz 1]

1. 7個。
2. 37個,使用banking技巧可用至100個以上。
3.
4. 目前fetch之指令。
5. User/System mode,都少了 spsr。
6. r0-r7
7.
8.
9.
10.
11.

ARM instruction Set的彈性比16 bits大。

Branch:範圍只有±32 MByte,寫組語時要注意。
標準的subroutine要用BL。
蜂巢式Branch,要把LR堆疊,以免後一個Branch的add蓋過前一個。

CP與ARM的關係為load-save架構,CP沒有特殊指令。
所有的CP都走同pipeline。
CP大多被高階ARM定義,只剩3個左右。
除非很複雜,不建議使用CP。

Thumb:memory 16 vs. 32
memory 16 bit時,reg丟堆疊時,要兩個cycle才能完成。
加上32 bit stack可維持32 bit memory之效能。

BX後的add可以不aligned(對齊)。

Quiz

1. 所有的都可以。
2. r4右移兩位
3. BL
4.
5.
6. improve code density
7. set

Neumann:instruction與data共用bus。對比為Harvard,獨立instruction bus。

T
D
M:32 bit乘法原先需要17個cycle。只需5個cycle。
I:允許經串列介面執行debug。

nIRQ/nFIQ:SOC需自行寫interrupt controller。
LOCK:lock住時,即使執行很久也要做完,別的task不能來搶。

ARM 7在decode stage要把Thumb code解成ARM code,ARM 9有獨立執行Thumb code
的能力,效率會比較好。

IRQ會在當時的exe執行完後才會被take。

32-bit data bus:包含instruction data/data data

pipeline stage數的trade-off:stage數低,每個phase作的事多,
速度無法拉高。stage數高,每個phase作的事少,接近一般CPU架構。

ARM9:pipeline stage數增加,讓每個pipelie stage作的事變單純,
減少instruction間共用硬體的機率。

因data/instruction bus獨立,一般table data屬於instruction section,
所以宣告memory時要設定一塊ROM/RAM重疊的區域,使table data可以上data bus。

寫組語時,ARM 9的程式順序會影響效能,因可能出現軟體衝突。

[Quiz 4]
1. 可以同時讀寫,速度變快。但要宣告時要注意
2. 5個stage
3. decode stage
4.

Memory map:
0x00000000要放 vecter table

ReMap bit

[Quiz 5]
1.
2. AHB:pipeline,APB:nonpipeline
3.
4. ROM first by system decoder
then reset run RAM by vecter table

ANSI C complier
armcc:ARM code
tcc:Thumb code

ISO/Embedded C++ complier
armcpp:ARM code
tcpp:Thumb code

r0-r3:用來作function I/O。
corruptible:r0-r3,r12,subrutine用到時不需preserve。
r4-r11:用到時需preserve,進時搬到堆疊,出時還原。

debug過程中,compiler用-g=-o0。

FIQ:0x1C,跟在vecter table後,不需處理堆疊。
IRQ:0x18,在32MB內

SWI超過32MB,要用 MOV指令。但MOV後的數值需遵循原則
距離 8 bit內
even rotating 4次內

不能使用MOV時,要用LDR改PC的值,指向所需的add,要注意當時PC值為fetch
的add而非exe。

當使用PC作為destination register,加上S即為exception return,
會自行將SPSR copy至CPSR。

LDM,將堆疊放回PC,使用{pc}^視為exception return。

FIQ多設定單一source,最常用的,如此可不經handler。

宣告__irq為Exception,非一般subrutine,會換mode,所以r0-r3,
r12也需preserve。最後還原PC時要多減4。(SUBS pc,lr,#4)

SWI的宣告需包含SWI number。ARM的complier不認識SWI number,
要根據SWI handler定義的table找到正確的內容。

程式放在flash裡,從0x04000000開始。

remap bit在special register裡。

fill的單位是line,drain可透過dirty bit決定,2個bit決定 1/2 line。

要增加cache,只能增加line,不能增加way,因為way代表的比較器
已定死(硬體)。

CAM:內含比較器的RAM。適用於多way,省比較器的數目。

lockdown的單位是way。

對cache作re-fill或flush時要清空lockdown bit。

self modifying:SWI

透過MRC或MCR操控cp15,執行cache cleaning/flush。

sync vs. async:sync FCLK 會受限,要配合BCLK的倍數。async在外部事件發生時,
會需要等待同步。

TLB:如同cache,存著VA-PA經常轉換的內容。

初始化設定:設定TTB,設定discripor

domain:於OS debug時,可設定3種state,設定MMU的access。

需要省memory時,才需要更動MMU設定。