core_cm3文件函数一览

本文介绍了ARM Cortex-M3的core_cm3文件中对特殊功能寄存器的C语言操作,包括内敛汇编和嵌入式汇编的使用。以μC/OS-II移植为例,解释了单行和多行内敛汇编以及嵌入式汇编的语法,并讨论了不同编译器下的关键字形式。文中还涉及进程堆栈和主堆栈的设置,以及无符号和有符号16位值的反转操作。内容适合熟悉ARM汇编的开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
/* define compiler specific symbols */
#if defined ( __CC_ARM   )
   #define __ASM             __asm                                       /*!< asm keyword for ARM Compiler          */
   #define __INLINE          __inline          &n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值