工具/软件:Code Composer Studio
你(们)好。
存在位移问题、例如:
如果变量 M 和 N 都是"long"类型、当描述类似于"M = 1 << N"且 N 大于15 (如16)时、我将 M 为"1"而不是"0"。
为什么我将 M 设为"1"而不是"0"?
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.
工具/软件:Code Composer Studio
你(们)好。
存在位移问题、例如:
如果变量 M 和 N 都是"long"类型、当描述类似于"M = 1 << N"且 N 大于15 (如16)时、我将 M 为"1"而不是"0"。
为什么我将 M 设为"1"而不是"0"?
你(们)好
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)