主题中讨论的其他部件:C2000WARE
工具/软件:Code Composer Studio
我有一个应用程序使用CLA对未签名的32位值(计时器/计数器捕获事件)进行大量处理。 基于CLA的拆卸和使用仿真器逐步执行代码,CCS似乎使用CLA的MCMP32指令不正确。 文档显示,MCMP32指令比较了两个32位带符号整数,但CCS生成的代码无法正确处理无符号32位值以正确使用带符号的比较。 下面是CLA源代码,后面是一些反汇编视图。 我测试了多个值的组合,如果未能正确比较无符号32位值,则使用有符号比较会产生什么结果。
我正在使用CCS版本DSP.DSP 0.0.0013万 和7.2 的一个示例。
源代码:
//Test1 = 3,Test2 = 2147483652; 是(测试失败,不正确的无符号32位比较)
//测试1 = 3,测试2 = 2147483651; 是
//测试1 = 3,测试2 = 2147483650; 否 (测试通过,纠正无符号32位比较)
//测试1 = 3,测试2 = 2147483649; 否
//测试1 = 2,测试2 = 2147483651; 是
//测试1 = 2,测试2 = 2147483650; 是
//测试1 = 2,测试2 = 2147483649; 否
//测试1 = 2,测试2 = 2147483648; 否
//Test1 = 1,Test2 = 4294967295; 是
//Test1 = 1,Test2 = 4294967294; 是
//测试1 = 1,测试2 = 2147483651; 是
//Test1 = 1,Test2 = 2147483650; 是
//测试1 = 1,测试2 = 2147483649; 是
//测试1 = 1,测试2 = 2147483648; 否
//测试1 = 1,测试2 = 2147483647; 否
UINT16_t测试0;
UINT32_t测试1;
UINT32_t测试2;
__mdebugstop();
Test0 = 0;
test1 = 1;
test2 = 2147483649;
IF (Test1 > Test2)
{
Test0 = 1; //这只是一个故障指示器;它不会影响问题。
}
__mdebugstop();
使用添加的备注拆分Test1 = 1和Test2 = 2147483649:
0000b5d0: 7F60万 MDEBUGSTOP
0000b5d2: 7FA0万 MNOP
0000b5d4: 7FA0万 MNOP
0000b5d6: 7FA0万 MNOP
0000b5d8: 7FA0万 MNOP
0000b5da: 7840万 MMOVIZ MR0,#0x0 // Test0 = 0。
0000b5dc: 75C09D50 MMOV16 @0x9d50,MR0
0000b5de: 7840万 MMOVIZ MR0,#0x0 // Test1 = 0x0.0001万 = 1。
0000b5e0: 7880.0001万 MMOVXI MR0,#0x1
0000b5e2: 74C09D4C MMOV32 @0x9d4c,MR0
0000b5e4: 7840.8万 MMOVIZ MR0,#0x8000 // Test2 = 0x8000.0001万 = 2147483649。
0000b5e6: 7880.0001万 MMOVXI MR0,#0x1
0000b5e8: 74C09D4E MMOV32 @0x9d4e,MR0
0000b5ea: 7842.8万 MMOVIZ MR2,#0x8000
0000b5ec: 7841.8万 MMOVIZ MR1,#0x8000
0000b5ee: 7CA0.0004万 MXOR32 MR0,MR1,MR0 // MR0 = Test2 XOR 0x800万 = 0x0.0001万。
0000b5f0: 73D09D4C MMOV32 MR1,@0x9d4c,UNCF
0000b5f2: 7CA0.0019万 MXOR32 MR1,MR2,MR1 // MR1 =测试1 XOR 0x8000000000 = 0x8000.0001万。
0000b5f4: 7F20.0004万 MCMP32 MR0,MR1 //根据0x0.0001万 - 0x8000000001设置标志,设置NF = 1。
0000b5f6: 7FA0万 MNOP
0000b5f8: 7FA0万 MNOP
0000b5fa: 7FA0万 MNOP
0000b5fc: 7983.0012万 MBDCNDD 0x12,GEQ // Test1 > Test2? BRANCH (分支),如果NF = 0,则不采用BRANCH (参见上文)。
0000b5fe: 7FA0万 MNOP
0000b600: 7FA0万 MNOP
0000b602: 7FA0万 MNOP
0000b604: 7840万 MMOVIZ MR0,#0x0 // Test0 = 1。 未正确执行比较。
0000b606: 7880.0001万 MMOVXI MR0,#0x1
0000b608: 75C09D50 MMOV16 @0x9d50,MR0
0000b60a: 7FA0万 MNOP
0000b60c: 7FA0万 MNOP
0000b60e: 7FA0万 MNOP
0000b610: 7FA0万 MNOP
0000b612: 7FA0万 MNOP
0000b614: 7F60万 MDEBUGSTOP
使用添加的备注拆分Test1 = 2和Test2 = 2147483649:
0000b5d0: 7F60万 MDEBUGSTOP
0000b5d2: 7FA0万 MNOP
0000b5d4: 7FA0万 MNOP
0000b5d6: 7FA0万 MNOP
0000b5d8: 7FA0万 MNOP
0000b5da: 7840万 MMOVIZ MR0,#0x0 // Test0 = 0。
0000b5dc: 75C09D50 MMOV16 @0x9d50,MR0
0000b5de: 7840万 MMOVIZ MR0,#0x0 // Test1 = 0x0.0002万 = 2。
0000b5e0: 7880.0002万 MMOVXI MR0,#0x2
0000b5e2: 74C09D4C MMOV32 @0x9d4c,MR0
0000b5e4: 7840.8万 MMOVIZ MR0,#0x8000 // Test2 = 0x8000.0001万 = 2147483649。
0000b5e6: 7880.0001万 MMOVXI MR0,#0x1
0000b5e8: 74C09D4E MMOV32 @0x9d4e,MR0
0000b5ea: 7842.8万 MMOVIZ MR2,#0x8000
0000b5ec: 7841.8万 MMOVIZ MR1,#0x8000
0000b5ee: 7CA0.0004万 MXOR32 MR0,MR1,MR0 // MR0 = Test2 XOR 0x800万 = 0x0.0001万。
0000b5f0: 73D09D4C MMOV32 MR1,@0x9d4c,UNCF
0000b5f2: 7CA0.0019万 MXOR32 MR1,MR2,MR1 // MR1 =测试1 XOR 0x8000000000 = 0x8000000002。
0000b5f4: 7F20.0004万 MCMP32 MR0,MR1 //根据0x0.0001万 - 0x8000000002设置标志,设置NF = 0。
0000b5f6: 7FA0万 MNOP
0000b5f8: 7FA0万 MNOP
0000b5fa: 7FA0万 MNOP
0000b5fc: 7983.0012万 MBDCNDD 0x12,GEQ // Test1 > Test2? BRANCH (分支),如果NF = 0,则将采用BRANCH (参见上文)。
0000b5fe: 7FA0万 MNOP
0000b600: 7FA0万 MNOP
0000b602: 7FA0万 MNOP
0000b604: 7840万 MMOVIZ MR0,#0x0 // Test0 = 1已跳过。
0000b606: 7880.0001万 MMOVXI MR0,#0x1
0000b608: 75C09D50 MMOV16 @0x9d50,MR0
0000b60a: 7FA0万 MNOP
0000b60c: 7FA0万 MNOP
0000b60e: 7FA0万 MNOP
0000b610: 7FA0万 MNOP
0000b612: 7FA0万 MNOP
0000b614: 7F60万 MDEBUGSTOP