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.

[参考译文] 编译器/TDA2PXEVM:TDA2PXEVM

Guru**** 3000380 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/923824/compiler-tda2pxevm-tda2pxevm

器件型号:TDA2PXEVM

工具/软件:TI C/C++编译器

我已经编写了测试应用程序(.c)、其中调用 VCOP 内核(.k)调用以添加2D 阵列。 该代码针对 EVE 内核进行编程。  

在使用主机仿真(使用 g++ 5.4.0编译)测试上述代码时、一切都正常。 但是、当我测试使用 g++ 7.5编译器编译的相同代码时、它会在数据被加载到矢量寄存  器的行上放置分段故障、即 Vin1 = in1_ptr[Addr];请为该问题提供解决方案建议。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们需要能够重现问题、以便能够指导您解决问题。 您能否提供显示分段故障的源代码示例?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下代码为 test_app.c
    #include //#include #include #if VCOP_HOST_EMIENSE //仅在主机仿真的情况 下#include "sample_vcop_array_add_uns_short_kernel.k" #else #include 使用命名空间 std; extern "C"{ void sample_eve_array_add_uns_short (__vptr_uint16 in_arra1、 __vptr_uint16 in_arra2, _vptr_uint16 out_arr、 unsigned short w、 无符号短整型 h ); } #endif #define size 32 #pragma DATA_SECTION ("AData") uint16_t array1[size]={1、2、4、5、8、9、4、6、5、6、1 、5、7、8、4、4、6、3、6、2、4、2、2、4、2、2、4、2、2、4、2、2、4、2、2、2、4、2、4、2、2、1、2、4、2、1、4、2、2、2、1、4、2、2、1、2、2、1、1、2、2、4、2、2、2、2、1、2、1、1、1、2、1、4、2、2、2、2、1、1、2、1、1、1、4、4、2、1、1、1、2、1、1、4、2、1、1、2、2、1、2、2、1、1、1、2、1、1、1、1 //内核调用 #if VCOP_HOST_emulation for (int i=0;i <<"="" "<<<"="" +="" "<<<"="<<

    下面的代码是 kernel_code.k

    " cpp;="" fontsize:="" 100;="" first-line:="" 1;="" "="">#if VCOP_HOST_EMUulation
    #include 
    #include 
    #endif
    
    #define ELEMSZ sizeof (* in1_ptr)
    #define VECTORSZ (VCOP_SIMD _width* ELEMSZ)
    
    void sample_eve_array_add_uns_short
    (
    __vptr_uint16 in1_ptr、 //输入1数据指针
    __vptr_uint16 in2_ptr, //输入2数据指针
    __vptr_uint16 optr, //输出数据指针
    无符号短宽度、 //每行的宽度
    无符号短高度 //每行的高度
    )
    {__vector
    Vin1; // input1
    __vector Vin2; // input2
    __vector Vout; //输出
    
    
    对于(int I1 = 0;I1 <高度;I1++)
    {
    
    对于(int I2 = 0;I2 <宽度/VCOP_SIMD 宽度;I2++)
    {
    
    _agen 地址;
    地址= I1*width*ELEMSZ +I2*VECTORSZ;
    
    Vin1 = in1_ptr[Addr];
    Vin2 = IN2_PTR[Addr];
    输出电压 = Vin1 + Vin2;
    OPTR[Addr]=输出电压;
    
    
    }
    }
    
    

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否能够重现此问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Tejashwini N"]使用 g++ 5.4.0[/quot]编译

    GCC 5.1.0 < 6.1.0:libstdc++.so.6.0.21
    GCC 5.1.0 < 6.1.0 :GLIBCXX_3.4.21、CXXABI 1.3.9

    [引用 user="Tejashwini N"]使用 g++ 7.5[/引用]编译

    GCC 7.2.0 < 8.1.0:libstdc++.so.6.0.24
    GCC 7.2.0 < 8.1.0 :GLIBCXX_3.4.24、CXXABI

    看起来像是 ABI 版本问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我无法重现此问题。

    >/linux/bin/g ++-版本
    g++(GCC) 7.5.0
    版权所有(C) 2017 Free Software Foundation、Inc.
    这是免费软件;请参阅复印条件的来源。 不
    提供任何保证;甚至不提供适销性或特定用途适用性。
    
    >./linux/bin/g ++-DVCOP_HOST_EMUulation a.c
    >./a.out
    1 + 1 = 2
    + 2 = 4
    ...
    
    >ldd a.out
    linux-vdso.so.1 =>(0x00007fff33dda000)
    libstdc++.so.6 =>/usr/lib/x86_64-linux-gnu/libstdc
    
    /lib/x86_64-linux-gnu/libgcc_s.so.1
    /lib/x86_64-linux-gnu/libc.so.6 ++.so.6 (0x00007f27a0cb000) libm.so.6 =>/lib/x86_64-linux-gnu/libm.so.6 (0x00007f27a09b5000) libgcc_so.6 (0x00007f2764=0x00002764.so.000)libm.so-(0x00007f2764.so.000=0x00007f2764=0x00002764.so-0721.so.dlc.so-000=0x0000.so-0721.so-0721.s1.s1.s1.s1.s1.s1.s1.s1.so-0721.s1.s1.s1.
    
    

    我还使用 GCC 的清除器运行了生成的程序、以进行未定义的行为和地址检查、并且没有遇到可能导致分段故障的问题。

    我使用了整个程序、并使用在线的"Compiler Explorer"运行了 g++-7.5.0、网址 为:https://godbolt.org/z/GE3jh7

    这利用了我们最近发运的 vcop_host_emulation.h。 您要使用的是这个吗?