0 参考资料
ARM Cortex-A(armV7)编程手册V4.0.pdf
1 Cortex-A7:如何切换ARM和Thumb状态
1.1 Cortex-A7支持的指令集
Cortex-A7支持的指令集包括ARM指令集和Thumb-2(ARM官方一般用Thumb表示)指令集。
ARM指令集指令大小都是32位,因此下一条指令地址是上一条指令地址+4。
Thumb-2指令集既支持16位指令也支持32指令,兼具了16位Thumb指令集体积小和ARM指令集高效的优点。
注:由于ARM官方将Thumb-2称作Thumb,后续Thumb均表示Thumb-2。
1.2 Cortex-A7支持的状态
从1.1中我们已经知道Cortex-A7支持2种指令集,与之对应Cortex-A7支持2种状态,分别是ARM状态、Thumb状态。在ARM状态下只能执行ARM指令,在Thumb状态下只能执行Thumb指令。实测如果不按照这种规则执行,程序直接跑飞、卡死。
1.3 如何切换ARM和Thumb状态
切换ARM和Thumb状态状态的方法有很多,常见的有修改PC指针值和使用BX跳转指令实现。本文以修改PC值和BX指令为例。
1.3.1 修改PC值切换ARM和Thumb状态
往PC中写数据就会引发一次程序的分支,写入数据bit0=1则切换到Thumb状态,如果bit0=0则切换到ARM状态。
下面是基于Cortex-A7的stm32MP135的.list文件,在IRQ中断发生时往PC写的值是IRQ中断服务函数入口地址+1,用于将处理器切换到Thumb状态(下图0xc000810c是IRQ中断服务函数入口地址,0xc000810d是IRQ中断发生时PC修改值):
1.3.2 使用BX指令切换ARM和Thumb状态
BX指令的参数bit0=1则切换到Thumb状态,bit0=0则切换到ARM状态。
BX指令用于子函数返回,关于BX的详细用法如下:
一个使用BX指令的实例如下: