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.

[参考译文] CCS/TMS320F28.0049万M:在CLA上对无符号32位整数(UINT32_t)比较的错误处理

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/625688/ccs-tms320f280049m-incorrect-handling-of-unsigned-32-bit-integer-uint32_t-comparisons-on-cla

部件号:TMS320F28.0049万M
主题中讨论的其他部件: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

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

    请按照如何 提交编译器测试用例一文中的说明提交测试用例

    谢谢,此致,

    -George

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

    e2e.ti.com/.../cla_5F00_hv_5F00_task.pp.txt

    TMS320C2000连接器PC v 16.9 Tm3.

    ****为项目OBC DSP原型软件构建配置调试****

    "C:\\ti\\ccsv7\\utils\\bin\\gmake "-k -j 8 Source/CLA/CLA_hv_task.obj -O
    '正在构建文件:../Source/CLA/CLA_hv_task.CLA'
    '调用:C2000编译器'
    Oc:/ti/Ccsv7/tools/compiler/ti-CGT-C2000_VCU_support=v28 16.9 -ml -mt --CLA_support=cla2 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu0 -ooff --opt_for _cla_support=fu32 --sp_applic/spdspds/trunplate/spdspd/srack/frack/ds原型软件-应用程序基线/spdps=7.7627万/spdspdsp/dsp/dsp/dps-spdsp/spdspdsp/f12 include_path="D:/projects/P0.7627万板载充电器/SVN/Apple/Trunk/OBC DSP软件/OBC DSP原型软件/Source/Comm"--include_path="D:/projects/P0.7627万板载充电器/SVN/TRUN/OBC DSP软件/OBC DSP原型软件/Source/Comm"--include_path=O0.7627万 DSP软件/OBC/SO/SO/STUND/原型充电器-SVN/SVDBC/OBC原型DSP原型DSP软件/ODB/ODBS-电路板应用程序/O0.7627万 include_path="D:/projects/P0.7627万板载充电器/SVN/Apple/Trunk/OBC DSP软件/OBC DSP原型软件/Source/TI系统"--include_path="C:16.9 /ti/C2000/C2000Ware_1_00_01_00/device/f2800_cla_scla_scla_headers/include_path="-dav_scn_scla_scla/pre-f_scla_scn_scn_scl/scl_scl_scl_scla/sp_scl_background-f_crack_scl_scl_scl_scl_scl_scl_zh_/f_comb_scl_scl_scl_/crack_scl_scl_background-/f_scl_scl_crack_scl_/f_background-/f_scl_crack_scl_crack_scl_background-/f_scl_scl_scl_scl_scl_background-/f_scl_</s>2000 2800 
    '完成的建筑:../Source/CLA/CLA_hv_task.CLA'
    ''

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

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

    感谢您提交测试案例。  我在 SDOWP系统中提交了CodeGen-3721以对此进行调查。  请随时使用我签名中下面的SDOWP链接进行关注。

    谢谢,此致,

    -George