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.

[参考译文] 编译器/MSP430G2553:无法通过指针引用更新 int 结构成员

Guru**** 2582425 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/743390/compiler-msp430g2553-updating-an-int-struct-member-via-pointer-reference-fails-to-persist

器件型号:MSP430G2553

工具/软件:TI C/C++编译器

您好:

在随附的代码中、结构成员"delay_counter"无法在 BlinkLED 函数中保留其更新的值。 我一直不能弄清楚为什么会这样。 这是编译器错误还是架构限制?

谢谢、

Michael Clress

e2e.ti.com/.../TimerDevelopment.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看不到您分配 TimerMgr.TasksArr 的位置、因此当您使用它时、我怀疑它是 NULL。
    --------
    > InsertTimerTask( data->timermgr、BlinkLED、data->timermgr、temp /* data->delay_counter */);
    这会将(TimerMgr *)而不是(BlinkLEDData *)传递给 BlinkLED 的下一个调用。 我怀疑这会导致问题。
    --------
    我不知道失败到底是什么,但似乎其中一项可能是造成这种失败的原因。

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

    布鲁斯:

    感谢您的回复。 阵列在 InsertTimerTask 内初始化;插入第一个项目时,它将检查阵列容量。 看到它为0、它将 malloc 和 memset 数组以增大它。 不过,您的注释确实促使我在 FreeTimerMgr()中为数组添加了 free()。

    我还更新了 BlinkLEV()(对 InsertTimerTask 的调用)的第27行,以传递数据而不是数据->timermgr。 这是更正确的并且是一个很好的捕获、但对程序执行没有影响、因为 data->timermgr 是 BlinkLEDData 结构的第一个元素。 因此、当它被转换时、转换将指向存储器中的正确位置。 这完全是一个机会,如果我稍后在它之前插入了一些东西,就会导致一个错误。 很好的收获

    至于持久性,我指的是一个值的设置,希望在下一次迭代 BlinkLEV()时它保持不变。 即使进行了我刚才提到的更正、我仍然看不到值更新。 如果我使用较旧版本的 TI 编译器和 GCC 进行编译、即使关闭了优化、我也会获得不同的程序行为、这使我的沮丧更加复杂。

    这是一种非常奇怪的行为...

    我将使用引用的修改附加新项目。

    谢谢、

    Michael Clress

    e2e.ti.com/.../4300.TimerDevelopment.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另外,我将数据变量移出 main(),使其在全局范围内保持静态,而程序行为没有变化。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    更新:

    在 GCC 中、只有在数据是全局静态的情况下、程序才会正常工作。 如果我将其移回 main(),则它不会再次起作用。

    对于 TI 编译器、问题仍然存在。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >data->timermgr 是 BlinkLEDData 结构的第一个元素
    BlinkLEDData 的开始是(TimerMgr *)、而不是(TimerMgr)。 它甚至意外地不正确。

    > Mgr->TasksArr = realloc( Mgr->TasksArr,Mgr->NumberOfTasks );
    1) 1)这指定了不正确的字节计数、将 TasksArr 截断为一个字(而不是一个结构)。
    2) 2)未调整 TaskArrCapacity、因此下一次插入将导致数组溢出。
    这两个值中的任何一个都会迟早导致堆改编。

    我建议:

    > Mgr->TasksArr = realloc( Mgr->TasksArr,sizeof (struct TimerTask)*Mgr->NumberOfTasks );
    > if (Mgr->TasksArr =0){ while (1);}
    > mgr->TaskArrCapacity-=已执行;

    未经请求:您的量子似乎约为100 μ C、但我可以猜测、处理时间比这个要长、因此您的时钟运行速度会很慢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    布鲁斯:

    看起来是这样的! 非常好...非常感谢您帮助发现这些错误。

    至于量子、我假设它运行缓慢、但我无法测量它、因此我接受误差。 它仅用于照明电路、因此我认为它不会太大。

    再次感谢!

    Michael