类似register uint32_t __regPriMask __ASM("primask");的代码分析
代码:
#define __ASM __asm /*!< asm keyword for ARM Compiler */
#define __INLINE __inline /*!< inline keyword for ARM Compiler */
#define __STATIC_INLINE static __inline
/** \brief Set Priority Mask
This function assigns the given value to the Priority Mask Register.
\param [in] priMask Priority Mask
*/
__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
{
register uint32_t __regPriMask __ASM("primask");
__regPriMask = (priMask);
}
参见armcc.chm文件9.155 Named register variables一节。
9.155 Named register variables
The compiler enables you to access registers of an ARM architecture-based processor or coprocessor using named register variables.
Syntax
register type var-name __asm(reg);type-
is the type of the named register variable.Any type of the same size as the register being named can be used in the declaration of a named register variable. The type can be a structure, but bitfield layout is sensitive to endianness.
var-name-
is the name of the named register variable.
reg-
is a character string denoting the name of a register on an ARM architecture-based processor, or for coprocessor registers, a string syntax that identifies the coprocessor and corresponds with how you intend to use the variable.Registers available for use with named register variables on ARM architecture-based processors are shown in the following table.
Table 9-19 Named registers available on ARM architecture-based processors
| Register | Character string for __asm |
Processors |
|---|---|---|
APSR |
"apsr" |
All processors |
CPSR |
"cpsr" |
All processors, apart from Cortex-M series processors. |
BASEPRI |
"basepri" |
ARMv7-M processors |
BASEPRI_MAX |
"basepri_max" |
ARMv7-M processors |
CONTROL |
"control" |
ARMv6-M and ARMv7-M processors |
DSP |
"dsp" |
ARMv6-M and ARMv7-M processors |
EAPSR |
"eapsr" |
ARMv6-M and ARMv7-M processors |
EPSR |
"epsr" |
ARMv6-M and ARMv7-M processors |
FAULTMASK |
"faultmask" |
ARMv7-M processors |
IAPSR |
"iapsr" |
ARMv6-M and ARMv7-M processors |
IEPSR |
"iepsr" |
ARMv6-M and ARMv7-M processors |
IPSR |
"ipsr" |
ARMv6-M and ARMv7-M processors |
MSP |
"msp" |
ARMv6-M and ARMv7-M processors |
PRIMASK |
"primask" |
ARMv6-M and ARMv7-M processors |
PSP |
"psp" |
ARMv6-M and ARMv7-M processors |
PSR |
"psr" |
ARMv6-M and ARMv7-M processors |
r0 to r12 |
"r0" to "r12" |
All processors |
r13 or sp |
"r13" or "sp" |
All processors |
r14 or lr |
"r14" or "lr" |
All processors |
r15 or pc |
"r15" or "pc" |
All processors |
SPSR |
"spsr" |
All processors, apart from Cortex-M series processors. |
XPSR |
"xpsr" |
ARMv6-M and ARMv7-M processors |
Table 9-20 Named registers available on targets with floating-point hardware
| Register | Character string for __asm |
|---|---|
FPSID |
"fpsid" |
FPSCR |
"fpscr" |
FPEXC |
"fpexc" |
FPINST |
"fpinst" |
FPINST2 |
"fpinst2" |
FPSR |
"fpsr" |
MVFR0 |
"mvfr0" |
MVFR1 |
"mvfr1" |
Note
Usage
Note
A global named register variable is global to the source file in which it is declared, not global to the program. It has no effect on other files, unless you use multifile compilation or you declare it in a header file.
Restrictions
r0 is always used to return result values from functions even if it is declared as a named register variable.r12, tools such as linkers do not change register usage in object files. The AAPCS reserves r12 as the inter-procedural scratch register. You must not declare r12 as a named register variable if you require its value to be preserved across function calls.Examples
apsr is declared as a named register variable for the "apsr" register:register unsigned int apsr __asm("apsr");
apsr = ~(~apsr | 0x40);
MRS r0,APSR ; formerly CPSR BIC r0,r0,#0x40 MSR CPSR_c, r0
PMCR is declared as a register variable associated with coprocessor cp15, with CRn = c9, CRm = c12, opcode1 = 0, and opcode2 = 0, in an MCR or an MRC instruction:register unsigned int PMCR __asm("cp15:0:c9:c12:0");
__inline void __reset_cycle_counter(void)
{
PMCR = 4;
}
__reset_cycle_counter PROC
MOV r0,#4
MCR p15,#0x0,r0,c9,c12,#0
BX lr
ENDP
cp15_control is declared as a register variable for accessing a coprocessor register. This example enables the MMU using CP15:register unsigned int cp15_control __asm("cp15:0:c1:c0:0");
cp15_control |= 0x1;
MRC p15,#0x0,r0,c1,c0,#0 ORR r0,r0,#1 MCR p15,#0x0,r0,c1,c0,#0
_msp, _control and _psp as named register variables to set up stack pointers:register unsigned int _control __asm("control");
register unsigned int _msp __asm("msp");
register unsigned int _psp __asm("psp");void init(void)
{
_msp = 0x30000000; // set up Main Stack Pointer
_control = _control | 3; // switch to User Mode with Process Stack
_psp = 0x40000000; // set up Process Stack Pointer
}
init MOV r0,#0x30000000 MSR MSP,r0 MRS r0,CONTROL ORR r0,r0,#3 MSR CONTROL,r0 MOV r0,#0x40000000 MSR PSP,r0 BX lr
类似register uint32_t __regPriMask __ASM("primask");的代码分析的更多相关文章
- wifi display代码 分析
转自:http://blog.csdn.net/lilian0118/article/details/23168531 这一章中我们来看Wifi Display连接过程的建立,包含P2P的部分和RTS ...
- Linux内核中的GPIO系统之(3):pin controller driver代码分析
一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datash ...
- Linux时间子系统之(十七):ARM generic timer驱动代码分析
专题文档汇总目录 Notes:ARM平台Clock/Timer架构:System counter.Timer以及两者之间关系:Per cpu timer通过CP15访问,System counter通 ...
- CC2431 代码分析③-忍辱负重的CC2430
这节主要分析CC2430的代码,是参考节点的代码,协调器代码我们放到最后分析. 代码分析的原则是事件为导向,我们从CC2431 盲节点code的分析中发现CC2431 向CC2430参考节点发送的信息 ...
- start_kernel之前的汇编代码分析
start_kernel之前的汇编代码分析 Boot中执行下面两句话之后,进入uclinux内核. theKernel = (void (*)(int, int, unsigned int))((ui ...
- C++反汇编代码分析–函数调用
转载:http://shitouer.cn/2010/06/method-called/ 代码如下:#include “stdlib.h” int sum(int a,int b,int m,int ...
- Linux时间子系统(十七) ARM generic timer驱动代码分析
一.前言 关注ARM平台上timer driver(clocksource chip driver和clockevent chip driver)的驱动工程师应该会注意到timer硬件的演化过程.在单 ...
- STM32F103 ucLinux开发之二(内核启动汇编代码分析)
start_kernel之前的汇编代码分析 Boot中执行下面两句话之后,进入uclinux内核. theKernel = (void (*)(int, int, unsigned int))((ui ...
- Linux内核中的GPIO系统之(3):pin controller driver代码分析--devm_kzalloc使用【转】
转自:http://www.wowotech.net/linux_kenrel/pin-controller-driver.html 一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道 ...
随机推荐
- JavaScript的本地对象、内置对象、宿主对象
首先解释下宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序.如:web浏览器,一些桌面应用系统等.即由web浏览器或是这些桌面应用系统早就的环境即宿主环境. ...
- python基础——Linux系统下的文件目录结构
单用户操作系统和多用户操作系统 单用户操作系统:指一台计算机在同一时间只能由一个用户使用,一个用户独自享用系统的全部硬件和软件资源. 多用户操作系统:指一台计算机在同一时间可以由多个用户使用,多个用户 ...
- windows程序设置开机自动启动
//调用方法:设置开机启动 SetAutoRun(Process.GetCurrentProcess().ProcessName, true, Application.StartupPath + @& ...
- 变换CALayer锚点实现模拟时钟的动画
变换CALayer锚点实现模拟时钟的动画 变换锚点得需要一点理论知识,看下图就能明白:). https://developer.apple.com/library/ios/documentation/ ...
- [EffectiveC++]item16:Use the same form in corresponding uses of new and delete
- java list.remove移除失败
1. resultList.remove(i) 移除失败说明 当i为Integer类型时,通过观察源码发现当找不到该类型时就会自动去找Object类型,即remove(object),因为集合中不存在 ...
- 让CI框架支持service层
大家知道CodeIgniter框架式MVC分层的,通常大家把业务逻辑写到Controller中,而Model只负责和数据库打交道. 但是随着业务越来越复杂,controller越来越臃肿,举一个简单的 ...
- Odoo启动配置文件
转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9278687.html 1:--xmlrpc-port=<端口> 命令选项充许我们将服务器实例的侦听 ...
- 7、RabbitMQ-主题模式
1.模式图 发送到主题交换的消息不能具有任意的 routing_key - 它必须是由点分隔的单词列表. 单词可以是任何内容,但通常它们指定与消息相关的一些功能.一些有效的路由键示例:“ stock. ...
- spring boot +druid数据库连接池配置
1.启动应用入口修改 增加servlet注解 import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFacto ...