一,二嵌入式系统和虚拟内存和内存,ARM和Thunb

1字=2字节=16位,二进制0101就是4比特意思,32位电脑就是cpu一次能处理32位的数据的数

内存

http://cpu.zol.com.cn/31/311395_all.html //缓存与cpu的认识,当然在硬盘中也会设有缓存
为什么内存小于内存呢
还有就是内存的读写速度远远高于硬盘读写速度(空间小才能有高速读写速度),硬盘一般在30MB到40MB每秒,而现在的内存可以达到1000MB以上每秒。而在高速运行的各种程序中,它需要以最快的速度存储暂时存储的数据,以最快的速度读取需要的数据,才能保证你的电脑能够高效运转。
超市的储物箱,只是进去购物的顾客暂时存包的地方,但总的储物箱只有那么多,当用完的时候,若再有顾客需要储物箱,他就要等待(程序也是一样),等到有顾客结束购物,从而腾出储物箱。(这里的储物箱就像内存,他可重复利用,而且用时很短,而且不是时时都被占满,所以没有必要很大,适当增加空间,可以提升程序运行速度,也就是内存更不容易被占满,不会发生排队等候的事情,从而提高电脑运行速度)。

内存,缓存,硬盘区别一个在外一个在内,cpu是大脑,内存是通道,硬盘是大仓库存储,cpu就是指挥官,硬盘是军事仓,缓存是这两里面的设备配套设施,内存是沟通指挥部和军事仓的通道。
无论是二级缓存、三级缓存还是内存都不能存储处理器操作的原始指令,这些指令只能存储在CPU的一级指令缓存中,而余下的二级缓存、三级缓存和内存仅用于存储CPU所需数据,现在的二级三级基本上都在cpu内部了,处理基本上和主频频率一样了。
内存与硬盘的联系也非常密切:这里只提一点:硬盘上的信息永远是暂时不用的,要用吗?请装入内存!CPU与硬盘不发生直接的数据交换,CPU只是通过控制信号指挥硬盘工作,硬盘上的信息只有在装入内存后才能被处理。
计算机的启动过程就是一个从硬盘上把最常用信息装入内存的过程。
这就是在我们下载了好多软件后开机会长时间,就是在往硬盘输入到内存中的时候就会时间多了,当我们在运用软件的时候就会把常用的信息在调到缓存中方便cpu快速的查找访问,这里当然会运用虚拟存储器,就是在硬盘中的数据不是直接给内存的,他是只是一部分,但这些一部分的数据会指向它在硬盘中的数据,这样也给出了假象,内存变大了,其实只是整个数据的一部分,但这一部分回直接牵连储存在硬盘中的数据。
缓存是CPU的一部分,它存在于CPU中
CPU存取数据的速度非常的快,一秒钟能够存取、处理十亿条指令和数据(术语:CPU主频1G),而内存就慢很多,快的内存能够达到几十兆就不错了,可见两者的速度差异是多么的大
缓存是为了解决CPU速度和内存速度的速度差异问题
内存中被CPU访问最频繁的数据和指令被复制入CPU中的缓存,这样CPU就可以不经常到象“蜗牛”一样慢的内存中去取数据了,CPU只要到缓存中去取就行了,而缓存的速度要比内存快很多
因为缓存只是内存中少部分数据的复制品,所以CPU到缓存中寻找数据时,也会出现找不到的情况(因为这些数据没有从内存复制到缓存中去),这时CPU还是会到内存中去找数据,这样系统的速度就慢下来了,不过CPU会把这些数据复制到缓存中去,以便下一次不用再到内存中去取。
内存是DRAM,在缓存中分为SRAM和DRAM,静态RAM集成度低(存储相同的数据,静态RAM的体积是动态RAM的6倍),价格高(同容量的静态RAM是动态RAM的四倍)因为随着时间的变化,被访问得最频繁的数据不是一成不变的,也就是说,刚才还不频繁的数据,此时已经需要被频繁的访问,刚才还是最频繁的数据,现在又不频繁了,所以说缓存中的数据要经常按照一定的算法来更换,这样才能保证缓存中的数据是被访问最频繁的

在32位的cpu中只能用4G的内存,按道理64位能运行多大的内存呢?

这里面有介绍:https://www.jianshu.com/p/92226196fdcd

虚拟内存

https://www.cnblogs.com/jmsjh/p/8017202.html
解释一点内容:cpu为什么要用虚拟地址空间与物理地址空间映射?
1.方便编译器和操作系统安排程序的地址分布。
程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。

2.方便进程之间隔离
不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程使用的物理内存。

3.方便OS使用你那可怜的内存。
程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,
内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。

