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設定。