希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路....原创不易,文章会持续更新,感谢您的关注

1.ARM约定

Byte为8bits;Halfword为16bits;word为32bits。

2.ARM的编程模式

Thumb指令集:16位的ARM指令集。ARM指令集:32位的ARM指令集。Thumb-2指令集:16位和32位混用的arm指令集。

只有ARMv7架构的CPU才支持Thumb-2指令,如STM32、A8等CPU。每一种指令集就是一种编程模式。

3.三种指令集的关系和优缺点比较

thumb指令集是16位的,因为arm公司早期也设计过16位的CPU 内核,所以当时16位的cpu使用的就是16位的指令。16位的指令比较节省内存,在那个年代,省内存是关键;但因为它每一条指令都是16位的,这也使得有些指令长度不够,因为有些操作光是操作数就已经站了多位了。有些操作16位完成不了。

16位指令效率不是很高,譬如有个操作数的位数是27位,这时,它使用16位就无能为力了。要实现它,就必须使用两条16位的指令,正因为别人一条32位指令就能解决的事,而这里需要两条指令,执行完之后也就需要两个时间周期,使得cpu效率降低。

arm指令是32位的,所以它比较占内存,譬如有些操作根本就不需要32位,只需要14位就能完成时,使用32位的指令就浪费了18位的空间。但也意味着它的指令是非常完整的,所以不存在完成不了的操作。在后来的发展中,内存成本已经很低了,所以当时也不在乎浪费那一点内存。但是对于Cortex-M系列CPU来说,内存还是很宝贵的,所以能省还是得省。

cortex架构之后就出现了thumb-2指令集,它实现了16位的指令和32位的指令完全的对接,并且不用切换CPU的工作模式(以前的话,是要切换模式的,譬如当前指令是arm指令还是thnumb指令,使用的不同的指令系统时,要相应的设置它的工作模式)。现在的arm CPU大都采用的Thumb-2指令集。也就是它既可以使用16位的Thumb指令集,也可以使用32位的arm指令集。这样在一些要省内存的地方和一些需要高效率的地方都能完美兼顾。

在thumb-2指令集出现的早期,评判一个工程师的经验是否丰富,就看他以下的指标:知道什么时候用16bit的指令,知道什么时候需要使用32bit的指令。并且能在两者之间完美切换。但现在内存已经很大了,所以现在写代码基本不用再考虑这个问题。

4.ARM的七种工作模式

(1)User:非特权模式,大部分的进程都是在这种模式下进行。
(2)FIQ:快速中断模式,处理中断的速度比普通中断模式更快。
(3)IRQ:普通中断模式。
(4)Suppervior:系统复位或是软中断时进入这种模式。
(5)Abort:当存取异常(要读取数据时发现没有这个地址)就会进入这个模式。
(6)Ubdef:当指令指令时,发现这个指令没有定义过(也就是CPU也不认识这个指令),就会进入这个模式。
(7)System:操作系统使用的模式,它使用的寄存器和User是一样的,只不过它是特权模式。

一种普通模式 + 6种特权模式(这里面除了Sys以外,其他5种都是异常模式

在以下情况下CPU会切换模式。各种模式下的权限和可以访问的的寄存器是不同的。
(1)当CPU遇到了某种异常时,就会自动切换到对应这个异常的模式下去工作。
(2)程序员通过修改CPSR寄存器的值也可以人为的修改CPU的运行模式。

5.思考:ARM CPU为什么会有这么多种模式?

cortex架构CPU是05年出的,并且这种架构的CPU出厂前就已经知道要跑操作系统了,linux操作系统是91年出的,因为操作系统是有很多中安全模式的。

所以arm CPU为了兼顾当前已经存在的操作系统,所以就设计了那么多种模式。也就是操作系统决定了CPU必须要这样设计。不是CPU自己决定的。