虚拟存储器

https://blog.csdn.net/iteye_11584/article/details/82366881

为什么寄存器处理速度大于内存呢

https://www.cnblogs.com/lcw/p/3371877.html?tdsourcetag=s_pcqq_aiomsg

嵌入式的概括图

在这里插入图片描述
在这里插入图片描述
这里面的64位的乘法就是多个32计算所得到的结果。
在这里插入图片描述
在这里插入图片描述
在这里面的arm是32位的字的存储方式和16 位的半字节存储的方式。
在这里插入图片描述
在这里面,分别把里面的所代表的16位地址转换成二进制则此时为,
0100…0000 ox4000
0100…0100 ox4004
当在32位,什么是32位呢就是指电脑cpu一次处理的最大数据量,也就是他一次可以处理4BYTE(32bit),当然64位的这是一次能处理8个字节的量,比32位提高了一倍,在32 位中
在我们的pc寄存器中他只取数据的首地址,也就是他只取ox4000,ox4010(是16进制的数)也就是0x4004,所以在这里面他的
在这里插入图片描述
如图所示在字对齐中,他的bit0,bit1都是为0,0,同理在16进制中他的bit0都为0。

流水线

在这里插入图片描述
只有流水线被指令填满时才能发挥最大的效能,即每个时钟周期完成一条指令的执行,如果程序发生跳转,流水线将被清空。
1,取指:将指令从指令存储器中取出,放入指令流水线上中,
2,指令译码:对指令进行译码,
pc是即将运行的下一条指令,也就是该命令要运行pc就得在这条命令的下一个地址了,改命令才会运行,如果我们使用指令(如mov)读了PC,那么返回给我们地址就是当前地址+4,pc是个寄存器,寄存器是存放数据和指令的,有指令在调用cpu中的缓存找地址的数据,在我们存入数据,先在寄存器放着在,通过cpu进行对数据进行内存分配,那他是怎样判断数据和指令的呢?
1,可执行文件的角度:可执行文件分为许多段,一般.text存放代码,.data段存放数据,不同段是有不同属性的,例如.text段的属性是可执行的。这样就区别了代码和数据。
2.CPU指令有一个格式,一个指令包括了操作码(对应你的指令)和操作数(对应你的数据),而指令本身相对格式是固定的(可能变长)。所以CPU是很容易知道前几个二进制是什么指令,而根据这个指令又可以知道后面多少位是第一个数据,后面多少位是第二个数据。然后下一个指令的起始地址是直接存在IP寄存器里的。
指令就是操作命令,不同的CPU有自己规定的指令码和它要求的操作数个数。数据就是一般的数据,整数,逻辑数。送到数据线上传送的就是数据,送到指令线上传送的就是指令。内存储器,有的分指令存储器,数据存储器,但也有的不分。
输入计算机的机器码有机器码的语法规定,所以CPU知道哪个码处理为命令,哪个码处理为数据。汇编通过翻译,CPU也知道哪是命令哪是数据。指令和数据都通过总线(BUS)传送。
在我们cpu中的缓存内存(ram)中也有缓存存储的内容不止是数据,也包括指令,就像上面的指令被流水化了取值——》译码——》执行三个步奏,在缓存中有指令也有数据,这里的指令包括往内存中写入数据。
在这里插入图片描述
在这里插入图片描述
是从取值当执行的时候,现在距离此时的pc是8,那在这个计算中这里面的结果为:pc为0X400因为他都是指向下一个取指当在执行完第一条指令的时候
在这里插入图片描述
则在三级流水线中的pc的偏移量是8,则同理在四级流水线上偏移量为12:
在这里插入图片描述
算法的汇编语言为:
SUB R1 PC #4 //R1=初始pc加4
STB PC [R0] //把此时第一个指令执行完后,放到【R0】中
LDR R0 [R0] //把【R0】的值放到R0中
SUB R0 ,R0 ,R1 //此时的R0=R0-R1
但此时只能求出三级的流水线,求四级的用着结果还是8,当然把首行的#4换成#8就能算出四级的了,则偏移量等于(流水线–1)*4,则要求一个几级流水线,则在#4,#8,,,请况求看是否符合哪种情况所求结果。
当然在cpu中的计算也会用到流水线,在计算乘法的时候,他会分几个步奏进行相乘的最后把最后的结果汇总。
在这里插入图片描述
假设此时的执行分为二级流水线:
在这里插入图片描述
但就上面的代码是不能计算出来最后的结果的,因为此时的乘法是需要分布计算的,当进行最后加的时候,此时的乘法还没有完成,还得多一个的时脉,则此时就得不到最后的结果,可以把
在这里插入图片描述
在这里插入图片描述
两个替换一下,正好就是缓存到那个时脉,这个时候就可以了。

32 位与16位的转换,在ARM中

ARM和Thumb的代码实现

https://www.eefocus.com/embedded/323194/

ARM和Thumb的区别

http://news.eeworld.com.cn/mcu/article_2016080128048.html
https://www.linuxidc.com/Linux/2011-09/43817.htm
https://blog.csdn.net/beyond702/article/details/49909051
处理器的嵌入式开发中,为了增强系统的灵活性以及提高系统的整体性能,经常使用16位的thumb指令,
在这里插入图片描述
在这里插入图片描述
此时的能转换的特点是在上面已经说过在32,和16位的字和半字的存储方式上,32 位的pc的地址bit1=0,bit0=0,16位时的pc取得地址bit0=0,则就明确了在pc跳转的指令地址上bit0=1则就转换为了16为的THumb状态。同理把Thumb状态的bit0=0,也就转换成32位的了,这也就相当于设置一个断点,这样可以更加方便地让cpu识别指令的转换状态了。

中断模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里面是subFunc是程序的跳转指令,此时LR寄存器就会保存此时的pc的值,此时的栈中没有发生什么变化,指令集指令只能是两个两个,或者是四个四个占用的,而此时的LR存储的却是0x00000811,那返回的时候应该返回哪呢

在中断进行的时候,是从ARM状态进再从ARM状态出。
ARM微处理器的工作状态一般有两种,并可在两种状态之间切换:
- 第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令;
- 第二种为Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。
在这里插入图片描述

寄存器

寄存器和内存一样都有存储的功能
定义的全局变量:
int a=1;
int b=a+1;
当然这里面,我们这里两个结果都会储存在内存中,但b=a+1是先把内存中的a地址所代表的值放进寄存器中,再在寄存器进入cpu进行计算+1,因为寄存器在cpu中计算速度就快,在到最后把结果数据放到内存中。
在这里插入图片描述

当前状态寄存器

在这里插入图片描述
在这里插入图片描述
其中的保留装置是为了,能以后添加判别条件。
T:控制位,置位时处理器运行在Thumb状态下,清零时处理器运行在ARM状态下
N——若运算结果为负责置一,否则为零;
Z——若运算结果为零则置一,否则为零;
C——对于加法:若运算有进位置一;对于减法:若有进位则置零;
V——运算有溢出则置一。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里的处理器只是个接口,他只是识别什么异常,在这个总称的异常中找到相应的异常地方。

异常处理

在这里插入图片描述
在这里插入图片描述
(一)这个取决于发生异常的位置。首先你要明白的是,pc是即将运行的下一条指令,还有流水线技术
另外,每一种异常发生的时机是不一样的,所以pc恢复的时候计算的方法也就不一样了。
例如:
IRQ异常发生时,PC的值等于当前执行指令加8,也就是中断返回地址加4,所以R14就是保存的这个值。所以PC恢复的时候就需要R14减4
未定义指令异常时,因为这个异常发生在指令译码阶段,所以,此时PC的值就是未定义指令加4(想想流水线),所以,R14刚好就是中断返回地质,所以就不用计算了,直接将R14复职给PC
预取指令异常是在流水线的执行阶段时才进入异常,所以PC的值是当前执行指令地址加8,即中断返回指令加4,所以PC恢复的时候就需要R14减4,异常指令的下一条指令,这样异常指令才被再次加载进去。
数据中止异常,就像访问权限已经找到我们所要的了,但权限不够就不能进入,实在导致异常的指令执行后的下一条指令时才发生,所以PC的值是导致异常的指令执行后的下一条指令加8,所以PC恢复的时候就需要R14减8,为异常指令的下一条指令

(二)预取指中止异常(Prefetch Abort)

在指令预取时如果地址是非法的,该指令就被标记为有问题的指令,流水线上该指令之前的指令继续执行,当执行被标记为有问题的指令的时候,处理器就会产生异常,此时的异常是在译码的时候,在预处理上已经把这条指令给标记上了,在译码的时候就会。产生该异常最终返回时需要返回到被标记的指令处重新读取并执行该指令,因此异常返回时需要返回到该指令处而不是该指令的下一条指令。所以在中断返回时我们需要人为的对LR中保存的值自减4 [1] 。
 就是当pc指向这个时候
在这里插入图片描述
在这里插入图片描述
在这里面的异常优先级中,要是同级的中断是谁先中断的谁先进行,下面的在往后面排顺序,在此就是要有快速中断的出现就先让快速中断的先执行,快速中断有优先权力。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值