SJTU嵌入式知識整理
1 計算機基本組成
了解基本組成模塊:運算器、控制器、存儲器、輸入/輸出、總線
硬件結(jié)構(gòu)中,字、位、字節(jié)的區(qū)別注意一下,并注意字?jǐn)?shù)代表存儲器的地址范圍,決定地址總線的位數(shù),位數(shù)代表存儲器的數(shù)據(jù)范圍,決定數(shù)據(jù)總線的位數(shù),字長也反映了計算機中并行運算的能力,這部分可以結(jié)合ppt的圖示來理解。
軟件系統(tǒng)中,可以關(guān)注一下計算機系統(tǒng)層次化結(jié)構(gòu)的那張圖,了解虛擬機、固件的定義,操作系統(tǒng)的分類(包括交互式操作系統(tǒng)、實時操作系統(tǒng))
第一章的最后部分是數(shù)據(jù)編碼與運算,主要是原碼、補碼、反碼的轉(zhuǎn)換以及IEEE754編碼,IEEE754編碼舉個例子,原碼補碼反碼最早數(shù)電里大家也比較熟了,不再贅述。
例1:寫出224.5625的IEEE754編碼
Step1:判斷正負(fù),正則S = 0,負(fù)則S = 1
Step2:轉(zhuǎn)換成二進(jìn)制,11100000.1001
Step3:數(shù)一下小數(shù)點到從左往后第一個1后面共有幾位,這里一共7位,則E = 127 + 7 = 134 = 10000110
Step4:去掉第一個1及其前面部分和小數(shù)點,M = 1100000100100000000000,后面少多少0補多少,滿23位為止,即可得到最終結(jié)果
2 8086CPU功能結(jié)構(gòu)
8086CPU是16位微機,采用兩級流水,數(shù)據(jù)總線16位,地址總線20位,指令流水相關(guān)可以關(guān)注一下,看一下ppt
功能結(jié)構(gòu)上:EU負(fù)責(zé)指令譯碼和執(zhí)行指令、BIU負(fù)責(zé)地址形成、取指令、指令排隊、讀寫操作與總線控制
尋址方式與寄存器
寄存器的幾大類中,關(guān)注不同寄存器的基本功能,AX存放操作數(shù),BX存放內(nèi)存基地址,CX用于循環(huán)計數(shù)器、DX用于存放I/O端口地址,SP存放偏移地址指向棧頂、BP配合SS存放內(nèi)存基地址,SI存放源操作數(shù)偏移地址,DI存放目標(biāo)操作數(shù)偏移地址blabla,不過建議結(jié)合案例來記,為方便理解,后面尋址方式一起講。
PSW(程序狀態(tài)字)這一塊主要結(jié)合案例講解,它通過16位寄存器來反映運算結(jié)果的特征,當(dāng)然下面例子順便給出了常用PSW的功能,建議配合相關(guān)表達(dá)式食用更加。
例2:寫出5439H + 476AH運算后各個狀態(tài)標(biāo)志位的狀態(tài)
Step1:先轉(zhuǎn)化成二進(jìn)制加法:0101 0100 0011 1001 + 0100 0111 0110 1010 = 1001 1011 1010 0011
Step2:逐個分析,(1)CF:進(jìn)位標(biāo)志,如果進(jìn)位則CF = 1,此處位0;(2)PF:奇偶校驗位,運算結(jié)果低8位(注意只有低8位!!不能統(tǒng)計整個計算結(jié)果里面1的個數(shù)?。。?的個數(shù)為偶數(shù),PF = 1,此處低8為有4個1,故為PF = 1;(3)AF:低4位向高四位進(jìn)位時,AF = 1,此處發(fā)生進(jìn)位, AF = 1;(4)ZF:若運算結(jié)果為0,則ZF = 1,此處ZF = 0;(5)SF:若結(jié)果為正數(shù)則SF = 0,負(fù)數(shù)SF = 1,明顯這里最高位為1,SF = 1;(6)OF:若溢出,則OF = 1,此處有符號數(shù)超出了表示范圍,OF = 1
最大模式和最小模式這一塊,最小模式中數(shù)據(jù)16位地址20位分時復(fù)用,鎖存器確保地址信號的穩(wěn)定,緩沖器保持并增加數(shù)據(jù)的驅(qū)動能力(然后里面有一些引腳信號例如ALE/DEN/WR/NMI/RESET等等,建議了解一下功能定義,考試翻一下)然后時序的話看那張圖就行(最小模式別忘了Tw)
尋址方式與寄存器用法舉例
MOV AX 1234H 立即數(shù)尋址,AX存放操作數(shù)
易錯點:1、不能對段寄存器(CS、DS、SS、ES)用立即數(shù)尋址(MOV SS, 1234H?) ;2、立即數(shù)不能做目的操作數(shù)(MOV 12H,AL?)MOV SS ,AX;ADD AX,BX 寄存器尋址,SS存放地址
易錯點:1、CS一般不賦值(MOV CS,1234H?);2、兩操作數(shù)長度需一致(MOV AL,AX?)MOV AX,[1000H] 直接尋址
MOV BX,[DI];MOV [SI],DS 寄存器間接尋址
MOV BX,[SI + 1000H];MOV BX,VAL[SI] 寄存器相對尋址,第二種情況易錯
MOV AX,[BX + SI + VAL];MOV AX,VAL[BX][SI];MOV AX,[BX + VAL][SI] 相對基址變址尋址,情況比較多,完整的可以看課件
IN AL/AX 12H/DX;OUT 12H/DX AL/AX I/O端口尋址
MUL BX 隱含尋址
更多的易錯點可以看作業(yè)題!
然后了解CISC與RISC區(qū)別(看課件),之后是一些基本指令,完全背下來肯定不可能,這邊建議大概記住一些基本的功能
指令性語句
與堆棧相關(guān)的,POP/PUSH;交換數(shù)據(jù)的,XCHG;輸入輸出數(shù)據(jù)的,IN/OUT
易錯點:8位端口地址允許用立即數(shù)表示,但16位端口地址就需要用DX了取地址與傳地址(類似于指針):LEA/LDS/LES
基本算數(shù):加法系A(chǔ)DD/ADC,減法系SBB/SUB(區(qū)別與CF有關(guān),方便進(jìn)位借位),比較CMP,取反NEG,乘法除法MUL/IMUL/DIV/IDIV
一些對位的操作:異或AND/OR,移位SA系/SH系/RO系/RC系,具體考場用到直接查表,這些對位的操作可以置位,還是比較常用的
程序跳轉(zhuǎn):J系,有JMP這樣無條件跳轉(zhuǎn)的,也有JZ/JNZ/JCXZ這樣有條件跳轉(zhuǎn)的,肯定記不住,各種條件判斷用到時查表;LOOP/LOOPE/LOOPNE注意區(qū)別,查表即可
控制位:主要是控制標(biāo)志位CF/IF/DF,例如CLC/STC/STI/CLI/STD/CLD
偽指令語句
與指令性語句區(qū)別在于有無對應(yīng)的機器指令
定義變量:DB/DW/DD/DQ,例如 DATA DB 10H,20H,30H
定義符號常量:EQU,例如 NUM1 EQU 2,COUT EQU CX(將COUT作為CX的同義名)
程序定位:ORG,例如 ORG 100H(指定下一個語句的偏移地址為100H)
取內(nèi)存數(shù)的段內(nèi)偏移地址和段地址:OFFSET/SEG,例如MOV BX, OFFSET TABLE(把這個之前定義的表頭的數(shù)據(jù)端偏移量送到BX)
屬性賦值操作符:PTR,例如 MOV WORD PTR [BX],1234H(將1234送到BX,BX屬性為字)
易錯點:PTR本身并不分配存儲單元
*定義函數(shù): PROC…ENDP停止匯編:END
定義段:堆棧段(.stack),數(shù)據(jù)段(.data),代碼段(.code)
程序設(shè)計的化個人感覺估計也就是填個空,整體設(shè)計估計以后也不太用得到,畢竟google一下啥都有,以后寫匯編找找資料肯定都能寫嘛,關(guān)鍵一些指令指導(dǎo)什么用就行了
3 存儲系統(tǒng)
存儲器組織
8086存儲器的存儲單元是字節(jié),然后這一塊需要注意物理地址與有效地址的計算
例3:可執(zhí)行程序大小為2kB,程序加載后,CS = 1000H,IP = 0000H,則該程序末地址為: 1000H * 16 + 0000H + 0800H - 1H = 107FFH(別忘了還要減1)
在存儲芯片這一塊,關(guān)注SRAM/DRAM/ROM的特點,然后看看芯片結(jié)果,問大家這是什么芯片翻翻資料就行了,引腳適當(dāng)關(guān)注即可。
例4:8位地址線的DRAM芯片Intel2164含有多少的地址單元?
這里著重注意一下DRAM芯片是行列兩部分地址,先行8位,再列8位選通,故共2的16次方,64k存儲單元。
易錯點:計算DRAM芯片存儲單元時記得有行列兩部分地址
這里還有的重點是存儲器與8086CPU的連接,注意一下幾個譯碼方式,線性選擇、全譯碼、部分譯碼,比較重要的是如何確定尋址范圍。
例5:實驗一:(1)確定芯片U10與U11哪個是偶地址空間哪個是奇地址空間;(2)確定存儲器的基地址和總存儲容量
解答:看下面的74LS138芯片,明顯要想CE0,CE1發(fā)揮作用,顯然需要讓Y4發(fā)揮作用,因此Addr16 = 0,Addr17 = 0,Addr18 = 1,Addr19 = 0,而其他的Addr管腳影響的是輸出,故我們可以確定存儲地址為40000H-4FFFFH,容量共64KB,同時注意到Addr0為1時,CE0由于低電平有效,所以U10芯片不表示,U11芯片輸出,故U10為偶地址空間,U11為基地址空間。


4 8086中斷系統(tǒng)
中斷可以分為內(nèi)部中斷與外部中斷,外部中斷主要是由外部硬件請求產(chǎn)生的中斷,又稱硬件中斷,內(nèi)部中斷是指令執(zhí)行引起的中斷,又稱為軟件中斷。外部中斷分為非屏蔽中斷和可屏蔽中斷,非屏蔽中斷由NMI引入,可屏蔽中斷由INTR引入;內(nèi)部中斷有INT n指令中斷,除法錯中斷,內(nèi)部中斷等等。
中斷的優(yōu)先級順序從高到低:內(nèi)中斷(內(nèi)中斷里面除法錯誤 > INTO > INT n) > 非屏蔽中斷(NMI) > 可屏蔽中斷(INTR) > 單步中斷
這部分比較重要的是中斷向量表,它安排在內(nèi)存的前1kB內(nèi),即00000H-003FFH,0-4為專用中斷,08H-0FH為8259A中斷向量,10H-1FH為BIOS中斷向量,20H-3FH為DOS中斷調(diào)用,40H-FFH為用戶使用的中斷。中斷向量表的存放舉個例子
例6:設(shè)類型10的中斷服務(wù)程序的起始地址為0485:0016H,它在中斷向量表中如何存放?
Step1:確定初始物理地址,10H * 4 = 40H,則類型10的物理地址為00040H,00041H,00042H,00043H
Step2:內(nèi)容按小數(shù)端存放,故結(jié)果為00040H -- 16H,00041H -- 00H,00042H -- 85H,00043H -- 04H
中斷編程的實例可以看ppt的介紹。然后看一看基礎(chǔ)指令的應(yīng)用,包括RET,IRET,CLI等等。
5 典型接口芯片原理與應(yīng)用
簡單I/O接口電路及應(yīng)用
主要的目的是解決CPU與外設(shè)的匹配問題,包括在信息交換過程中速度不匹配和時序不匹配,簡單的接口芯片有單向緩沖器74LS244、雙向緩沖器74LS245、含三態(tài)門的鎖存器74LS373、不含三態(tài)門的鎖存器74LS273(相關(guān)接口需要注意)。數(shù)據(jù)傳輸方式上,軟件方式有查詢和中斷,硬件方式有DMA。
8255 & 8253
這章的重點肯定是8255和8253。8255三種工作方式,
方式0:基本輸入輸出,特點是A口C口高四位、B口C口低四位可分別定義為輸入輸出,互相獨立,主要應(yīng)用場景是無條件傳送方式(無需控制信號與查詢)、查詢工作方式(E.G. C口高四位定義為輸入接受外設(shè)信號,低四位輸出控制信號,AB兩口傳輸數(shù)據(jù))
方式1:選通輸入輸出,特點是A口高四位設(shè)定為輸入輸出口,C口高四位作為A口輸入輸出的控制信號(這是A組),B口低四位設(shè)定為輸入輸出口,C口低四位作為A口輸入輸出的控制信號(這是B組)
方式2:只有A口可以雙向傳輸,C口5根線提供雙向傳輸所需的控制信號,A口工作在方式2時B口可以工作在方式1和方式0,而C口剩下的三根線可作為輸入輸出或B口方式1之下的控制信號。
考試掌握方式0即可
然后編程的時候肯定要用到8255控制字,查表填寫程序就行。
8253有五種工作方式
方式0:輸出延時時間可變的上跳沿
方式1:輸出寬度為N * Tclk的單一負(fù)脈沖
方式2:輸出周期為N * Tclk,寬度為 Tclk的連續(xù)負(fù)脈沖
方式3:輸出周期為N * Tclk的連續(xù)方波
方式4:寬度為 Tclk的單一負(fù)脈沖(啟動計數(shù)為軟件)
方式5:寬度為 Tclk的單一負(fù)脈沖(啟動計數(shù)為硬件)
考試掌握方式0、2、3即可
然后編程的時候肯定要用到8253控制字,查表填寫程序就行。
例7:實驗3-1 (1)確定8253和8255的端口地址;(2)計算8255控制字;(3)讀取C口地址并把PC值輸出到PC6
(1)8253CS端是device1,8255的CS端是device3,控制device1需要Addr4 = 0,Addr5 = 0,Addr6 = 0,Addr7 = 0,Addr8 = 1,然后A口需要Addr1 = 0,Addr2 = 0,采用偶地址的話Addr0 = 0,故8253 T0為 1 0000 0000 = 100H,同理T1為102H,T2為104H,CS為106H。與8053同樣,8255采用device3,同理8255 PA為121H,PB為123H,PC為125H,CS為127H。
(2)實驗的圖中,考慮到PC口低四位是輸入的,C口高四位以及A口B口是輸出的,并且采用方式0,故8255初始字為10000001,8253則需要根據(jù)自己設(shè)定的時間來傳輸初始值,并且根據(jù)高位和地位來寫控制值,基本原理是一樣的。
(3)先讓DX指向C口,然后用IN AL,DX讀C口的值,利用AND指令,AND AH,10111111b來清除PC6,最后用OR指令置為PC6即可,OR AH,10111111b


串行通信
一次發(fā)送/接受1bit。傳輸方向有單工、半雙工、全雙工。傳輸速率,也叫波特率,表示單位時間傳輸?shù)奈粩?shù),波特率因子K為每bit占用的時鐘周期數(shù),K = 時鐘頻率/波特。然后這部分看一下習(xí)題稍微鞏固一下就可以了,基本就是一些很簡單的小計算。
例8:一個異步串行發(fā)送器,有8位數(shù)據(jù)位,1個奇偶校驗位,2個停止位,每秒發(fā)送100個字符,求波特率?
易錯點:千萬不要忘記還有一位起始位?。?!
波特率 = 每秒發(fā)送字符數(shù) * (起始位數(shù) + 數(shù)據(jù)位數(shù) + 奇偶校驗位數(shù) + 停止位數(shù)),這里波特率 = 100 * (1+8+1+2)= 1200bps
異步通訊的數(shù)據(jù)幀格式可以看一下圖,包含起始位、數(shù)據(jù)位、校驗位、終止位。數(shù)據(jù)位是低位先傳,高位后傳。
菜??寫blog的經(jīng)驗不多,分享知識,歡迎各位大佬指證orz!