ARMv6-M内核寄存器有哪些
时间: 2023-08-31 19:37:27 浏览: 107
### 回答1:
ARMv6-M内核寄存器主要包括:R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,SP,LR,PC,xPSR,MSP,PSP,PRIMASK,BASEPRI,FAULTMASK,CONTROL等。
### 回答2:
ARMv6-M内核寄存器主要包括以下几种:
1. 通用寄存器:共有13个通用寄存器,用于存储数据和地址。它们是R0-R12,其中R13(SP)用作堆栈指针,R14(LR)用作链接寄存器,R15-PC被用作程序计数器。
2. 程序状态寄存器(PSR):用于存储和控制程序运行的状态信息,包括条件码、中断使能位、异常处理模式等。其中,CPSR(当前程序状态寄存器)用于存储当前的程序状态,SPSR(保存程序状态寄存器)用于保存先前的程序状态。
3. 特殊功能寄存器:包括主控制寄存器(MPU)、系统控制寄存器(SYS)、优先级和异常链接寄存器(PRIMASK和FAULTMASK)等。MPU用于对内存访问进行保护和管理,SYS用于控制系统的一些特殊功能。
4. 中断寄存器:包括NVIC中断向量表寄存器、异常向量表基址寄存器等,用于中断的处理和控制。
5. 细粒度调度器保存寄存器:这是在Multicore时使用的,包括VTOR、VBAR等寄存器。
以上是ARMv6-M内核常用的寄存器,不同的ARM核心版本可能会有略微差异。寄存器的使用和配置对于程序的性能和功能都有重要的影响,程序员需要根据具体需求和硬件平台来合理地使用和配置这些寄存器。
相关问题
Cortex-M4内核在v6编译器下 __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");怎么修改
在v6编译器下,由于Cortex-M4内核已经支持了ARMv8-M架构,因此VFP指令已经被废弃,取而代之的是Advanced SIMD指令集和浮点指令扩展(Floating-Point Extension,FPE)。因此,在Cortex-M4内核上,将原来的VMSR指令更改为VMRS指令,并且需要使用FPEcc修饰符来指定FPEcc控制位的设置。
修改后的语句如下所示:
```c
__ASM volatile ("VMRS fpscr, %0" : : "r" (fpscr) : "fpexc");
```
该语句的作用是将传入的fpscr值写入FPSCR寄存器中,以配置和控制FPU的运算精度和舍入方式等。具体的操作是通过汇编指令 `VMRS fpscr, %0` 实现的,其中 `%0` 表示使用第一个输入参数(即fpscr值)替换指令中的占位符,将fpscr值写入FPSCR寄存器中。
需要注意的是,该语句中使用了 "fpexc" 修饰符,表示该指令依赖于FPEcc控制位的设置。因为在ARMv8-M架构中,VFPcc控制位已经被替换为了FPEcc控制位,因此需要使用 "fpexc" 修饰符来指定控制位的设置。
linux内核中armv7初始化L2 cache的代码在哪里,是哪些
在 Linux 内核中,ARMv7 初始化 L2 cache 的代码主要位于 `arch/arm/mm/cache-v7.S` 文件中。
具体来说,以下是该文件中初始化 L2 cache 的代码:
```assembly
#ifdef CONFIG_PL310_ERRATA_769419
/* Workaround erratum 769419 in the PL310 cache controller */
mrc p15, 1, r0, c9, c0, 2 @ read Auxiliary Control Register
orr r0, r0, #(1 << 6) @ set bit 6 (enable implicit clean/inv)
mcr p15, 1, r0, c9, c0, 2 @ write Auxiliary Control Register
#endif
/*
* Configure L2 cache controller.
*/
mrc p15, 1, r0, c9, c0, 2 @ read Auxiliary Control Register
bic r0, r0, #(0x3 << 6) @ clear bits [7:6] (inner cache policy)
orr r0, r0, #(0x2 << 6) @ write-thru, allocate on write
@ for inner cache
bic r0, r0, #(0x3 << 4) @ clear bits [5:4] (outer cache policy)
orr r0, r0, #(0x2 << 4) @ write-thru, allocate on write
@ for outer cache
mcr p15, 1, r0, c9, c0, 2 @ write Auxiliary Control Register
mov r0, #0
mcr p15, 2, r0, c9, c0, 1 @ disable L2 prefetch
mcr p15, 2, r0, c9, c0, 0 @ disable L2 cache
mrc p15, 1, r0, c0, c0, 1 @ Read CLIDR
bic r1, r0, #0x7000000 @ r1 = LoC (Line of Coherency)
mov r2, #0
1: add r3, r1, r2 @ r3 = Waypointers
mcr p15, 2, r3, c0, c0, 0 @ Write Waypointer
add r2, r2, #4
cmp r2, #0x100 @ 4 * 64
blt 1b
mov r0, #0x200000
mcr p15, 2, r0, c0, c0, 2 @ Write L2 Control Register (enable L2 cache)
```
这段代码中,首先根据配置选项和处理器的 errata 对 L2 cache 进行一些设置(如清除某些位、设置写策略等),然后禁用 L2 的预取和缓存,接着通过读取 CLIDR 寄存器确定 L2 缓存的大小和关联性,最后启用 L2 cache。