Hello Gary Wu,
阅读了您下面文档,关于Neon指令在CCS环境下的使用,
http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/18765.aspx?pi2132219853=1
目前我正在cortex-A8上,ccs5.5上搭建环境,想利用neon/FVP在arm端进行算法优化,目前遇到不少问题?
如果方便的话,能否共享一下您提供的文档中涉及的工程代码,学习arm端 Neon/VFP指令在CCS环境应用的搭建?
非常感谢!
BRS,
Meng
Jian Zhou:
是汇编那部分的问题么?
Lingcon Meng:
回复 Jian Zhou:
Hello zhou,
非常感谢您的回复!
我在网上看了一些文档,我的理解是,看到 CCS 是不支持,neon的intrinsic 指令,你要在ccs下面,用neon指令,必须用汇编,事实情况是这样的吗?
我编的程序,包括了neon的intrinsic指令。
另外,我看文档说,你要用neon指令,你必须,在使用neon加速器前,通过汇编代码使能其,以前没弄过,不知道如何做,
所以,如果有例程参考的话,那是最好不过的。
非常感谢!
BRS,
Meng
Jian Zhou:
回复 Lingcon Meng:
初始化neon,要加入一段汇编:
ØAdding the assembly code into the CP15.asm as a function:
MRC p15, #0, r1, c1, c0, #2 ; r1 = Access Control Register
ORR r1, r1, #(0xf << 20) ; enable full access for p10,11
MCR p15, #0, r1, c1, c0, #2 ; Access Control Register = r1
MOV r1, #0
MCR p15, #0, r1, c7, c5, #4 ; flush prefetch buffer because of FMXR below
; and CP 10 & 11 were only just enabled
; Enable VFP itself
MOV r0,#0x40000000
FMXR FPEXC, r0 ; FPEXC = r0
Lingcon Meng:
回复 Jian Zhou:
Hello Zhou,
我已经在arm端加了汇编代码,包括neon/VFP 的使能 以及 L2 cache 使能,
目前代码已经能go main()。
我了解的是要在CCS环境下neon指令集,必须写汇编,intrinsic 的形式是不支持的,
我写了一段代码如下:
想验证vld1.16这个neon指令是否能正常运行
编码形式是在c语言中插入汇编代码(该说法正确吗)。
我想知道,如何在vld1.16汇编代码中调用在C语言的定义的数组a[8],
也就是说想把,a[] 数组中的值通过该vld1.16指令加载到{d0,d1}中.
我试了好多种方式,都没有成功。缺乏arm 与c交叉编程经验,请给予指导。
非常感谢!
int16_t a[8] = {0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007};
int main(void){asm("ldr r0,=p"); //this instruction error.
asm(" vld1.16 {d0,d1},[r0] ");}
BRS,
Meng
Jian Zhou:
回复 Lingcon Meng:
理论上直接用你的那种asm()方式就可以嵌入汇编,是编译会报错么?
Lingcon Meng:
回复 Jian Zhou:
Hello Zhou,
是的,报错,
我主要不知道如何将a[i]数组,通过vld1.16 加载到{d0,d1},也就说源操作数,如何将a[8],加载到r0.
谢谢!
BRS,
Meng
Jian Zhou:
回复 Lingcon Meng:
检查一下你的CCS的工程配置,看看neon/vfp有没有在工程配置中使能。
我以前有客户嵌入的neon汇编没有问题。
Lingcon Meng:
回复 Jian Zhou:
Hello Zhou,
你说的neon/vfp,我都根据ti网站的文档设置过了。刚才我刚刚写了一段汇编函数,c语言来调用。
现在遇到以下问题:
我从 cortex-a8的资料中,了解到 他们用的是neon/vfp3,但是我在ARM编译选项的processor options,选择VFP3时,编译是出现下列错误,
error #16004-D: file "C:/ti/ccsv5/tools/compiler/arm_5.1.1/lib/rtsv5_A_le_eabi.lib<memcpy32.obj>" has a Tag_ABI_VFP_args attribute value of "1" that is different than one previously seen ("0"); combining incompatible files
但是我将该选项更改为:vfplib,重新编译,编译成功,并且可以正常跟踪,得到正常的计算结果。
请问这是什么原因,难道cortex-a8 描述,有误,还是别的原因?
NEON/VFP enable 代码如下:
MRC p15, #0, r1, c1, c0, #2 ; r1 = Access Control Register ORR r1, r1, #(0xf << 20) ; enable full access for p10,11 MCR p15, #0, r1, c1, c0, #2 ; Access Control Register = r1 MOV r1, #0 MCR p15, #0, r1, c7, c5, #4 ; flush prefetch buffer because of FMXR below ; and CP 10 & 11 were only just enabled ; Enable VFP itself MOV r0,#0x40000000 FMXR FPEXC, r0 ; FPEXC = r0
L2 cache 使能代码如下:
;l2 cache enable
mrc p15, #0, r3, c1, c0, #1
orr r3, r3, #2 mcr p15, #0, r3, c1, c0, #1
BRS,
Meng