0 参考资料
ARM Cortex-A(armV7)编程手册V4.0.pdf
1 前言
Cortex-A7支持ARM和Thumb(Thumb-2)2个状态,在ARM状态下可以执行ARM指令,在Thumb(Thumb-2)状态下可以执行Thumb(Thumb-2)指令。在ARM和Thumb(Thumb-2)混合编程下,编译器会帮助我们完成CPU的状态切换,如果我们强行在ARM状态下执行Thumb指令会发生什么呢?在Thumb状态下执行ARM指令会发生什么?
2 Cortex-A7:在ARM状态下执行Thumb指令会发生什么?
本文以基于Cortex-A7内核的stm32MP135为例,测试在ARM状态下执行Thumb指令会发生什么。
方法:IRQ中断发生时会修改PC指针的值,我们人为将PC指针修改值bit0置0,让CPU切换到ARM状态,然后执行IRQ中断服务函数的Thumb指令。
2.1 查看编译生成的.list文件,修改镜像中断向量表
根据Cortex-A7向量表及.list文件我们知道红框标记处的0xc000810d是IRQ中断服务函数入口地址+1,这用来切换CPU到Thumb状态。
IRQ中断服务函数如下:
Cortex-A7向量表如下:
打开生成的镜像文件,找到偏移地址为0x338地址内容(之所以还要加0x200,是因为.stm32镜像加的头大小为0x200):
红框标记的值就是IRQ中断服务函数入口地址。
我们将这个值修改为0xc000810c(bit0设置为0),也就是让CPU切换到ARM状态,接着会执行IRQ中断服务函数的Thumb指令,看会有什么现象发生。
2.2 实验现象
程序直接卡死,没有任何反应。
这说明ARM状态下是不能执行Thumb指令的。
3 Cortex-A7:在Thumb状态下执行ARM指令会发生什么?
本文以基于Cortex-A7内核的stm32MP135为例,测试在Thumb状态下执行ARM指令会发生什么。
使用和2中类似的方法,在跳转到另一个函数(执行ARM指令)前将赋给PC的函数入口地址值+1,让CPU切换到Thumb状态。结果如下:
程序直接卡死,没有任何反应。
这说明Thumb状态下是不能执行ARM指令的。
4 总结
(1)ARM状态只能执行ARM指令不能执行Thumb指令;Thumb状态只能执行Thumb指令不能执行ARM指令。
(2)开发者无需关系ARM/Thumb状态的切换,编译器会自动生成正确的代码(如修改PC指针时给地址+1,切换到Thumb状态)。
注:Cortex-A7所指的Thumb指令集就是Thumb-2指令集,本文的Thumb指Thumb-2。