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/TM4C1294NCPDT:强制结构中的元素为易失性(或未优化)

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/603936/ccs-tm4c1294ncpdt-forcing-an-element-from-a-structure-to-be-volatile-or-not-optimized

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

男士、

我有以下小函数:

/*
保持程序执行直到*
毫秒的时间结束。
*/
void SystemUtilitiesDelayms (uint32_t delayms)
{
uint32_t时限;
timelimit = systemUtilities.systemElapsedMS + delayms;
while (timelimit > systemUtilities.systemElapsedMS);
} 

在 计时器中断上、元素 systemUtilities.systemElapsedMS 在其他位置增加。

尽管时间限制小于.systemElapsedMS、代码仍会在 while ()循环中卡住。 我认为问题是由于函数的优化、这会生成一个用于比较两个寄存器的汇编代码:

由于其他地方的间接访问、我无法使结构变得易失性。

我是否应该"实用"该功能、使其不会得到优化? 还有其他方法吗?

谢谢!

布鲁诺

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

    好的、发现这起作用:

    while (*(volatile uint32_t*)&systemUtilities.systemElapsedMS <时限); 

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

    首先、请勿打扰关闭优化。 这不仅不能保证现在可以正常工作、而且可以在将来的编译器版本中进行更改

    第二、请访问 embeddedgurus.com/.../

    我认为、至少在递增的时间内添加一个易失性是必要的。 根据结构中的其他元素、您可能希望整个结构具有易失性(间接访问不应阻止这种情况)。 侧注:除非您在其他地方复制此结构、否则我不确定您使用的是结构、可能是一些合成糖。

    最后、一般而言、您需要提供原子访问、并保证访问的数量和顺序。 在这种情况下、幸运地发生了变量大小的自动访问。


    Robert

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

    [引用 user="Bruno Saraiva"] while (*(volatile uint32_t*)&systemUtilities.systemElapsedMS < timelimit);

    这不是一个通用解决方案。 您需要对所有访问都进行易失性限定。

    Robert

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

    [引用 user="Robert Adsett"]添加易失性到至少递增的时间,我认为是必要的。

    同意并完成、谢谢。

    Robert Adsett 说:
    间接访问不应阻止该

    当我这么做时、我收到了一些编译警告、但您的警告足以让我看看其他什么是错误的、因为事实上、它不是结构的一个元素的易失性属性。

    [引用 user="Robert Adsett"]可能会有一些语法糖[/引用]

    这是结构的用途之一! 把所有东西都控制在同一个位置... 更轻松地复制到单独的位置以调试整个集... 无论如何、因为我可以!

    现在都在工作、无需我之前使用的指针到地址到指针到地址的混淆。

    布鲁诺