一、RAM分類
sram(靜態隨機存取存儲器):
- 原理:使用晶體管來存儲二進制數據0和1,通過雙穩態電路(由多個晶體管組成)來保持數據狀態,只要持續供電,數據就能穩定保存。
- 數據讀寫速度非常快
- 成本高,因為每個存儲單元需要多個晶體管構成,所以集成度相對較低,芯片面積較大,導致成本較高。
- 存儲密度低:由于每個存儲單元占用較多的晶體管和芯片面積,所以在相同的芯片面積下,能容納的存儲單元數量相對較少,即存儲密度低。
dram(動態隨機存取存儲器):
- 原理:利用電容的充放電來存儲數據,電容充滿電表示 1,放電后表示 0 。但由于電容存在漏電現象,所以數據不能長時間保持,需要定期進行刷新操作來維持數據的正確性。
- 功耗大:一方面,刷新操作需要額外的能量消耗;另一方面,DRAM 的讀寫操作也需要一定的功耗,所以整體功耗相對較大。
- 需外接刷新電路:為了保證數據的正確性,需要外部電路定期對存儲電容進行刷新,以補充因漏電而損失的電荷。
- 讀寫速度低于 SRAM:由于存在刷新操作以及電容充放電的延遲等因素,其讀寫速度比 SRAM 慢。
- 成本低,存儲密度大:每個存儲單元只需要一個晶體管和一個電容,在相同的芯片面積下可以集成更多的存儲單元,存儲密度大,同時成本相對較低,因此常用于計算機的主內存等對容量需求較大的場景。
sdram(同步動態隨機存取存儲器):
- 原理:本質上還是基于 DRAM 的電容充放電原理來存儲數據,但在此基礎上增加了同步電路。
- 增加同步電路:SDRAM 通過與系統時鐘信號同步,使得數據的讀寫操作能夠與系統時鐘精確配合。這樣可以更有效地控制數據的傳輸時間,提高了數據傳輸的效率和準確性。
- 提高數據讀寫速度:相比于普通的 DRAM,由于同步電路的存在,數據的讀寫操作更加有序和高效,從而提高了數據的讀寫速度,能夠更好地滿足計算機系統對內存讀寫速度不斷提高的需求
ddr ram(雙倍數據速率同步動態隨機存取存儲器):
- 原理:基于 SDRAM,在時鐘信號的上升沿和下降沿都能進行數據傳輸,實現了雙倍的數據傳輸速率。
- 雙倍數據速率:在相同的時鐘頻率下,DDR RAM 的數據傳輸量是 SDRAM 的兩倍。
iram(內部隨機存取存儲器):
- 本質:IRAM 并非是一種獨立于其他類型的全新 RAM,通常情況下,IRAM 就是 SRAM。
- 應用場景:它通常存在于 SoC(System on a Chip,片上系統)內部。因為其速度快的特點,在 SoC 中用于存儲對訪問速度要求較高的數據。
二、ROM的分類?
?
?三、數據和指令類型
?
Thumb是一般在安卓下使用;
大小端在ARM中可以被設置,一般是小端;
四、ARM處理器工作模式?
?
User(用戶模式):
- 非特權模式。意味著在此模式下運行的程序對系統資源的訪問受到限制,不能隨意訪問敏感資源或執行特權指令。
FIQ(快速中斷模式):
- 當一個高優先級的快速中斷產生時,處理器會進入此模式。快速中斷通常用于處理對響應時間要求極高的事件,例如某些實時性很強的硬件設備(如高速數據采集設備)產生的中斷請求。
- 該模式擁有獨立的一組寄存器(相較于其他模式),使得在處理快速中斷時可以減少寄存器切換的開銷,加快中斷處理速度,能快速響應并處理緊急且重要的事件。
IRQ(普通中斷模式):
- 當一個低優先級的普通中斷產生時,處理器進入此模式。普通中斷涵蓋了大量常見的設備中斷請求,比如鍵盤、鼠標等外設的中斷。
- 與 FIQ 對比:相比 FIQ,IRQ 的優先級較低,且沒有像 FIQ 那樣專門優化的寄存器組,處理速度相對較慢,但能滿足大多數普通外設中斷的處理需求。
Supervisor(超級用戶模式):
- 進入方式:當處理器復位(例如系統開機啟動)時,或者執行軟中斷指令(如 ARM 架構中的 SWI 指令,用于從用戶模式切換到特權模式并請求系統服務 )時,會進入該模式。
- 此模式屬于特權模式,擁有較高權限,可以訪問系統的所有資源,主要用于操作系統內核及一些關鍵的系統管理功能,比如內存管理、進程調度等。
Abort(異常中止模式):
- 當處理器在進行內存存取操作時發生異常,例如訪問了無效的內存地址、違反了內存訪問權限(如試圖寫入只讀內存區域)等情況,就會進入 Abort 模式。或者硬件本身就由問題。
- 在該模式下,操作系統或相關軟件可以進行錯誤處理,比如記錄錯誤信息、嘗試恢復系統狀態等,以保證系統在遇到存取異常時不至于崩潰。
Undef(未定義指令模式):
- 觸發條件:當處理器遇到無法識別或未定義的指令時,會進入此模式。這可能是由于軟件錯誤(如程序代碼損壞、錯誤的指令編寫 )或者硬件故障導致指令譯碼錯誤等原因引起的。
- 處理方式:在 Undef 模式下,通常會執行相應的錯誤處理程序,如向用戶報告錯誤、嘗試修復或終止出現問題的程序,以維護系統的穩定性。
System(系統模式):
- 特性:使用和 User 模式相同的寄存器集,但它是一種特權模式。這意味著它在擁有 User 模式寄存器配置的同時,還具備特權模式的權限,可以訪問系統的所有資源。
ARM9有7種工作模式,對于我們要學習的cortex-7還包括以下兩種:
cortex-A特有模式:
monitor監視模式:
- 它主要用于執行安全監控代碼,比如實現安全啟動、安全固件更新、監控系統中安全相關事件等功能。
?在編寫程序之前,將工作模式從supervisor切換至user
?包括打開icahe,關閉dcache,關閉mmu
?五、寄存器組織概要
1.寄存器組織
?
說明:
- 圖中框起來的寄存器表示不同的工作模式所特有的
- 要給每一個模式開辟不同的內存空間去管理不同的棧
- 所有的模式共用一個PC
- user模式下沒有SPSR(保存當前狀態寄存器),因為在異常發生時,對于user模式來說,處理器會切換到相應的異常模式去處理異常,比如發生 IRQ 中斷時,處理器進入 IRQ 模式,并把 User 模式下的 CPSR 保存到 SPSR_irq 中。在異常處理完成后,再從對應的 SPSR 恢復到 CPSR,回到 User 模式繼續執行程序。這就意味著 User 模式下的程序狀態可以在其他異常模式的 SPSR 中得到保存和恢復,不需要專門為 User 模式設置一個 SPSR。
- system模式使用user模式寄存器集
- SP應該被提前設置,防止切換至不同模式之后棧的內容被覆蓋
2. 寄存器個數?
?
3. 程序狀態寄存器?
六、異常處理
ARM除了有模式概念,對外界也會產生一些中斷
不是只有中斷才可以打破當前工作狀態,下面為不同的異常類型:
Reset(復位異常)
Undefined instruction(未定義指令異常)
- 當處理器遇到無法識別、譯碼的指令時觸發。可能是由于軟件錯誤(如程序代碼損壞、編寫了不支持的指令)、硬件故障導致指令讀取或譯碼出錯等情況;
Software interrupt(軟中斷異常)
- 并非硬件造成的,通過自己發送指令去打斷;
- 多任務并發就是靠軟中斷;
- 看一塊soc適不適合跑在操作系統上,就看能不能進行軟中斷異常,以及帶不帶MMU;
Prefetch Abort(預取中止異常):
- 處理器在預取指令階段,發現內存訪問存在異常情況,如訪問了無效的內存地址、違反了內存訪問權限(試圖讀取不可讀區域)等,就會觸發該異常。
Data Abort(數據中止異常):
- 當處理器在進行數據讀寫操作時,遇到內存訪問異常,如訪問了不存在的內存地址、沒有相應的數據訪問權限(如向只讀區域寫入數據)等情況時觸發。
說明:
- 偏移量:彼此之間相差4字節,即它們都在同一片內存空間中;
- 異常向量表:是一段連續的內存區域,存儲著不同類型異常對應的處理程序入口地址。當 ARM 處理器檢測到異常發生時,會根據異常的類型,迅速跳轉到異常向量表中對應的地址,進而執行相應的異常處理程序;
- 后面在寫代碼時,PC一開始要指向0x00復位,所以第一步要將整個異常的存儲數組跳過去,進行初始化;
- 中斷的中斷向量查出來之后,要趕緊切換至USER,才能讓其他的中斷進來;??
七、ARM匯編指令?
1. mov指令
? ? ?加載12位立即數到寄存器或轉移一個寄存器的值到另外一個寄存器;
-
MOV{S}<c> <Rd>, #<const>
eg:mov r0, #2 ;? ? ?加載立即數2到寄存器r0
-
MOV{S}<c> <Rd>, <Rm>
eg:mov r1, r0 ;? ? ?將r0寄存器的值加載到r1?
2. 對加載數據先做運算再存入?
ASR:算數右移
LSL:邏輯左移
LSR:邏輯右移
ROR:循環右移
eg:
- mov r1, r0? lsl? #1? ? ? //表示將r0往r1放之前可以先對其進行運算,將r0先左移一位結果為2,將結果保存在r1中
- mov r1, r0, lsl r2? ? ? ?//表示將r0中的結果左移r2位存放到r1中,但r0中的結果沒變
3.mvn指令?
eg: mvn r3, #1 ;1按位取反放入r3寄存器中,0xFFFFFFFE
表示把要裝入的數先按位取反之后再放入寄存器中,相當于走了兩步,提高了CPU速率
4.add指令 (求和)
add r1, r1, r0
add r0, r0, #1
5. sub指令 (減法)
SUB{S}<c> <Rd>, <Rn>, #<const>
SUB{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
八、立即數?
#const? ? ?相當于匯編中的常量,但并非任意數均可作為立即數
1. 判斷立即數的三個條件
- 如果某個數的數值范圍是0~0xFF之間,那么這個數一定是立即數;
- 把某個數展開成2進制,這個數的最高位1至最低位1之間的二進制數序列的位數不能超過8位;
- 這個數的二進制序列湊夠8位之后的的右邊必須為偶數個連續的?0
2. 舉例?
0x234 = 0000 0000 0000 0000 0000 0010 0011 0100
最高位1至最低位1之間的二進制數序列:1000 1101沒有超過8位
末尾1的右邊有2個0,所以0x234是立即數
0x3f4 = 0000 0000 0000 0000 0000 0011 1111 0100
最高位1至最低位1之間的二進制數序列:1111 1101 從第一個1開始到最后一個1之間沒有超過8位
末尾1的右邊有2個0,所以0x3f4是立即數
0x132 = 0000 0000 0000 0000 0000 0001 0011 0010
最高位1至最低位1之間的二進制數序列:1001 1001 從第一個1開始到最后一個1之間沒有超過8位
末尾1的右邊有1個0,不滿足第二條,所以0x132不是立即數
0x7f8 = 0000 0000 0000 0000 0000 0111 1111 1000
最高位1至最低位1之間的二進制數序列:1111 1111從第一個1開始到最后一個1之間沒有超過8位
末尾1的右邊有3個0,不滿足第二條,所以0x7f8不是立即數
0xfab4 = 0000 0000 0000 0000 1111 1010 1011 0100
最高位1至最低位1之間的二進制數序列:0011 1110 1010 1101 從第一個1開始到最后一個1之間超過8位,不滿足條件1,所以這個數不是立即數
3. 原因?
這是因為ARM中將這 12bits 分為 8bit 常數(0~255)和 4bit 循環右移位值(0~15)
8bit 常數范圍(0~255),位移的步進值是以2為單位(即實際位移 2 * rotate 位),可以表示循環有以(0~30)偶數位: 0、2、4、6、8、10、12、14、16、18、20、22、24、26、28、30。在實際存儲這個數值的時候,要想辦法把這個數壓縮到這12位中去。壓縮的方法就是找一個數,這個數必須是一個8bit數,之后循環右移2 * rotate位。如果能找打這個數,那么待保存的數就是立即數,否則就不是。
九、其他指令(ldr、str、bic、orr等)?
1.ldr(寄存器加載指令)
偽指令,可以把任意一個目標數加載進去,并不在那12個比特里,等于用了代碼區中的一部分空間;
- LDR{<c>}{<q>} <Rt>, <label> ;
- 如ldr r0, =0x2FAB4
ldr指令多用于從ram中將一個32位的字數據傳送到目的寄存器中
?2. bic(指定位清零指令)
bic {S}<c> <Rd>, <Rn>, #<const>;
將rn中的字數據const為1的比特清零,把結果放入rd
eg:
? ? ? ? mov r0, 0xFFFFFFFF
? ? ? ? bic r0, ?r0, #3;立即數哪些位為1就清掉
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? r0數據:0xFFFFFFFC
? ? ? ? bic r0, r0, #(0x1F << 8);連續5位清0
3.str指令(寫入)?
str 用于將數據存入地址中:
如上圖中,將r1的內容,寫入r0+4的地址
4. orr指令(指定位置1)?
mov r0, #0
orr?r0,? r0, #5;立即數帶1的比特位置1
orr?r0, r0, #(1<< 9);第9位置1
十、{s}
? ? 加s的作用是讓它去影響CPSR
匯編指令的s后綴,幾乎所有的匯編指令都可以在指令后面加上s后綴,s后綴的含義是在指令執行過程中會更新cpsr寄存器的N,V,C,Z位
- N:在結果是有符號的二進制補碼情況下,如果結果為負數,則N=1;如果結果為非負數,則N=0
- Z:如果ALU運算結果為0,則Z=1;如果結果為非零,否則Z=0
- C:是針對無符號數最高有效位向更高位進位時C=1;減法中運算結果的最高有效位從更高位借位時C=0
- V:該位是針對有符號數的操作,會在下面兩種情形變為1,兩個最高有效位均為0的數相加,得到的結果最高有效位為1;兩個最高有效位均為1的數相加,得到的結果最高有效位為0;除了這兩種情況以外V位為0
例如:? ?mov r0, #0xFFFFFFFF
????????????? adds r1, r0, #1
? ? ? ?上面的操作會導致Z,C置位,這是因為結果為0,并且從無符號數角度來看,已經從最高位向更高位進位了
???????而
????????????? mov r0. #0x7FFFFFFF
?????? ?????? adds r1, r0, #1
? ? ? ?會造成N位和C位置位,這是因為計算結果0x80000000最為位為1,代表負數,并且 從有符號角度來看,把一個整數加成了負數。
更新N,V,C,Z位有什么用呢?幾乎所有的arm指令都可以在指令之后可選地增加執行條件
例如:movcs r0, #100;表示只有在C位置位的情況下才能把100加載入r0,這樣的話就可以非常方便地實現指令的有條件執行。
十一、指令(cmp、b)
?1.cmp指令
CMP比較指令用于比較兩個寄存器的值或者比較一個寄存器和立即數的值,其原理是對待比較的兩個數求差,看結果是否為0,這個指令會無條件修改N,V,C,Z位。
2. 跳轉指令?
b指令類似c語言的goto語句,能夠實現無條件跳轉。跳轉時需要一個lable,表示要跳轉到什么地方去 ;
指令b本質是往PC里填了一個數,?b loop 相當于 ldr pc, =loop
練習:
?
2. 找出三個數的最大值
cmp r0, r1
blt less
greatmov r2, r0b cmp1less?mov r3, r1cmp1cmp r3, r2bge finishedmov r3, r2
3. 實現從0到100的和?
4.填充數組到指定地址的空間
ldr r0, =0x40000000mov r1, #0mov r2, #1loopcmp r1, #10bge finishedstr r2, [r0], #4add r2, r2, #1add r1, r1, #1ldr pc, =loop ;b loopfinishedb finishedend
?