嵌入式系统设计与应用
目錄
第一章 嵌入式系統(tǒng)概述
第二章 ARM處理器體系結(jié)構(gòu)
第三章 ARM指令集
第四章 S5PV210處理器
第五章 Linux操作系統(tǒng)和內(nèi)嵌式匯編
第十章 SQL數(shù)據(jù)庫(kù)
第十一章 開(kāi)發(fā)設(shè)計(jì)案例
第一章 嵌入式系統(tǒng)概述
嵌入式系統(tǒng)的組成:以嵌入式處理器為中心,配置存儲(chǔ)器、I/O設(shè)備、通信模塊以及電源等必要的輔助接口組成
嵌入式系統(tǒng)的基本架構(gòu):設(shè)備驅(qū)動(dòng)層 ,實(shí)時(shí)操作系統(tǒng)(RTOS),應(yīng)用程序接口層(API).和實(shí)際應(yīng)用程序?qū)?/span>
嵌入式操作系統(tǒng)的作用:(1)補(bǔ)平硬件差異的界面或是說(shuō)隱藏硬件,讓應(yīng)用程序可以在上面運(yùn)行
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)?程序設(shè)計(jì)人員無(wú)須考慮到不同硬件所造成的差異,可專注于所擅長(zhǎng)領(lǐng)域的開(kāi)發(fā)??
嵌入式系統(tǒng)的常見(jiàn)類型:(1)商用型的操作系統(tǒng)主要有VxWorks、Windows CE 、Psos、Palm OS、OS-9、LynxOS、QNX、LYNX等
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)免費(fèi)型的操作系統(tǒng)主要有Linux和μC/OS-II?
Cortex-A系列的應(yīng)用方向:高端智能手機(jī)、大屏幕的移動(dòng)設(shè)備、企業(yè)網(wǎng)路設(shè)備、服務(wù)器、無(wú)線基臺(tái)、數(shù)字電視。
Cortex-R系列的應(yīng)用方向:如汽車制動(dòng)系統(tǒng)、動(dòng)力傳動(dòng)解決方案、大容量存儲(chǔ)控制器等深層嵌入式實(shí)時(shí)應(yīng)用。
Cortex-M系列的應(yīng)用方向:針對(duì)成本和功耗敏感的應(yīng)用,如智能測(cè)量、人機(jī)接口設(shè)備、汽車和工業(yè)控制系統(tǒng)、家用電器、消費(fèi)性產(chǎn)品和醫(yī)療器械等。
第二章 ARM處理器體系結(jié)構(gòu)
ARM處理器的發(fā)展過(guò)程(大概發(fā)展過(guò)程了解一下,產(chǎn)品系列)
ARM處理器發(fā)展過(guò)程中體系結(jié)構(gòu)的演變(了解)
一些經(jīng)典的處理器采用的是哪些架構(gòu)(暫時(shí)不知道哪些是經(jīng)典的處理器)(了解)
| V1 | ARM1 |
| V2 | ARM2 |
| V2a | ARM2aS、ARM3 |
| V3 | ARM6、ARM600、ARM610、ARM7、ARM700、ARM710 |
| V4 | Strong ARM、ARM8、ARM810 |
| V4T | ARM7TDMI、ARM720T、ARM740T、ARM9TDMI、ARM920T、ARM940T |
| V5TE | ARM9E-S、ARM10TDMI、ARM1020E |
| V6 | ARM11、ARM1156T2-S、ARM1156T2F-S、ARM1176JZF-S、ARM11JZF-S |
| V7 | ARM Cortex-M、ARM Cortex-R、ARM Cortex-A |
| V8 | Cortex-A53/57、Cortex-A72等 |
比較新的產(chǎn)品所使用的的一些處理器類型
Cortex-A8處理器工作模式
| 用戶模式 | 正常程序執(zhí)行模式 |
| 系統(tǒng)模式 | 使用和用戶模式相同的寄存器組,用于運(yùn)行特權(quán)級(jí)操作系統(tǒng)任務(wù) |
| 管理模式 | 系統(tǒng)復(fù)位或軟件中斷時(shí)進(jìn)入該模式,是供操作系統(tǒng)使用的一種保護(hù)模式 |
| 外部中斷模式 | 低優(yōu)先級(jí)中斷發(fā)生時(shí)進(jìn)入該模式,常用于普通的外部中斷處理 |
| 快速中斷模式 | 高優(yōu)先級(jí)中斷發(fā)生時(shí)進(jìn)入該模式,用于高速數(shù)據(jù)傳輸和通道處理 |
| 數(shù)據(jù)訪問(wèn)中止模式 | 當(dāng)存取異常時(shí)進(jìn)入該模式,用于虛擬存儲(chǔ)和存儲(chǔ)保護(hù) |
| 未定義指令中止模式 | 當(dāng)執(zhí)行未定義指令時(shí)進(jìn)入該模式,用于支持硬件協(xié)處理器的軟件仿真 |
| 安全監(jiān)控模式 | 可在安全模式和非安全模式下轉(zhuǎn)換 |
?Cortex-A8處理器支持的數(shù)據(jù)類型
- 字節(jié):8位
- 半字:16位
- 字:32位
- 雙字:64位
?Cortex-A8處理器的儲(chǔ)存模式
- 大端模式:被存字?jǐn)?shù)據(jù)的高字節(jié)存儲(chǔ)在存儲(chǔ)系統(tǒng)的低地址中,而被存字?jǐn)?shù)據(jù)的低字節(jié)則存放在存儲(chǔ)系統(tǒng)的高地址中.
- 小端模式:與大端存儲(chǔ)格式相反,在小端存儲(chǔ)格式中,存儲(chǔ)系統(tǒng)的低地址中存放的是被存字?jǐn)?shù)據(jù)中的低字節(jié)內(nèi)容,存儲(chǔ)系統(tǒng)的高地址存放的是被存字?jǐn)?shù)據(jù)中的高字節(jié)內(nèi)容
舉例:一個(gè)32字的0x12345678
| 78 |
| 56 |
| 34 |
| 12 |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
小端模式在高地址為12,低地址為78.
ARM處理器中各種異常中斷
| 復(fù)位異常 | 管理模式 | 1 |
| 數(shù)據(jù)異常中止 | 數(shù)據(jù)訪問(wèn)中止模式 | 2 |
| 快速中斷異常(FIQ) | 快速中斷模式 | 3 |
| 外部中斷異常(IRQ) | 外部中斷模式 | 4 |
| 預(yù)取指異常中止 | 未定義指令中止模式 | 5 |
| 軟件中斷異常(SWI) 未定義指令異常(包括協(xié)缺處理器) | 管理模式 未定義指令模式 | 6 |
狀態(tài)寄存器:ARM處理器有1個(gè)當(dāng)前程序狀態(tài)寄存器CPSR和6個(gè)備份程序狀態(tài)寄存器SPSR
工作機(jī)制:
- 保存最近執(zhí)行的算術(shù)或邏輯運(yùn)算的信息;
- 控制中斷的允許或禁止;
- 設(shè)置處理器工作模式。
原理:
- 每一種處理器模式下使用專用的備份程序狀態(tài)寄存器。
- 當(dāng)特定的中斷或異常發(fā)生時(shí),處理器切換到對(duì)應(yīng)的工作模式下,該模式下的備份程序狀態(tài)寄存器保存當(dāng)前程序狀態(tài)寄存器的內(nèi)容。
- 當(dāng)異常處理程序返回時(shí),再將其內(nèi)容從備份程序狀態(tài)寄存器回復(fù)到當(dāng)前程序狀態(tài)寄存器。
若內(nèi)存按字節(jié)編址,用存儲(chǔ)容量為8K*8比特的存儲(chǔ)器芯片構(gòu)成地址編號(hào)A0000H~DFFFFH的內(nèi)存空間,則至少需要多少片?
本題考查內(nèi)存容量的計(jì)算。
給定起、止地址碼的內(nèi)存容量 = 終止地址 – 起始地址 + 1。
將終止地址加1等于E0000H,再減去起始地址,即E0000H – A0000H = 40000H。
十六進(jìn)制的 (40000)16 = 218。
組成內(nèi)存儲(chǔ)器的芯片數(shù)量 = 內(nèi)存儲(chǔ)器的容量/單個(gè)芯片的容量。
218/(8*210) = 218/213 = 25
設(shè)指令由取指、分析、執(zhí)行3個(gè)子部件完成,每個(gè)子部件的工作周期均為Dt,采用常規(guī)標(biāo)量單流水線處理機(jī)。若連續(xù)執(zhí)行10條指令,則共需時(shí)間 ?Dt。(五級(jí)流水答案為14Dt)
本題考查指令流水的概念。
順序執(zhí)行時(shí),每條指令都需三步才能執(zhí)行完,沒(méi)有重疊。
所以連續(xù)執(zhí)行10條指令后,共需時(shí)間為2 + 10=12Dt。
第三章 ARM指令集
?ARM指令集的基本格式:〈opcode〉{〈cond〉} {S}〈Rd〉,〈Rn〉,{〈operand2〉}
ARM條件碼
| 0000 | EQ | Z置位 | 相等 |
| 0001 | NE | Z清零 | 不等 |
| 0010 | CS | C置位 | 無(wú)符號(hào)>= |
| 0011 | CC | C清零 | 無(wú)符號(hào)< |
| 0100 | MI | N置位 | 負(fù) |
| 0101 | PL | N清零 | 正或零 |
| 0110 | VS | V置位 | 溢出 |
| 0111 | VC | V清零 | 未溢出 |
| 1000 | HI | C置位Z清0 | 無(wú)符號(hào)> |
| 1001 | LS | C清零Z置位 | 無(wú)符號(hào)<= |
| 1010 | GE | N等于V | 帶符號(hào)>= |
| 1011 | LT | N不等于V | 帶符號(hào)< |
| 1100 | GT | Z清零且N等于V | 帶符號(hào)> |
| 1101 | LE | Z置位或N不等于V | 帶符號(hào)數(shù)<= |
| 1110 | AL | 忽略 | 無(wú)條件執(zhí)行 |
| 1111 | ?NV | 無(wú) | 未使用 |
ARM指令的尋址方式(9種)
1.立即尋址:立即尋址也叫立即數(shù)尋址,這是一種特殊的尋址方式,操作數(shù)本身就在指令中給出,只要取出指令也就取到了操作數(shù),這個(gè)操作數(shù)被稱為立即數(shù),對(duì)應(yīng)的尋址方式也就叫做立即尋址
ADD?? ?R0,R0,#1?? ??? ?/*R0←R0+1*/
ADD?? ?R0,R0,#0x3f?? ?/*R0←R0+0x3f*/
2.寄存器尋址:操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號(hào),指令執(zhí)行時(shí)直接取出寄存器值來(lái)操作。
MOV ?R1,R2?? ? ? ?;將R2的值存入R1?
SUB ?R0,R1,R2 ? ?;將R1的值減去R2的值,結(jié)果保存到R0
第二操作數(shù)移位方式
LSL:邏輯左移,空出的最低有效位用0填充。
LSR:邏輯右移,空出的最高有效位用0填充。
ASL:算術(shù)左移,由于左移空出的有效位用0填充,因此 ? 它與LSL同義。
ASR:算術(shù)右移,算術(shù)移位的對(duì)象是帶符號(hào)數(shù),移位過(guò)程中必須保持操作數(shù)的符號(hào)不變。如果源操作數(shù)是正數(shù),空出的最高有效位用0填充,如果是負(fù)數(shù)用1填充。
ROR:循環(huán)右移,移出的字的最低有效位依次填入空出的最高有效位。
RRX:帶擴(kuò)展的循環(huán)右移。將寄存器的內(nèi)容循環(huán)右移1位,空位用原來(lái)C標(biāo)志位填充。
ADD ? ?R3,R2,R1,LSR ?#2?? ?;R3 <—R2 + R1÷4
ADD ? ?R3,R2,R1,LSR ?R4?? ?;R3 <—R2 + R1÷2R4
3.寄存器間接尋址:寄存器間接尋址就是以寄存器中的值作為操作數(shù)的地址,而操作數(shù)本身存放在存儲(chǔ)器中。
LDR?? ?R0,[R1]?? ??? ?/*R0←[R1]*/ ? ? ?
STR?? ?R0,[R1]?? ??? ?/*[R1]←R0*/
第一條指令將以R1的值為地址的存儲(chǔ)器中的數(shù)據(jù)傳送到R0中。
第二條指令將R0的值傳送到以R1的值為地址的存儲(chǔ)器中。?
4.基址加偏址尋址:基址變址尋址就是將寄存器(該寄存器一般稱作基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加,從而得到一個(gè)操作數(shù)的有效地址。?
前變址模式:? ? ? ? ?LDR R0,[R1,#4]?? ?;R0←[R1+4]
自動(dòng)變址模式: ?? ?LDR R0,[R1,#4]!?;R0←[R1+4]、R1←R1+4
后變址模式:? ? ? ? ?LDR R0,[R1] ,#4?? ?;R0←[R1]、R1←R1+4
傳送數(shù)據(jù)類型:傳送數(shù)據(jù)可以是有符號(hào)、無(wú)符號(hào)的8位、16位半字和32位字。? ?
相對(duì)應(yīng)的在指令中增加一個(gè)字母表示數(shù)據(jù)類型: ?? ?
- ?B:選擇字節(jié)操作 ??
- ?H:選擇半字操作 ??
- ?不加則選擇字操作?
5.堆棧尋址:堆棧是一種數(shù)據(jù)結(jié)構(gòu),按先進(jìn)后出(First In Last Out,FILO)的方式工作,使用一個(gè)稱作堆棧指針的專用寄存器指示當(dāng)前的操作位置,堆棧指針總是指向棧頂.
四種類型的堆棧工作方式
- 滿遞增堆棧:堆棧指針指向最后壓入的數(shù)據(jù),且由低地址向高地址生成。
- 滿遞減堆棧:堆棧指針指向最后壓入的數(shù)據(jù),且由高地址向低地址生成。
- 空遞增堆棧:堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由低地址向高地址生成。
- 空遞減堆棧:堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由高地址向低地址生成
ARM指令:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Thumb指令:
?STMFD SP! {R1-R7,LR}?? ?;入棧? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?PUSH {R1-R7,LR}?? ?;入棧
?LDMFD SP! {R1-R7,LR}?? ?;出棧? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?POP {R1-R7,LR}?? ?;出棧?
6.塊拷貝尋址:塊拷貝尋址是多寄存器傳送指令LDM/STM的尋址方式。LDM/STM指令可以把存儲(chǔ)器中的一個(gè)數(shù)據(jù)塊加載到多個(gè)寄存器中,也可以把多個(gè)寄存器中的內(nèi)容保存到存儲(chǔ)器中.
7.相對(duì)尋址:與基址變址尋址方式相類似,相對(duì)尋址以程序計(jì)數(shù)器PC的當(dāng)前值為基地址,指令中的地址標(biāo)號(hào)作為偏移量,將兩者相加之后得到操作數(shù)的有效地址。
BL?? ?NEXT?? ??? ?;跳轉(zhuǎn)到子程序
? ? ? ? ? ? ? ? ? ? ? ? ;NEXT處執(zhí)行
?……?? ??? ??? ??? ??? ??? ??? ? ?? ?
NEXT
?……?? ?
?MOV?? ?PC,LR?? ??? ?;從子程序返回
8.變址尋址 :將某個(gè)寄存器的值與指令中給出的偏移量相加,形成操作數(shù)有效的地址,再根據(jù)該有效地址訪問(wèn)存儲(chǔ)器.
LDR? ? ? ? ? ? ? R0 , [ R1?, # 2 ]? ? ? ? ? ? ? ?;R0?← [ R1 + 2]
?9.多寄存器尋址:可以在一條指令中傳送多個(gè)寄存器的值,一條指令最多可以傳送16個(gè)通用寄存器的值.連續(xù)的寄存器之間用"-"連接,不連續(xù)的中間用","分隔;
LDMIA? ? ?R0 ! , {R1-R3,R5}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?;R1?← [ R0?]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;R2 ← [ R0 + 4 ]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;R3?← [ R0 + 8 ]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;R4?← [ R0 + 12?]?
?ARM中各種指令
1、ADD、SUB、 RSB、? ? ? ADC、? ? ? ? SBC、? ? ? ? ? ? ?RSC?
? ? ? ?加? ? ? ? ? ?減? ? ? ?反減? ? ? ?加帶進(jìn)位? ? ?減帶進(jìn)位? ? ? ? 反減帶進(jìn)位? ??
多個(gè)字節(jié)算術(shù)運(yùn)算舉例:
R2,R3中的64位整數(shù)與R0,R1中的64位整數(shù)相加,結(jié)果放在R4,R5中: ??
?ADDS R4,R0,R2?? ?;加低有效位 ??
ADC ?R5,R1,R3? ? ? ;加高有效位
96位減法舉例:
SUBS? ?R3,R6,R9 ?? ?
SBCS? R4,R7,R10 ?? ?
SBC? ? ?R5,R8,R11
2.AND、ORR、EOR、BIC
?邏輯與、或、? ?異或、位清零
3.MOV和MVN(傳送和取反傳送)
MVN指令:? ? ? ? ??MVN {條件}{S} ?目的寄存器, 源操作數(shù)
MVN指令將一個(gè)立即數(shù)、一個(gè)寄存器或被移位的寄存器的值先按位求反,再傳送到目的寄存器中。后綴S表示是否影響標(biāo)志位。
MVN ?R0, #0x0FF?? ??? ??? ? ;將立即數(shù)0xFF按位求反后裝入R0,操作后R0=0xFFFFFF00
?4.CMP和CMN(比較和比較反值)
這些指令將寄存器的值與Operand2進(jìn)行比較。它們根據(jù)結(jié)果更新條件標(biāo)志碼,但結(jié)果不放到任何寄存器中 ?? ?
CMP:根據(jù)Rn - Op2設(shè)置條件碼,結(jié)果丟棄 ?? ?
CMN:? ?根據(jù)Rn + Op2設(shè)置條件碼,結(jié)果丟棄
CMN ?R1, R0?? ??? ? ? ?;將R1的值和R0的值相加,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位 ? ? ?
CMN ?R1, #0x200 ? ? ? ? ;將R1的值和立即數(shù)200相加,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位
?5.TST和TEQ(測(cè)試和測(cè)試相等)
TST {cond} Rn,Operand2 ?? ?
TEQ {cond} Rn,Operand2
TST:對(duì)Rn的值和Operand2的值進(jìn)行按位“與”操作,設(shè)置條件碼,丟棄結(jié)果 ?? ?
TEQ:對(duì)Rn的值和OPerand2的值進(jìn)行按位“異或”操作,設(shè)置條件碼,丟棄結(jié)果
TST ?R1, #0x0F?? ??? ?;檢測(cè)R1的低4為是否為0
?6.MUL和MLA(乘法和乘加)
MUL {cond} {S} Rd,? ? Rm,? Rs?;
MLA {cond} {S} Rd , Rm , Rs , Rn ;? ? ? ? ? ? ? ? ? ? ? Rm*Rs+Rn->Rd
7.Load/Store指令
ARM的數(shù)據(jù)存取指令Load/Store是唯一用于寄存器和存儲(chǔ)器之間進(jìn)行數(shù)據(jù)傳送的指令。ARM指令集中有三種基本的數(shù)據(jù)存取指令: ?
- 單寄存器的存取指令(LDR,STR) ?
- 多寄存器存取指令(LDM,STM) ?
- 單寄存器交換指令(SWP)
單字和無(wú)符號(hào)字節(jié)的數(shù)據(jù)傳送指令
- 前變址格式? ? ? ?LDR|STR {<cond>} {B} Rd, [Rn, <offset>] {!} ? ?
- 后變址格式? ? ? ?LDR|STR {<cond>} {B} {T} Rd, [Rn],<offset> ? ?
- 相對(duì)PC的形式 LDR|STR {<cond>} {B} Rd, LABEL
半字和有符號(hào)字節(jié)的數(shù)據(jù)傳送指令
- 前變址格式 LDR|STR{ <cond>} H|SH|SB ?Rd, ?[Rn, <offest>]{!} ? ?
- 后變址格式 LDR|STR {<cond>} H|SH|SB ?Rd, ?[Rn], <offest>
式中<offset>是#±<8位立即數(shù)>或#±Rm;
H|SH|SB選擇傳送數(shù)據(jù)類型;
其它部分的匯編器格式與傳送字和無(wú)符號(hào)字節(jié)相同。
說(shuō)明:半字傳送的地址必須是偶數(shù)。
LDR和STR雙字:加載兩個(gè)相鄰的寄存器和存儲(chǔ)兩個(gè)相鄰的寄存器,64位雙字。
句法: ?? ?
- op{cond}D Rd,[Rn] ?? ?
- op{cond}D Rd,[Rn,offset]{!} ?? ?
- op{cond}D Rd,label ?? ?
- op{cond}D Rd,[Rn],offset
其中:Rd?? ?加載或存儲(chǔ)寄存器其中一個(gè),另一個(gè)是R(d+1)。?? ? ? ? ? ? ?
Rd必須是偶數(shù)寄存器,且不是R14 ?? ?
Rn ? ? ?除非指令為零偏移,或不帶回寫的前索引,否則,Rn不允許與Rd和R(d+1)相同
LDRD ?? ??? ?R6,[R11]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
LDRMID ?? ?R4,[R7],R2
STRD ?? ??? ?R4,[R9,#24]
STRD ?? ??? ?R0,[R9,R2]!
LDRD ?? ??? ?R1,[R6]
STRD ?? ??? ?R14,[R9,#36]
STRD ?? ??? ?R2,[R3],R6
8.多寄存器存取指令LDM/STM
多寄存器傳送指令可以用一條指令將16個(gè)可見(jiàn)寄存器(R0~R15)的任意子集合(或全部)存儲(chǔ)到存儲(chǔ)器或從存儲(chǔ)器中讀取數(shù)據(jù)到該寄存器集合中
LDM?/ STM { < cond > } < add mode > ?Rn { ! } , ?< registers > {?^ }
add mode?? ?IA、IB、DA、DB、FD、ED、FA、EA
Rn? ? ? ? ? ? ? ? 基址寄存器,裝有傳送數(shù)據(jù)的初始地址,?? ??? ?
? ? ? ? ? ? ? ? ? ? ?Rn不允許是R15
registers? ? ?加載或存儲(chǔ)寄存器列表。
^? ? ? ? ? ? ? ? ? 不允許在用戶模式或系統(tǒng)模式下使用.
LDMIA?? ??? ?R8,{R0,R2,R9} ?? ?
STMDB?? ?R1!,{R3-R6,R11,R12} ?? ?
STMFD?? ?R13!,{R0,R4-R7,LR} ?? ?
LDMFD?? ?R13!,{R0,R4-R7,PC} ?? ?
STMIA?? ??? ?R5!,{R5,R4,R9}
9.單寄存器交換指令(SWP)
SWP{<cond>} {B} Rd,Rm,[Rn]
SWPB R1,R1,[R0] ? ?交換字節(jié),將[R0]中的字節(jié)數(shù)據(jù)?? ??? ?讀取到R1中,同時(shí)將R1中的數(shù)據(jù)寫入到[R0]中 ?? ?
SWP ? R1,R2,[R3] ? ?交換字?jǐn)?shù)據(jù),將[R3]中的數(shù)據(jù)讀?? ??? ?取到R1中,同時(shí)將R2中的數(shù)據(jù)寫入到[R3]中
10.程序狀態(tài)寄存器與通用寄存器之間的傳送指令?
ARM指令中有兩條指令,用于在狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。修改狀態(tài)寄存器一般是通過(guò)“讀取-修改-寫回”三個(gè)步驟的操作來(lái)實(shí)現(xiàn)的。
這兩條指令分別是:
- 狀態(tài)寄存器到通用寄存器的傳送指令(MRS)
- 通用寄存器到狀態(tài)寄存器的傳送指令(MSR)
MRS ?R0, CPSR?? ??? ?;將CPSR的值復(fù)制到R0中 ? ?
ORR ?R0, R0, #C0 ? ? ;R0的位6和位7置1,即屏蔽外部中斷和快速中斷
MSR ?CPSR, R0?? ??? ?;將R0值寫回到CPSR中
?11.轉(zhuǎn)移指令
- B? ? ? ? ? ?轉(zhuǎn)移指令 ? ?
- BL? ? ? ? ?帶鏈接的轉(zhuǎn)移指令 ? ?
- BX? ? ? ? 帶狀態(tài)切換的轉(zhuǎn)移指令 ? ?
- BLX? ? ? 帶鏈接和狀態(tài)切換的轉(zhuǎn)移指令
B {條件} ?目標(biāo)地址
跳轉(zhuǎn)指令B是最簡(jiǎn)單的跳轉(zhuǎn)指令,跳轉(zhuǎn)到給定的目標(biāo)地址, ? 從那里繼續(xù)執(zhí)行。
B?? ? ? ? ?WAITA ? ?;無(wú)條件跳轉(zhuǎn)到標(biāo)號(hào)WAITA處執(zhí)行 B?? ?0x1234 ? ? ? ;跳轉(zhuǎn)到絕對(duì)地址0x1234處
BL {條件} ?目標(biāo)地址 ?
用于子程序調(diào)用,在跳轉(zhuǎn)之前,將下一條指令的地址復(fù)制到鏈接寄存器R14(LR)中,然后跳轉(zhuǎn)到指定地址執(zhí)行。?
BL?? ??? ?FUNC1?? ??? ? ;將當(dāng)前PC值保存到R14中,然后跳轉(zhuǎn)到標(biāo)號(hào)FUNC1處執(zhí)行
?BLX {條件} ?目標(biāo)地址
BLX指令從ARM指令集跳轉(zhuǎn)到指定地址執(zhí)行,并將處理器的工作狀態(tài)由ARM狀態(tài)切換到Thumb狀態(tài),同時(shí)將PC值保存到鏈接寄存器R14中
BLX?? ? ?FUNC1?? ? ;將當(dāng)前PC值保存到R14中,然后跳轉(zhuǎn)到標(biāo)號(hào)FUNC1處執(zhí)行,并切換到Thumb狀態(tài)
BLX?? ? ?R0? ? ? ? ? ? ?;將當(dāng)前PC值保存到R14中,然后跳轉(zhuǎn)R0中的地址處執(zhí)行,并切換到Thumb狀態(tài)
BX {條件} ?目標(biāo)地址
帶狀態(tài)切換的跳轉(zhuǎn)指令,跳轉(zhuǎn)到指定地址執(zhí)行。
若目標(biāo)地址寄存器的位[0]為1,處理器的工作狀態(tài)切換為Thumb狀態(tài),同時(shí)將CPSR中的T標(biāo)志位置1,目標(biāo)地址寄存器的位[31:1]復(fù)制到PC中;
若目標(biāo)地址寄存器的位[0]為0,處理器的工作狀態(tài)切換為ARM狀態(tài),同時(shí)將CPSR中的T標(biāo)志位清0,目標(biāo)地址寄存器的位[31:1]復(fù)制到PC中。
BX ? R0?? ??? ? ;跳轉(zhuǎn)R0中的地址處執(zhí)行,如果R0[0]=1,切換到Thumb狀態(tài)
12.異常中斷指令(感覺(jué)考不到)
- 軟件中斷指令(SWI) ?
- 斷點(diǎn)指令(BKPT—僅用于v5T體系)
軟件中斷指令SWI用于產(chǎn)生SWI異常中斷,用來(lái)實(shí)現(xiàn)在用戶模式下對(duì)操作系統(tǒng)中特權(quán)模式的程序的調(diào)用;
斷點(diǎn)中斷指令BKPT主要用于產(chǎn)生軟件斷點(diǎn),供調(diào)試程序用
13.前導(dǎo)0計(jì)數(shù)CLZ
對(duì)Rd設(shè)置為Rm中為1的最高有效位的位置
即對(duì)Rm中的前導(dǎo)0的個(gè)數(shù)進(jìn)行計(jì)數(shù),結(jié)果放到Rd ?? ?
若Rm=0,則Rd=32 ?? ?
若Rm[31]=1,則Rd=0
MOV R11,#0x35E20 ?? ?
CLZ R5,R11?? ??? ?;R5=?
14.協(xié)處理指令(感覺(jué)不考,有空看看)
第四章 S5PV210處理器
S5PV210處理器的組成內(nèi)容:主要由6大部分組成,分別為CPU核心、系統(tǒng)外設(shè)、多媒體、電源管理、存儲(chǔ)器接口和Connectivity模塊。CPU和各個(gè)部分之間通過(guò)多層次AHB/AXI總線進(jìn)行通信。?
第五章 Linux操作系統(tǒng)和內(nèi)嵌式匯編
Linux 操作系統(tǒng)的基本體系結(jié)構(gòu)
ARM-Linux內(nèi)核的主要架構(gòu)及功能
進(jìn)程調(diào)度的一般原理:
- 進(jìn)程的調(diào)度策略(policy)
- 靜態(tài)優(yōu)先級(jí)(priority)
- 動(dòng)態(tài)優(yōu)先級(jí)(counter)
- 實(shí)時(shí)優(yōu)先級(jí)(rt-priority)
Policy是進(jìn)程的調(diào)度策略,用來(lái)區(qū)分實(shí)時(shí)進(jìn)程和普通進(jìn)程,二者調(diào)度算法不同,實(shí)時(shí)進(jìn)程優(yōu)先于普通進(jìn)程.進(jìn)程按照優(yōu)先權(quán)的高低被依次調(diào)用,實(shí)時(shí)優(yōu)先級(jí)級(jí)別最高
選擇進(jìn)程的依據(jù)
選擇進(jìn)程的依據(jù)主要有進(jìn)程的調(diào)度策略(policy) 靜態(tài)優(yōu)先級(jí)(priority) 動(dòng)態(tài)優(yōu)先級(jí)(counter) 實(shí)時(shí)優(yōu)先級(jí)(rt-priority)四個(gè)部分.
在Linux中,用函數(shù)googness()綜合四項(xiàng)依據(jù)及其他因素,賦予各影響因素權(quán)重,調(diào)度程序以權(quán)重作為選擇進(jìn)程的依據(jù)
在ARM匯編中調(diào)用C程序
C語(yǔ)言中內(nèi)嵌匯編(字符串復(fù)制)
#include <stdio.h> void my_strcpy(char *scr,const char *dst) { int ch; _ _arm {loop: LDRB ch,[src],#1 STRB ch,[dst],#1 CMP ch,#0 BNE loop } } int main(void) { const char *a=“Hello woorld!”; char b[20]; _ _arm { MOV R0,a MOV R1,b BL my_strcpy,{R0,R1} } printf(“Original string:%s\n”,a); printf(“Copied string:%s\n”,b); return 0; }第十章 SQL數(shù)據(jù)庫(kù)
本章只考選擇題
SQL數(shù)據(jù)庫(kù)是什么樣的數(shù)據(jù)庫(kù)
MySQL是多用戶、多進(jìn)程的SQL數(shù)據(jù)庫(kù)系統(tǒng)。MySQL既能夠作為一個(gè)單獨(dú)的應(yīng)用程序應(yīng)用在客戶端服務(wù)器網(wǎng)絡(luò)環(huán)境中,也能夠作為一個(gè)庫(kù)而嵌入到其他的軟件中。使用 C和 C++編寫,并使用了多種編譯器進(jìn)行測(cè)試,保證了源代碼的可移植性。MySQL為多種編程語(yǔ)言提供了 API。支持多線程,充分利用 CPU 資源。MySQL 軟件采用了雙授權(quán)政策,它分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開(kāi)放源碼這一特點(diǎn),一般中小型網(wǎng)站的開(kāi)發(fā)常選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫(kù)。
Sqlite主要特點(diǎn)有:
- 支持ACID事務(wù)。 零配置,即無(wú)需安裝和管理配置。
- 儲(chǔ)存在單一磁盤文件中的一個(gè)完整的數(shù)據(jù)庫(kù)。
- 數(shù)據(jù)文件可在不同字節(jié)順序的機(jī)器間自由共享。
- 支持?jǐn)?shù)據(jù)庫(kù)大小至2TB。 程序體積小,全部C語(yǔ)言代碼約3萬(wàn)行(核心軟件,包括庫(kù)和工具),250KB大小。
- 相對(duì)于目前其他嵌入式數(shù)據(jù)庫(kù)具有更快捷的數(shù)據(jù)操作。
- 支持事務(wù)功能和并發(fā)處理。 程序完全獨(dú)立,不具有外部依賴性。
- 支持多種硬件平臺(tái),如arm/ Linux、SPARC/Solaris等。
- 便攜性
- 易用性
- 緊湊性
- 有效性
- 可靠性
第十一章 開(kāi)發(fā)設(shè)計(jì)案例
嵌入式系統(tǒng)設(shè)計(jì)中基于協(xié)同設(shè)計(jì)概念的系統(tǒng)的設(shè)計(jì)方法
軟硬件協(xié)同設(shè)計(jì)是在系統(tǒng)目標(biāo)要求的指導(dǎo)下,通過(guò)綜合分析系統(tǒng)軟硬件功能及現(xiàn)有資源,協(xié)同設(shè)計(jì)軟硬件體系結(jié)構(gòu),以便能夠工作在最佳狀態(tài)
如圖所示為一種典型的嵌入式系統(tǒng)協(xié)同設(shè)計(jì)方法
傳統(tǒng)的嵌入式系統(tǒng)設(shè)計(jì)和協(xié)同設(shè)計(jì)的區(qū)別
傳統(tǒng)的嵌入式系統(tǒng)設(shè)計(jì):在整個(gè)設(shè)計(jì)過(guò)程中,通常采用“硬件優(yōu)先的原則",即在粗略估計(jì)軟件任務(wù)需求的情況下,首先進(jìn)行硬件設(shè)計(jì),然后在此硬件設(shè)計(jì)平臺(tái)上進(jìn)行軟件設(shè)計(jì)。
協(xié)同設(shè)計(jì):設(shè)計(jì)過(guò)程中硬件和軟件設(shè)計(jì)是相互作用的,在軟硬件功能分配時(shí)就考慮到了現(xiàn)有的軟硬件資源,在軟硬件功能的設(shè)計(jì)和仿真評(píng)價(jià)過(guò)程中,軟件和硬件是互相支持的.
總結(jié)
以上是生活随笔為你收集整理的嵌入式系统设计与应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java cs 顺丰运单_JAVA接入顺
- 下一篇: 如何解决Win10系统更新显示0x800