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.

[参考译文] TMS320F28386S:CLA C 编译器错误

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1196305/tms320f28386s-cla-c-compiler-bug

器件型号:TMS320F28386S

您好!

我在 CLA C 编译器代码生成中遇到了一个错误。

对于 C 代码:

float a、b、res[1];
__interrupt void testTask(){
float p、n;
P = A;
n = b;
RES[0]=(p > n)? P:-n;
}

生成以下汇编代码:

MMOV32 MR0、@A ;[CPU_FPU]|6|
MMOV32 MR1、@b ;[CPU_FPU]|9|
MCMPF32 MR0、MR1 ;[CPU_FPU]|9|
MNEGF32 MR0、MR1、LEQ ;[CPU_FPU]|9|
MMOV32 @分辨率、MR0 ;[CPU_FPU]|9|

问题是、指令 MNEGF32将变量复制bres独立于比较结果的位置。 实际上、生成的汇编代码在 C 语言中看起来是这样的、这是错误的:

RES[0]=(p > n)? N:-n;

我尝试进一步调查这种情况、如果没有res变量作为数组、则生成的代码具有分支、但正确:

float a、b、res;

__interrupt void testTask()
{
float p、n;
p = a;
n = b;
res =(p > n)? P:-n;
}

MMOV32 MR0、@A ;[CPU_FPU]|6|
MMOV32 MR1、@b ;[CPU_FPU]|9|
MCMPF32 MR0、MR1 ;[CPU_FPU]|9|
MNOP ;[cpu_fpu]
MNOP ;[cpu_fpu]
MNOP ;[cpu_fpu]
MBCNDD $C$L1、GT ;[CPU_FPU]|9|
MNOP ;[cpu_fpu]
MNOP ;[cpu_fpu]
MNOP ;[cpu_fpu]
;出现 branchcc;[]|9|
MNEGF32 MR0、MR1 ;[CPU_FPU]|9|
$C$L1:
MMOV32 @分辨率、MR0 ;[CPU_FPU]|9|

尽管在我的应用程序中、我需要将结果放入数组中、因此我找到了一个权变措施:

如果(p > n) res[0]= p;否则 res[0]=-n;

对于此 C 代码、汇编语言与上述情况相同(无数组)。

电源 命令行调用和编译器版本:

cl2000 -c --cla_support=cla2 --abi=eabi -mt --keep_asm -O4 --opt_for_speed=5 test.cla
;*********
;* TMS320x280xx 控制律加速器 G3 C/C++代码生成 UNIX v22.6.0.LTS *
;*创建日期/时间:2月14日星期二12:50:54 2023 *
;*********
compiler_opts --abi=eabi -cla_support=cla2 -float_support=softlib -hlL_source=on -mem_model:code=flat -mem_model:data=large --object_format=elf -silicon_errata_fpu1_workariter=on --silicon_version=28 - symwarf_debug-df:symdebug:dwarf
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您告知我们此行为、并提供简要的测试案例。  我可以重现相同的行为。  我提交 了 EXT_EP-11029 以进行调查。  欢迎您访问该链接。

    谢谢、此致、

    乔治