【问题标题】:Enable neon on ARM cortex-a series在 ARM cortex-a 系列上启用 neon
【发布时间】:2013-10-14 09:38:33
【问题描述】:

我想在裸金属皮质 A-15 上初始化 NEON cp。在关注ARM's directives 之后,我在平台初始化序列的末尾写了这个序列:

MOV r0, #0x00F00000
MRC p15, 0, r0, c1, c1, 2
ORR r0, r0, #0x0C00 
BIC r0, r0, #0xC000 
MCR p15, 0, r0, c1, c1, 2
ISB
MRC p15, 4, r0, c1, c1, 2
BIC r0, r0,  #0x0C00
BIC r0, r0, #(3<<14)
MCR p15, 4, r0, c1, c1, 2
ISB
MOV r3, #0x40000000
VMSR FPEXC, r3

我收到此错误:

Error: operand 0 must be FPSCR -- `vmsr FPEXC,r3'

我正在使用arm-eabi-as --version

GNU assembler (GNU Binutils) 2.21
Copyright 2010 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `arm-eabi'.

如果我将 FPEXC 更改为 FPSCR 程序编译并且正在运行的引发 unhandler 异常:

MRC p15, 4, r0, c1, c1, 2

【问题讨论】:

  • @artlessnoise 知道为什么MRC p15, 4, r0, c1, c1, 2 会引发异常并将CPSR register 中的模式更改为Undefined?我以Supervisor 运行上述汇编代码。
  • @artlessnoise,这就是ARM claims
  • 我觉得你需要MRC p15, 0, r0, c1, c1, 2;没有4。这个数字很重要。您阅读了在 Hyp 模式下使用高级 SIMD 和 VFP;您没有使用虚拟化扩展?另外,如果您不使用 TrustZone,我认为您不需要这个。
  • @artlessnoise 你能发布完整序列的答案吗?
  • eee8Ra10 其中R 是寄存器。

标签: assembly arm neon bare-metal cortex-a


【解决方案1】:

可以在u-boot source中找到初始化VFPU的序列。

.macro init_vfpu
  ldr r0, =(0xF << 20)
  mcr p15, 0, r0, c1, c0, 2
  mov r3, #0x40000000
  .long 0xeee83a10
  /* vmsr FPEXC, r3 */
.endm /* init_vfpu */

binutils mailing list 中所述,vmsr FPEXC 错误 已在 binutils 2.23 branch 以及 HEAD 和 2.24 开发分支中修复很快就会被释放。 binutils 的 2.23.1 和 2.23.2 版本中存在修复。

这是一个示例会话,

$ cat t.S
init_vpu:
  ldr r0, =(0xF << 20)
  mcr p15, 0, r0, c1, c0, 2
  mov r3, #0x40000000
  vmsr FPEXC, r3
  bx  lr
  .ltorg
$ arm-none-linux-gnueabi-as -march=armv7-a -mcpu=cortex-a15 -mfpu=neon t.S -o t.o
$ arm-none-linux-gnueabi-as --version | grep assembler
GNU assembler (crosstool-NG hg+default-86a8d1d467c8) 2.23.1
This assembler was configured for a target of `arm-none-linux-gnueabi'.
$ objdump --version | grep Binutils
GNU objdump (GNU Binutils for Ubuntu) 2.23.2
$ objdump -S t.o 

t.o:     file format elf32-littlearm

Disassembly of section .text:

00000000 <init_vpu>:
   0:   e3a0060f        mov     r0, #15728640   ; 0xf00000
   4:   ee010f50        mcr     15, 0, r0, cr1, cr0, {2}
   8:   e3a03101        mov     r3, #1073741824 ; 0x40000000
   c:   eee83a10        vmsr    fpexc, r3
  10:   e12fff1e        bx      lr

上述顺序应该适用于所有 Cortex-A 系列。该序列适用于没有虚拟化TrustZone活动的系统。

【讨论】:

    【解决方案2】:

    您需要从 git 更新 binutils。这个问题已在今年早些时候在this commit 中得到修复,但显然从那时起就没有发布过。 或者,手动对指令进行编码。

    【讨论】:

    • @Jake'Alquimista'LEE binutils 不是 gcc。谁投了反对票,愿意解释一下吗?
    • @artlessnoise 好的,我相信你的话。我发现的提交日期晚于 2.23,我还没有看到 2.24 版本(未标记)。
    • 我明白了。我应该回去更多,我刚刚发现了最近的变化,并认为这是第一个修复。
    • @Jester 我不是反对你答案的人。我现在正在投票。你的回答是你应得的:)
    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多