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.

[参考译文] TMS320F28379D:Int32变量的比较-奇怪的行为

Guru**** 2564200 points
Other Parts Discussed in Thread: CONTROLSUITE, SFRA

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/757534/tms320f28379d-comparison-of-int32-variables---strange-behaviour

器件型号:TMS320F28379D
Thread 中讨论的其他器件:controlSUITESFRA

你(们)好  

我在以下代码方面有很大的问题。 使用的所有变量均为 int32_t 类型 该框架基于示例 "FCL_379XL_"、除闪烁 LED 之外未使用的所有内容均已注释掉。 任务 A1每600us 调用一次。  

//----------------------------------------
void A1 (void)
//-------------------------------------------------------
{

if (var1!= var2)
{
Δ= var1 - var2;
Dir =(Δ< 0)? -1L:1L;
Δ= dir*delta;
flag=0;
Var2 = var1;
}


//--------
//下次 CpuTimer0 'counter'达到周期值时,转至 A2
A_Task_ptr =&A2;
//-----
} 

当我设置 var1=10时、dir 变为 dir=1、delta 变为 delta=10、因为 var2=0。 一切都按预期工作。 但是、当我将 var1的值增加到一个更高的值(例如、对于 int32_t、应该完全可以得到100'000)时、Δ 值在处被截断  65536。  

引入一个额外的变量以某种方式解决了这个问题、并且代码按预期工作。 变量 delta 是 var1和 var2的确切差值:

//----------------------------------------
void A1 (void)
//-------------------------------------------------------
{
IF (标志)
{
Δ= var1 - var2;
Dir =(Δ< 0)? -1L:1L;
Δ= dir*delta;
flag=0;
Var2 = var1;
}

if (var1!= var2)
flag=1;
} 

将标记计算放在顶部也不起作用。 之后必须来。 因此、变量 var1和 var2的实化和比较显然存在问题。 有人知道我为什么会遇到这种行为吗? 在比较变量 var1和 var2时、我是否犯了根本错误? 或者、在处理 C2000微控制器上的 Int32变量时是否存在已知问题?

感谢您的反馈

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是您自己的 TI 代码(或)示例代码吗?

    如果是 TI 的示例代码、请提供项目路径和文件详细信息。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是文件路径为"C:\ti\controlSUITE\libs\app_libs\motor_control\libs\FCL_SFRA\v01_00_00_00\examples\FCL_SFRA_379DXL_v1"的示例

    我认为这可能是编译器的优化、所以我只是尝试将优化设置为"off"。 但是、该行为仍然存在。

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

    无论导致这种情况发生的原因是什么...

    [引用 user5835564]\n 但是、当我将 var1的值增大到一个更高的值(例如、对于 int32_t 而言、100'000应该非常合适)时、Δ 值会在处截断  65536. [/引述]

    (笑声) 可能是多个因素的组合、都很确切。  我想得到一个测试用例、我可以将其编译为汇编代码、然后检查该代码是否有问题。  请注意、我不需要运行的完整程序。   

    请将程序置于其工作不正常的状态。  然后、对于包含函数 A1 (或等效函数)的文件、请按照文章 如何提交编译器测试用例中的说明进行操作。  创建预处理文件后,请添加一些与以下内容类似的注释...

    包含问题的/*函数/*
    当 var1包含大于65535的值时,开始出现问题
    

    在我检查编译器生成的汇编时、这些注释将指导我进行检查。

    谢谢、此致、

    乔治

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

    非常感谢您的回答、非常感谢。 实际上、我在过去几天找到了解决方案、但忘记更新论坛(抱歉!)。

    问题出在调试器。 微控制器上的循环运行速度快于调试器(CDS100v2)修改32位变量的速度。 因此、变量的前16位被修改、然后-几个循环周期之后-变量的后半部分也被修改。 这当然会导致不可预知的行为。

    我现在实现了一个函数、该函数验证我要检查的变量(在本例中为 var1)在过去的 x (值10-20是足够的)循环周期内没有被修改。

    此致、
    拉斐尔