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/TMS320F28377D:位移问题

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/900936/ccs-tms320f28377d-bit-shift-problem

器件型号:TMS320F28377D

工具/软件:Code Composer Studio

你(们)好。

存在位移问题、例如:

如果变量 M 和 N 都是"long"类型、当描述类似于"M = 1 << N"且 N 大于15 (如16)时、我将 M 为"1"而不是"0"。

为什么我将 M 设为"1"而不是"0"?  

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

    对于包含问题移位表达式 的源文件、请按照文章如何提交编译器测试用例中的说明进行操作。  如果问题移位表达式不明显,请在此处添加注释,如// Problem。

    谢谢、此致、

    乔治

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

    你(们)好

    C2000是否在逐位移位上使用循环移位?

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

    [引用用户="Willie Lai "] C2000是否对逐位移位使用循环移位?[/quot]

    谢谢、此致、

    乔治

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

    你好、George。
    首先、感谢您的回复。 请查看下面随附的问题:

    "c:/ti/ccsv6/tools/compiler/ti-cgt-c2000_18.1.4.LTS/bin/cl2000 -v28 -ml -mt --cla_support=cla1 -float_support=fpu32 -tmu_support=tmu0 -vcu_support=vcu2 -include_path="C:/ti/ccsv6/tools/compiler/ti-cgt-c2000_18.1.4.LTS/include -g -preproc_with_comment -preproc_with_compile -----wrap_warning_error="-main_sensort_diag_off -"-225"-main_display_error_display_error_off"。  

    随附的 pp.文件:e2e.ti.com/.../5050.main.pp.txt

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

    感谢您的测试案例。  我可以重现相同的行为。

    移位表达式未定义、因为移位计数太大。  只有当移位计数小于第一个操作数的大小(以位为单位)时、才定义移位。  在您发送的代码中、每个表达式的移位计数太大。

    您的代码包含第二个问题、在之前的帖子中未提及。  关键源代码行是...

    长 RawData = 0xFFFFFFFF;
    Long MaskData;
    
    // MaskData 不会是"0xFFFFFFEEEF"、而是"0x0000EEEF"。
    MaskData = RawData &~(0x00001000 | 0x00000100 | 0x00000010); 

    看起来编译器会生成不正确的 AND 指令。  我提交了 EXT_EP-9788条目 以进行调查。  欢迎您使用我签名中的以下链接进行操作。

    谢谢、此致、

    乔治

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

    你好、George。

    感谢你的帮助。

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

    实际上、由于掩码的高16位为0xFFFF、且(AH&0xFFFF)产生 AH、因此仅生成一个16位指令并不是一个错误。  鉴于18.1.4.LTS 的测试案例、我无法重现问题。  我怀疑此测试用例是一个切口太远的测试用例。

    您如何检测问题?  您如何看到 MaskData 的价值?  您是在 CCS 中查看它、还是在后续代码中查看它的值不正确?

    现在、我必须解决测试用例中使用的十六进制常量。  我不认为这是问题的一部分、但这些常量可能需要重新编写以使用"ul"后缀。  尽管它使用十六进制常量、但这些常量是有符号的。  尽管十六进制常量有8位数、但它们实际上只有16位宽。  根据 C99标准、值适合"signed int"的非后缀十六进制常量被指定为"signed int"类型。  不要忘记 C2000具有16位"int"。  因此、表达式

    (0x00001000 | 0x00000100 | 0x00000010)

    等于

    (signed int)0x1110

    ~(0x00001000 | 0x00000100 | 0x00000010)

    等于

    (signed int)0xeeef

    接下来、该值从 signed int 转换为 signed long、以便可以在二进制和表达式中使用。  由于该值为负、因此会进行符号扩展并变为:

    (signed long)0xffffeeef

    因此、您似乎获得了预期的掩码、但这只是因为碰巧设置了高位。  如果您希望这些常量是32位无符号常量表达式、则应在其中的每个常量上实际使用'ul'后缀:

    ~(0x00001000ul | 0x00000100ul | 0x00000010ul)