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.

[参考译文] 编译器/TDA4VM:Windows 上的 C7X SE 主机仿真

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/884780/compiler-tda4vm-c7x-se-host-emulation-on-windows

器件型号:TDA4VM

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

大家好、朋友。

我将 C7000 CGT 用于 Windows 以模拟 C7X。 版本为1.3.0。我的 Visual Studio 版本为2019。
我注意到 SE 接口已更新、我在 c7x_strm.h 中看到一些示例代码
在一个样本中、VECLEN 被设定为_SE_VECLEN_4ELEMS。
我执行了该代码。
Vout.lo =__ SE1ADV (uint4);
但它只加载了一个元素。
我在头文件中尝试了旧版本的接口、并正确加载了该接口。
您能帮我解决这个问题吗?
此致。
Henry
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    亨利

    我不确定您的问题可能是什么。 您能否尝试在您的环境中编译和运行以下代码? 此外、如果您发布/附加了您的代码、也会有所帮助。

    #include 
    #include 
    #include 
    
    #define size_array (1024)
    
    uint uint_array[size_array];
    
    void init_memory ()
    {
    对于(int i = 0;i < size_array;i++)
    uint_array[i]= i + 1;
    }
    
    uint8 se_func (uint32_t * startaddr)
    {
    uint8 Vresult;
    __SE_TEMPLATE_v1参数=__gen_SE_TEMPLATE_v1 ();// SE 参数
    
    Params.DIMFMT =__SE_DIMFMT_2D;
    Params.ELETYPE =__SE_ELETYPE_32位;
    Params.VECLEN =___ SE_VECLEN_4ELEMS;// 4个元素
    
    //根据设置设置设置模板向量并打开流
    //基于迭代计数器和维度(以 ELEMS 的#表示)
    params.ICNT0=128;
    Params.ICNT1 = 128;
    params.DIM1=0;
    Params.ICNT2=128;
    params.DIM2=0;
    Params.ICNT3=128;
    params.DIM3=0;
    
    // DECDIM1宽度(默认为0)
    params.DECDIM1宽度= 0;
    
    // DECDIM2宽度(默认为0)
    params.DECDIM2宽度= 0;
    
    // LEZR 计数(默认为0)
    PARAMS.LEZR_CNT = 0;
    
    _SE1_OPEN ((void*) startaddr、params);
    
    //读取数据流并推进计数器
    对于(int I0 = 0;I0 < 8;I0++)
    {
    printf ("-------------------- \n");
    uint8 Vout =
    #ifdef __C7X_HOSTEM__
    uint8 (0);
    #else
    (uint8)(0);
    #endif
    Vout.lo =__SE1ADV (uint4);
    #ifdef __C7X_HOSTEM__
    Vout.print();
    #else
    printf ("%d、%d、%d、%d、%d、%d、%d、%d、%d、%d\n"、Vout.s0、Vout.s1、Vout.s2、Vout.s3、 Vout.s4、Vout.s5、Vout.s6、Vout.s7);
    #endif
    
    VOUT.hi =__SE1ADV (uint4);
    #ifdef __C7X_HOSTEM__
    Vout.print();
    #else
    printf ("%d、%d、%d、%d、%d、%d、%d、%d、%d、%d\n"、Vout.s0、Vout.s1、Vout.s2、Vout.s3、 Vout.s4、Vout.s5、Vout.s6、Vout.s7);
    #endif
    
    Vresult += Vout;
    }
    
    //关闭流
    _SE1_CLOSE ();
    
    返回 Vresult;
    }
    
    int main()
    {
    init_memory();
    SE_func (uint_array);//未使用返回值
    
    返回0;
    } 

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

    您好!

    感谢您的回复。这是我执行的代码。

    #include 
    #include 
    uint8 se_func (uint32_t * startaddr)
    {
    INT I0;
    uint8 Vresult;
    __SE_TEMPLATE_v1参数=__gen_SE_TEMPLATE_v1 ();// SE 参数
    
    Params.DIMFMT =__SE_DIMFMT_4D;
    Params.ELETYPE =__SE_ELETYPE_32位;
    Params.VECLEN =___ SE_VECLEN_4ELEMS;// 4个元素
    
    //根据设置设置设置模板向量并打开流
    //基于迭代计数器和维度(以 ELEMS 的#表示)
    params.ICNT0=4;
    params.ICNT1 = 2;
    params.DIM1=4;
    params.ICNT2=2;
    params.DIM2=8;
    params.ICNT3=4;
    params.DIM3=-16;
    
    // DECDIM1宽度(默认为0)
    params.DECDIM1宽度= 0;
    
    // DECDIM2宽度(默认为0)
    params.DECDIM2宽度= 0;
    
    // LEZR 计数(默认为0)
    PARAMS.LEZR_CNT = 0;
    
    _SE1_OPEN ((void*) startaddr、params);
    
    //读取数据流并推进计数器
    对于(I0 = 0;I0 < 8;I0++)
    {
    uint8 Vout;
    Vout.lo =__ SE1ADV (uint4);
    VOUT.hi =__ SE1ADV (uint4);
    
    Vresult += Vout;
    }
    
    //关闭流
    _SE1_CLOSE ();
    
    返回 Vresult
    ;} 

    我执行了您的代码、这是打印信息。

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

    亨利

    我将研究主机仿真和 MS Visual Studio 编译器的这个问题。 同时、您能否尝试使用 g++编译器并让我知道会发生什么情况?

    仅供参考、我在上面发布的代码的预期输出为(我使用 g++获得的输出):

    --------
    (1、2、3、4、0、 0、0、0)
    (1、2、3、4、5、 6、7、8)
    --------
    (9、10、11、12、0、 0、0、0)
    (9、10、11、12、13、 14、15、16)
    --------
    (17、18、19、20、0、 0、0、0)
    (17、18、19、20、21、 22、23、24)
    --------
    (25、26、27、28、0、 0、0、0)
    (25、26、27、28、29、 30、31、32)
    --------
    (33、34、35、36、0、 0、0、0)
    (33、34、35、36、37、 38、39、40)
    --------
    (41、42、43、44、0、 0、0、0)
    (41、42、43、44、45、 46、47、48)
    --------
    (49、50、51、52、0、 0、0、0)
    (49、50、51、52、53、 54、55、56)
    --------
    (57、58、59、60、0、 0、0、0)
    (57、58、59、60、61、 62、63、64)

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

    亨利

    它看起来 MS Visual C++不能封装诸如 gcc/g++ can 的位字段。 此外、SE 设置寄存器和 SA 设置寄存器的实现取决于此位字段打包行为。 以前的 C7000编译器软件包在某些情况下适用于 MS Visual C++、因为有_set*函数手动对 SE 设置寄存器进行位字段打包。 虽然我们都很幸运、但 SE 设置寄存器中的某些位字段没有用于进行位打包的"设置"函数。 (v1.3 C7000编译器将 API 更改为 SE 和 SA 设置寄存器、使其更干净、更具可扩展性。 因此、这些"设置"函数已从 API 中删除。)

    简而言之、MS Visual C++似乎不能用于主机仿真(至少此时)。 必须改为使用 G++。

    我将向团队添加一个涉及解决问题(不确定是否可以这样做)或记录 MS Visual C++不能与主机仿真配合使用的工作项目。

    Todd

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

    Todd、

    谢谢你。