core_cm3是ARM公司推出来的统一规定,这是对下游芯片厂商的统一规定,因此可以再Cortex-M3(CM3)之间进行移植。此文件中定义了一些对特殊功能寄存器的C语言形式的操作,本质上是内敛汇编和嵌入式汇编。本文均已μC/OS-II移植为例进行举例。
那么先通过几个例子介绍下内敛汇编和嵌入式汇编的形式吧,,因为下面要用到,看完这几个例子就能看懂了,但是如果需要详细学习,请参考文末的参考资料,因为与真正的汇编还是有不少区别的,比如在内敛汇编中我们操作的都是虚拟寄存器(那么它是如何转到真正的寄存器的呢?不晓得,⊙﹏⊙b汗),“pc(r15)、lr(r14) 和 sp(r13) 寄存器根本不能访问。访问这些寄存器时,会产生错误消息。”等等。
1. 单行内敛汇编
C++ Code
1
2 |
|
#define OS_ENTER_CRITICAL()
__asm(
"CPSID I")
#define OS_EXIT_CRITICAL() __asm( "CPSIE I") |
主要是小括号+双引号。
2.多行内敛汇编
C++ Code
1
2 3 4 |
|
__asm
{ //原汁原味的汇编语句 } |
用大括号取代了小括号,并且不需要双引号了,直接加上就可以了。不过要是用到R0寄存器不声明的话,会有个warning,可以在前面int R0声明下。
这里用的时候我产生了一个小疑问,当我用到R0,R1这些寄存器的时候,需不需要先PUSH,用完之后在POP呢?看完《编译器用户指南》之后,它说了,
不用,编译器帮我们做了。
3.嵌入式汇编
C++ Code
1
2 3 4 5 |
|
__asm uint32_t __get_PSP(
void)
{ mrs r0, psp bx lr } |
在前面加上__asm关键字即可。不过要注意的是需要在最后加上
bx lr显式返回,我之前就忘了返回,然后就HardFault_Handler了。
直接看代码:
编译器厂商宏定义选择
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |