SJTU嵌入式知识整理
1 计算机基本组成
了解基本组成模块:运算器、控制器、存储器、输入/输出、总线
硬件结构中,字、位、字节的区别注意一下,并注意字数代表存储器的地址范围,决定地址总线的位数,位数代表存储器的数据范围,决定数据总线的位数,字长也反映了计算机中并行运算的能力,这部分可以结合ppt的图示来理解。
软件系统中,可以关注一下计算机系统层次化结构的那张图,了解虚拟机、固件的定义,操作系统的分类(包括交互式操作系统、实时操作系统)
第一章的最后部分是数据编码与运算,主要是原码、补码、反码的转换以及IEEE754编码,IEEE754编码举个例子,原码补码反码最早数电里大家也比较熟了,不再赘述。
例1:写出224.5625的IEEE754编码
Step1:判断正负,正则S = 0,负则S = 1
Step2:转换成二进制,11100000.1001
Step3:数一下小数点到从左往后第一个1后面共有几位,这里一共7位,则E = 127 + 7 = 134 = 10000110
Step4:去掉第一个1及其前面部分和小数点,M = 1100000100100000000000,后面少多少0补多少,满23位为止,即可得到最终结果
2 8086CPU功能结构
8086CPU是16位微机,采用两级流水,数据总线16位,地址总线20位,指令流水相关可以关注一下,看一下ppt
功能结构上:EU负责指令译码和执行指令、BIU负责地址形成、取指令、指令排队、读写操作与总线控制
寻址方式与寄存器
寄存器的几大类中,关注不同寄存器的基本功能,AX存放操作数,BX存放内存基地址,CX用于循环计数器、DX用于存放I/O端口地址,SP存放偏移地址指向栈顶、BP配合SS存放内存基地址,SI存放源操作数偏移地址,DI存放目标操作数偏移地址blabla,不过建议结合案例来记,为方便理解,后面寻址方式一起讲。
PSW(程序状态字)这一块主要结合案例讲解,它通过16位寄存器来反映运算结果的特征,当然下面例子顺便给出了常用PSW的功能,建议配合相关表达式食用更加。
例2:写出5439H + 476AH运算后各个状态标志位的状态
Step1:先转化成二进制加法:0101 0100 0011 1001 + 0100 0111 0110 1010 = 1001 1011 1010 0011
Step2:逐个分析,(1)CF:进位标志,如果进位则CF = 1,此处位0;(2)PF:奇偶校验位,运算结果低8位(注意只有低8位!!不能统计整个计算结果里面1的个数!!)1的个数为偶数,PF = 1,此处低8为有4个1,故为PF = 1;(3)AF:低4位向高四位进位时,AF = 1,此处发生进位, AF = 1;(4)ZF:若运算结果为0,则ZF = 1,此处ZF = 0;(5)SF:若结果为正数则SF = 0,负数SF = 1,明显这里最高位为1,SF = 1;(6)OF:若溢出,则OF = 1,此处有符号数超出了表示范围,OF = 1
最大模式和最小模式这一块,最小模式中数据16位地址20位分时复用,锁存器确保地址信号的稳定,缓冲器保持并增加数据的驱动能力(然后里面有一些引脚信号例如ALE/DEN/WR/NMI/RESET等等,建议了解一下功能定义,考试翻一下)然后时序的话看那张图就行(最小模式别忘了Tw)
寻址方式与寄存器用法举例
MOV AX 1234H 立即数寻址,AX存放操作数
易错点:1、不能对段寄存器(CS、DS、SS、ES)用立即数寻址(MOV SS, 1234H ) ;2、立即数不能做目的操作数(MOV 12H,AL )MOV SS ,AX;ADD AX,BX 寄存器寻址,SS存放地址
易错点:1、CS一般不赋值(MOV CS,1234H );2、两操作数长度需一致(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 隐含寻址
更多的易错点可以看作业题!
然后了解CISC与RISC区别(看课件),之后是一些基本指令,完全背下来肯定不可能,这边建议大概记住一些基本的功能
指令性语句
与堆栈相关的,POP/PUSH;交换数据的,XCHG;输入输出数据的,IN/OUT
易错点:8位端口地址允许用立即数表示,但16位端口地址就需要用DX了取地址与传地址(类似于指针):LEA/LDS/LES
基本算数:加法系ADD/ADC,减法系SBB/SUB(区别与CF有关,方便进位借位),比较CMP,取反NEG,乘法除法MUL/IMUL/DIV/IDIV
一些对位的操作:异或AND/OR,移位SA系/SH系/RO系/RC系,具体考场用到直接查表,这些对位的操作可以置位,还是比较常用的
程序跳转:J系,有JMP这样无条件跳转的,也有JZ/JNZ/JCXZ这样有条件跳转的,肯定记不住,各种条件判断用到时查表;LOOP/LOOPE/LOOPNE注意区别,查表即可
控制位:主要是控制标志位CF/IF/DF,例如CLC/STC/STI/CLI/STD/CLD
伪指令语句
与指令性语句区别在于有无对应的机器指令
定义变量:DB/DW/DD/DQ,例如 DATA DB 10H,20H,30H
定义符号常量:EQU,例如 NUM1 EQU 2,COUT EQU CX(将COUT作为CX的同义名)
程序定位:ORG,例如 ORG 100H(指定下一个语句的偏移地址为100H)
取内存数的段内偏移地址和段地址:OFFSET/SEG,例如MOV BX, OFFSET TABLE(把这个之前定义的表头的数据端偏移量送到BX)
属性赋值操作符:PTR,例如 MOV WORD PTR [BX],1234H(将1234送到BX,BX属性为字)
易错点:PTR本身并不分配存储单元
*定义函数: PROC…ENDP停止汇编:END
定义段:堆栈段(.stack),数据段(.data),代码段(.code)
程序设计的化个人感觉估计也就是填个空,整体设计估计以后也不太用得到,毕竟google一下啥都有,以后写汇编找找资料肯定都能写嘛,关键一些指令指导什么用就行了
3 存储系统
存储器组织
8086存储器的存储单元是字节,然后这一块需要注意物理地址与有效地址的计算
例3:可执行程序大小为2kB,程序加载后,CS = 1000H,IP = 0000H,则该程序末地址为: 1000H * 16 + 0000H + 0800H - 1H = 107FFH(别忘了还要减1)
在存储芯片这一块,关注SRAM/DRAM/ROM的特点,然后看看芯片结果,问大家这是什么芯片翻翻资料就行了,引脚适当关注即可。
例4:8位地址线的DRAM芯片Intel2164含有多少的地址单元?
这里着重注意一下DRAM芯片是行列两部分地址,先行8位,再列8位选通,故共2的16次方,64k存储单元。
易错点:计算DRAM芯片存储单元时记得有行列两部分地址
这里还有的重点是存储器与8086CPU的连接,注意一下几个译码方式,线性选择、全译码、部分译码,比较重要的是如何确定寻址范围。
例5:实验一:(1)确定芯片U10与U11哪个是偶地址空间哪个是奇地址空间;(2)确定存储器的基地址和总存储容量
解答:看下面的74LS138芯片,明显要想CE0,CE1发挥作用,显然需要让Y4发挥作用,因此Addr16 = 0,Addr17 = 0,Addr18 = 1,Addr19 = 0,而其他的Addr管脚影响的是输出,故我们可以确定存储地址为40000H-4FFFFH,容量共64KB,同时注意到Addr0为1时,CE0由于低电平有效,所以U10芯片不表示,U11芯片输出,故U10为偶地址空间,U11为基地址空间。


4 8086中断系统
中断可以分为内部中断与外部中断,外部中断主要是由外部硬件请求产生的中断,又称硬件中断,内部中断是指令执行引起的中断,又称为软件中断。外部中断分为非屏蔽中断和可屏蔽中断,非屏蔽中断由NMI引入,可屏蔽中断由INTR引入;内部中断有INT n指令中断,除法错中断,内部中断等等。
中断的优先级顺序从高到低:内中断(内中断里面除法错误 > INTO > INT n) > 非屏蔽中断(NMI) > 可屏蔽中断(INTR) > 单步中断
这部分比较重要的是中断向量表,它安排在内存的前1kB内,即00000H-003FFH,0-4为专用中断,08H-0FH为8259A中断向量,10H-1FH为BIOS中断向量,20H-3FH为DOS中断调用,40H-FFH为用户使用的中断。中断向量表的存放举个例子
例6:设类型10的中断服务程序的起始地址为0485:0016H,它在中断向量表中如何存放?
Step1:确定初始物理地址,10H * 4 = 40H,则类型10的物理地址为00040H,00041H,00042H,00043H
Step2:内容按小数端存放,故结果为00040H -- 16H,00041H -- 00H,00042H -- 85H,00043H -- 04H
中断编程的实例可以看ppt的介绍。然后看一看基础指令的应用,包括RET,IRET,CLI等等。
5 典型接口芯片原理与应用
简单I/O接口电路及应用
主要的目的是解决CPU与外设的匹配问题,包括在信息交换过程中速度不匹配和时序不匹配,简单的接口芯片有单向缓冲器74LS244、双向缓冲器74LS245、含三态门的锁存器74LS373、不含三态门的锁存器74LS273(相关接口需要注意)。数据传输方式上,软件方式有查询和中断,硬件方式有DMA。
8255 & 8253
这章的重点肯定是8255和8253。8255三种工作方式,
方式0:基本输入输出,特点是A口C口高四位、B口C口低四位可分别定义为输入输出,互相独立,主要应用场景是无条件传送方式(无需控制信号与查询)、查询工作方式(E.G. C口高四位定义为输入接受外设信号,低四位输出控制信号,AB两口传输数据)
方式1:选通输入输出,特点是A口高四位设定为输入输出口,C口高四位作为A口输入输出的控制信号(这是A组),B口低四位设定为输入输出口,C口低四位作为A口输入输出的控制信号(这是B组)
方式2:只有A口可以双向传输,C口5根线提供双向传输所需的控制信号,A口工作在方式2时B口可以工作在方式1和方式0,而C口剩下的三根线可作为输入输出或B口方式1之下的控制信号。
考试掌握方式0即可
然后编程的时候肯定要用到8255控制字,查表填写程序就行。
8253有五种工作方式
方式0:输出延时时间可变的上跳沿
方式1:输出宽度为N * Tclk的单一负脉冲
方式2:输出周期为N * Tclk,宽度为 Tclk的连续负脉冲
方式3:输出周期为N * Tclk的连续方波
方式4:宽度为 Tclk的单一负脉冲(启动计数为软件)
方式5:宽度为 Tclk的单一负脉冲(启动计数为硬件)
考试掌握方式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则需要根据自己设定的时间来传输初始值,并且根据高位和地位来写控制值,基本原理是一样的。
(3)先让DX指向C口,然后用IN AL,DX读C口的值,利用AND指令,AND AH,10111111b来清除PC6,最后用OR指令置为PC6即可,OR AH,10111111b


串行通信
一次发送/接受1bit。传输方向有单工、半双工、全双工。传输速率,也叫波特率,表示单位时间传输的位数,波特率因子K为每bit占用的时钟周期数,K = 时钟频率/波特。然后这部分看一下习题稍微巩固一下就可以了,基本就是一些很简单的小计算。
例8:一个异步串行发送器,有8位数据位,1个奇偶校验位,2个停止位,每秒发送100个字符,求波特率?
易错点:千万不要忘记还有一位起始位!!!
波特率 = 每秒发送字符数 * (起始位数 + 数据位数 + 奇偶校验位数 + 停止位数),这里波特率 = 100 * (1+8+1+2)= 1200bps
异步通讯的数据帧格式可以看一下图,包含起始位、数据位、校验位、终止位。数据位是低位先传,高位后传。
菜🐀写blog的经验不多,分享知识,欢迎各位大佬指证orz!