赞
踩
三级流水线:
1.取指(从存储器装载一条指令);
2.译码(识别将要被执行的指令);
3.执行(处理指令并将结果写回寄存器)。
五级流水线:
取指 译码 执行 缓冲 写回
题目:
若每一条指令都可以分解为取指、分析和执行三步。己知取指时间t取指=4△t,分析时间t分析=3△t,执行时间t执行=5△t。。如果按照流水方式执行,执行完100条指令需要__△t。
解答:
因为第一条指令取指时间4t+分析时间3t+99个max{取指时间,分析时间,执行时间}+最后一条指令的执行时间5t,这个加起来就是507t
嵌入式系统分为;冯诺依曼结构和哈佛结构;
区别:哈弗结构采用独立的数据总线和地址总线;处理器可以同时进行对指令和数据的读写操作,使得处理器运行速度提高;
复杂指令集,也称为CISC指令集,(Complex Instruction Set Computing) x86
精简指令集,也称为RISC指令集,(Reduced Instruction Set Computing) ARM/MIPS
1、精简指令集每条长度固定32位;
2、精简指令集不能直接操作内存数据,需要用load/store命令;
Cortex-M3内核采用嵌套中断向量控制器 NVIC,使得中断响应时间减少;
Cortex-M3采用位绑定操作,是的响应速度更快;
位绑定操作解释如下:
STM32将寄存器映射到了位带区(bit_band region),这样就可以通过统一的线性寻址空间直接操作寄存器了,这个空间就是0x00000000~0xFFFF FFFF共4GB大小,寄存器只是其中一小部分,其他包括程序存储区、数据存储区、输入输出端口等。这样的映射有两段,分别是0x2000 0000~0x200F FFFF(SRAM)及0x4000 0000~0x400F FFFF(片上外设)。
因为CPU是32位的,最方便快捷的是直接操作一个32位的地址。于是STM32又设计出别名区(Alias region)的概念,将一个32位地址空间对应到位带区(bit_band region)中的一个位。32位是STM32 CPU能独立访问的地址空间(称为字,即4个字节),将这个地址空间的起始位(bit0,其他bit1~bit31忽略)内容设为0或1就等于对位带区的相应位进行了操作,也相当于对寄存器进行了操作。
例如:位带区0x2000 0000的第0位对应别名区地址 0x2200 0000-0x2200 0003位。
位带区域0x2000 0000第0位是0还是1,只与别名区0x2200 0000-0x2200 0003的最后一位有关,即只与别名区0x2200 0000-0x2200 0003的奇偶有关,奇数为1,偶数为0;
输入模式
1-输入浮空(GPIO_Mode_IN_FLOATING)
浮空输入状态下,IO电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。一般用于串口输入和按键输入;
2-模拟输入(GPIO_Mode_AIN)
关闭施密特触发器,将电压信号传送到片上外设模块,ADC输入或低功耗下使用该模式;
3-输入上拉(GPIO_Mode_IPU) 默认电平为高电平;
4-输入下拉(GPIO_Mode_IPD) 默认电平为低电平;
输出模式
5-开漏输出(GPIO_Mode_Out_OD)
需要外接上拉电阻,电流型驱动;
6-推挽式输出(GPIO_Mode_Out_PP)
可以输出高电平和低电平,连接数字器件;
7-开漏复用功能(GPIO_Mode_AF_OD)
用于 TX MOSI MISO SCK SS
8-推挽式复用功能(GPIO_Mode_AF_PP)
用于 IIC SDA SCL
异步通信是按字符传输的。每传输一个字符就用起始位来进来收、发双方的同步。不会因收发双方的时钟频率的小的偏差导致错误。
这种传输方式利用每一帧的起、止信号来建立发送与接收之间的同步。
特点是:每帧内部各位均采用固定的时间间隔,而帧与帧之间的间隔时随即的。接收机完全靠每一帧的起始位和停止位来识别字符时正在进行传输还是传输结束。
缺点是传输速率慢;
同步通信方式的特点:
进行数据传输时,发送和接收双方要保持完全的同步,因此,要求接收和发送设备必须使用同一时钟。
优点是可以实现高速度、大容量的数据传送;
缺点是要求发生时钟和接收时钟保持严格同步,同时硬件复杂。
总线接口 | 串/并 | 同步/异步 | 速率 | 工作方式 | 用线 | 总线拓扑结构 | 通信距离 |
---|---|---|---|---|---|---|---|
UART | 串 | 异步 | 慢 | 全双工 | 2线 Rx、Tx | 支持总线式、星形、树形 | 远 最远1200m |
I2C | 串 | 同步 | 慢 | 半双工 | 2线 SDA、SCL | 总线型(特殊的树形) | 近 |
SPI | 串 | 同步 | 快 | 全双工 | 3线或4线 SCLK、SIMO、SOMI、SS(片选) | 环形 | 远 |
USB | 串 | 同步 | 快 | 半双工 | 4线 Vbus(5V)、GND、D+、D-(3.3V) | 星形 | 近 |
ARM 处理器一般共有 37 个寄存器,其中包括:31 个通用寄存器,包括 PC(程序计数器)在内,都是 32 位的寄存器。
R0 – R12 未分组寄存器,通用寄存器,保存临时变量;
R13/SP: 栈指针寄存器,记录栈顶指针;
R14/LR: 链接返回寄存器,保存程序的返回地址;
R15/PC: PC指针 程序计数器;
CPSR: 当前程序状态寄存器;
SPSR: 备份程序状态寄存器;
普通模式(Normal)
(1)User:非特权模式,大部分任务执行在这种模式
特权模式(Privilege)
(2)FIQ:当一个高优先级(fast) 中断产生时将会进入这种模式
(3)IRQ:当一个低优先级(normal) 中断产生时将会进入这种模式
(4)Supervisor:当复位或软中断指令执行时将会进入这种模式(SVC模式)
(5)Abort:当存取异常时将会进入这种模式
(6)Undef:当执行未定义指令时会进入这种模式
(7)System:使用和User模式相同寄存器集的特权模式。
地址 | 中断 |
---|---|
0x00 | Reset |
0x04 | Undef |
0x08 | SWI |
0x0C | Prefetch Abort |
0x10 | Data Abort |
0x14 | (Reserved) |
0x18 | IRQ 中断模式 |
0x1C | FIQ 快速中断模式 |
ROM
掉电不丢失数据,容量大,价格便宜
ROM英文名Read-Only Memory,只读存储器,里面数据在正常应用的时候只能读,不能写,存储速度不如RAM。
PROM:(P指的programmable)可编程ROM,根据用户需求,来写入内容,但是只能写一次,就不能再改变了
EPROM:PROM的升级版,可以多次编程更改,只能使用紫外线擦除
EEPROM:升级版,可以多次编程更改,使用电擦除
RAM
速度最快,掉电丢失数据,容量小,价格贵
RAM英文名random access memory,随机存储器,之所以叫随机存储器是因为:当对RAM进行数据读取或写入的时候,花费的时间和这段信息所在的位置或写入的位置无关。
RAM分为两大类:SRAM和DRAM。
SRAM是静态(S指的static)RAM,静态指的不需要刷新电路,数据不会丢失,SRAM速度非常快,是目前读写最快的存储设备了。
DRAM是动态RAM,动态指的每隔一段时间就要刷新一次数据,才能保存数据,速度也比SRAM慢,不过它还是比任何的ROM都要快。
SDRAM是同步(S指的是synchronous)DRAM,同步是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准
DDR、DDR2、DDR3都属于SDRAM,DDR是Double DateRate的意思,三种指的是同一系列的三代,速度更快,容量更大,功耗更小,现在出了DDR4,也是同一系列
FLASH
掉电不丢失数据,容量大,价格便宜
FLASH:存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据。分为NAND FLASH和NOR FLASH,NOR FLASH读取速度比NAND FLASH快,但是容量不如NAND FLASH,价格上也更高,但是NOR FLASH可以芯片内执行,样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。NANDFLASH密度更大,可以作为大数据的存储。
FLASH在写之前一定要擦除;
用户不能直接在NAND FLASH运行代码,可以直接在NOR FLASH上运行代码,用来作boot。
大端模式:是数据的高字节保存在低地址中,而数据的低字节保存在高地址中。
小段模式:数据的高字节保存在高地址中,而数据低字节保存在低地址中。
判断方法一:用联合类型判断
所以我们可以定义联合体如下:
//method 1
union bit{//对齐原则,char与int指向的均是低位地址
int a;
char b;
};
这个时候我们赋值 a = 0x12345678,如果低位字节的b存放的是0x78,则说明是小端模式,若为0x12则为大端模式:
#include <stdio.h>
union bit{//对齐原则,char与int指向的均是低位地址
int a;
char b;
};
int main(){
bit test;
test.a = 0x12345678;
if(test.b == 0x78)//如果低位地址保存的是1,即低位字节在低位地址,为小端
printf(“本机为小端模式\n”);
else
printf(“本机为大端模式\n”);
return 0;
}
判断方法二:利用强制类型转换判断
这种方式需要定义一个字节指针,指向int型的低位地址,因为要用到强制类型转换,故而称为利用强制类型转换的判断方法:
//method 2
void judge(void){
int i = 0x12345678;
char *p;
p = (char )&i;//强制类型转换成char型指针,指向的位置为低位地址
if(*p == 0x78)//低位地址存储的是低位字节,则为小端
printf(“本机为小端模式\n”);
else
printf(“本机为大端模式\n”);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。