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/TMS320F28075:转换为32位值时出错

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/944487/ccs-tms320f28075-error-in-converting-to-32bit-value

器件型号:TMS320F28075

工具/软件:Code Composer Studio

您好!

我正在尝试解码串行流并提取一些32位值。

以下是我的代码的一部分:

#define UV_MAX_PACKET 128
。
。
。

char buffer[UV_MAX_packet];
.
。
。


Int16 ExtracBData()
{.

。
。
int32 it;
.
。
。
它=*(((Int32 *)&buffer[10/2]);
。
。

.} 



如下调试屏幕所示、我希望断点上的值为0x1e935e75 = 512974453、这是 buffer[6]:buffer[5]、但我的值为0x5e75087f = 1584728191、这是 buffer[5]:buffer[4]
表达式窗口中的第二行是表达式窗口第一行中的确切表达式变量、但结果不同。

CCS 为 V10.1.0、CGT 为 V20.2.2。 代码使用 CCS 调试配置的默认编译器和链接器设置生成。

此致、
mHg

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

    [引用用户="mir Hossein Ghoreish"][/As shown below in debug screen, I expected on breakpoint to have the value of 0x1e935e75 = 512974453 which is<strong> buffer[6]:buffer[5]</strong>, but I have 0x5e75087f = 1584728191 which is <strong>buffer[5]:buffer[4]</strong>The second line in Expressions window is the exact expression as <strong>it</strong> variable in first line of expression window but different results.The CCS is V10.1.0 and CGT is V20.2.2.引用]  TMS320C28x 优化 C/C++编译器 v20.8.0.STS 用户指南的第7.1.7节字段/结构对齐 如下:

    [引用]大小为32位或更大的类型在32位(2字)边界上对齐。 [/引号]我不确定当您将未在2字边界上对齐的地址转换为  Int32 *时会发生什么情况、但根据您的结果、所使用的地址看起来像四舍五入。

    不确定这是编译器中的错误还是调用未定义行为的代码。 与将 缓冲区中奇数索引的地址转换为 Int32 *不同、也许以两个16位字的形式访问缓冲区、然后进行位移和加法以形成一个32位值会避免这一问题。

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

    切斯特、您好!

    感谢您的快速回复。

    实际上、代码是从 x86计算机上生成的、我应该应用此编译器限制。

    但我希望编译器和调试器会产生相同的结果。 我希望表达式窗口中的前两行显示相同的值。

    mHg

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

    Chester Gillon 的分析是正确的。  C28x CPU 期望32位内存读取和写入与偶数16位字地址对齐。  如需更多文档   、请在《TMS320C28x DSP CPU 和指令集参考指南》中搜索标题为对偶数地址进行32位访问对齐的子章节。

    [引用 user="mir Hossein Ghoreish"]我希望编译器和调试器获得相同的结果

    在本例中、调试器显示不正确。  它不像 C28x CPU 那样访问从奇数地址开始的32位内存。

    谢谢、此致、

    乔治

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

    您好、George、

    谢谢、我刚才修复了我的代码。

    我有两项建议:

    1) 1)调试器应该被修复以提供一致的结果。

    2) 2)在上述情况下、指针是静态的、编译器可以检测到访问奇数地址32位存储器的情况并发出警告。

    此致、

    mHg