This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

cortex-A8内核,ccs5.5上搭建环境以方便neon/FVP指令集在arm端进行算法优化?



Hello Gary Wu,

阅读了您下面文档,关于Neon指令在CCS环境下的使用,

www.deyisupport.com/.../18765.aspx

目前我正在cortex-A8上,ccs5.5上搭建环境,想利用neon/FVP在arm端进行算法优化,目前遇到不少问题?

如果方便的话,能否共享一下您提供的文档中涉及的工程代码,学习arm端 Neon/VFP指令在CCS环境应用的搭建?

非常感谢!

BRS,

Meng

  • 是汇编那部分的问题么?

  • Hello zhou,

    非常感谢您的回复!

    我在网上看了一些文档,我的理解是,看到 CCS 是不支持,neon的intrinsic 指令,你要在ccs下面,用neon指令,必须用汇编,事实情况是这样的吗?

    我编的程序,包括了neon的intrinsic指令。

    另外,我看文档说,你要用neon指令,你必须,在使用neon加速器前,通过汇编代码使能其,以前没弄过,不知道如何做,

    所以,如果有例程参考的话,那是最好不过的。

    非常感谢!

    BRS,

    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

  • 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

  • 理论上直接用你的那种asm()方式就可以嵌入汇编,是编译会报错么?

  • Hello Zhou,

    是的,报错,

    我主要不知道如何将a[i]数组,通过vld1.16 加载到{d0,d1},也就说源操作数,如何将a[8],加载到r0.

    谢谢!

    BRS,

    Meng

  • 检查一下你的CCS的工程配置,看看neon/vfp有没有在工程配置中使能。

    我以前有客户嵌入的neon汇编没有问题。

  • 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