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.

[参考译文] 编译器的这个已知错误吗?

Guru**** 2451970 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/766912/is-this-known-bug-of-compiler

器件型号:TMS320F28375D

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

我想将 CLARAM 数据输出到 EMIF2数据。
我编写了如下 CLA C 源代码。

#define WRITE_SIZE (31)
中断  void  Cla1Task7 (void){
  Int16 S16_I;
  int16 *s_ptr;
  volatile Int16 * d_ptr;

  S_ptr =(int16 *)(&(claram.top));
  D_PTR =(volatile Int16 *) EMIF2_ADDRESS;
  对于(S16_I = 0;S16_I < WRITE_SIZE;S16_i++){
      *D_PTR++=*s_PTR++;
  }

此代码仅复制4个数据、而不是我预期的31个数据。
我更改 WRITE_SIZE 的数量、然后得到各种结果。


WRITE_SIZE = 32、29、28正常(复制了完整数据)
wirte_size=31 (仅为4个数据)、33、30、27 (仅为3个数据)为 NG。

我检查汇编器代码、可能会发现此错误的原因。

[NG 案例]
在这种情况下、汇编器代码由每3个数据移动 N 次循环组成。第三个数据移动代码和循环末尾的比较代码混合如下。

       MCMP32   MR2、MR1
       MMOVZ16  MR0、* MAR1[#1]++
       MMOV16   * MAR0[#1]++、MR0
       MMOV16   @_CLA_scratchpad_start、MAR0
       MNOP
       MNOP
       MMOVZ16  MR0、@μ_CLA_scratchpad_start
       MBCNDD   $C$L1、NEQ

MCPM32的结果使用 MBCNDD。 但是、MCPM32之后的 MMOVZ16具有更改状态标志的位置。 如果 CLARAM 数据为0、则设置 Z 标志、MBCNDD 出错。

[确定案例]
在这种情况下、汇编器代码由每2个数据移动 N 次循环组成。 第2个数据移动代码从循环的代码末尾分频。

       MMOVIZ   MR2、#0
       MMOVZ16  MR0、* MAR1[#1]++
       MCMP32   MR2、MR1
       MMOV16   * MAR0[#1]++、MR0
       MMOV16   @_CLA_scratchpad_start、MAR0
       MNOP
       MNOP
       MMOVZ16  MR0、@μ_CLA_scratchpad_start
       MBCNDD   $C$L1、NEQ

在 MCMP32和 MBCNDD 之间没有改变状态标志的代码、所以这个代码正常运行。

我使用了 TI 编译器 v6.2.8、优化选项为-O3 -opt_for_speed=5。

这是已知的错误吗? 我应该使用最新的编译器吗?

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

    我需要一个测试用例、允许我生成与 NG 用例中相同的汇编代码。  这样做后、我将向编译器开发团队提交错误报告。  对于包含函数 Cla1Task7 的源文件、请按照文章 How to Submit a Compiler Test Case 中的说明进行操作。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我提到、OK 案例还具有更改状态标志的目的。 如果 MAR0为0、则在 MBCNDD 之前的 MMOVZ16更改 Z 标志。 但在本例中、MAR0会启动 EMIF2_ADDRESS 和 Incrimment、因此 MAR0并非始终为0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我多次尝试"插入文件"、但.txt 文件作为媒体文件附加、因此请粘贴以下内容。

    它是非常简单的代码。 它无法运行、但会创建与 NG 案例相同的汇编代码。请检查此代码。

    [cla1_task.pp]


    cla_write_emif2[(31)]短整型;

    #pragma CODE_SECTION (Cla1Task7、"Cla1Prog");

    //
    // Cla1Task7
    //
    中断  void   Cla1Task7 (void){
       短接 S16_I;
       短接*s_ptr;
       volatile short *d_ptr;

       S_PTR =(short *)(&(cla_write_emif2[0]);
       D_PTR =(volatile short *)(0x2380);
       对于(S16_I = 0;S16_I <(31);S16_i++){
           *D_PTR++=*s_PTR++;
       }

    ///----------------------------------------------------------

    [编译器版本]

    V6.2.8

    [使用的编译器选项]

    ****为项目 CLAtest 构建配置调试****

    "C:\\ti\\ccsv6\\utils\\bin\\gmake"-k source/cla1_task.obj
    '生成文件:./source/cla1_task.cla '
    '调用:C2000编译器'
    "c:/ti/ccsv6/tools/compiler/c2000_6.2.8/bin/cl2000 -v28 -ml -mt --cla_support=cla1 -float_support=fpu32 -tmu_support=tmu0 -vcu_support=vcu2 -O3 -opt_for_speed=5 -g -preobj_with_compile -preproc_with_comment ---proc-w_supment---opt_off-out_--opt_remote_display---opt_error---opt_sepical_sepage---ature_s=-ine_separt_s=-ine_separtical_s=-at_clus /source/cla1_task.cla  
    "./source/cla1_task.cla "、第17行:警告#1107-D:从整数指针转换为较小指针
    '完成的建筑:./source/cla1_task.cla
    '

    ****构建完成****

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

    感谢您的测试案例。  我可以重现问题输出。

    但是,此问题在以后的版本中得到了解决。  我尝试了版本18.1.4.LTS。   虽然我无法确定是否运行代码、但我非常确信问题已得到解决。  升级到更高版本是否实用?   

    很抱歉、您在您的第一篇帖子中说您使用的是6.2.8版。  此版本的使用年限大约为4.5年。  不再支持6.2.x 系列版本。   

    谢谢、此致、

    乔治

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

    升级到编译器的更高版本是否实用?

    谢谢、此致、

    乔治

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

    因为已经有一段时间了,我想你已经解决了你的问题。  非常感谢您的解决。

    谢谢、此致、

    乔治