请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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将变量复制b到res独立于比较结果的位置。 实际上、生成的汇编代码在 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