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.

[参考译文] TM4C123GH6PM:while 条件不起作用

Guru**** 2461030 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/655014/tm4c123gh6pm-while-condition-does-not-work

器件型号:TM4C123GH6PM

你(们)好

我正在调试 此代码、当我第一次到达黄线时、计数器小于结束、但即使在计数器>结束后、计数器仍保持不变。 我尝试在 while 中添加 if 语句、但似乎编译器会忽略它、我无法在此行添加断点。

这很奇怪。 问题出在哪呢?

我在 launchpad 上运行它、结果相同

void
o_timersQ_delay2 (DWORD 延迟)//in msec
{
DWORD End、start = SysTick _counter;

end = SysTick _counter +(delay /SysTick _per); //如果

(结束>开始)
{
while (SysTick 计数器<结束)//在常规情况下//由于某种原因它不起作用
{
如果(SysTick 计数器>结束)中断;
},则查找延迟结束时计数器应该是什么
}
else//结束在溢出后
{
if (SysTick 计数器>= start)//直到溢出
(SysTick 计数器>结束);
else //结束在溢出
时(SysTick 计数器<结束);
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、我无法识别该代码。 在哪里定义了"SysTick 计数器"、它在哪里递增? 如果在中断例程中更新了"SysTick _counter"、则必须将其声明为 volatile。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正如 Bob 提到的、如果在代码的不同部分更改变量的值、请确保变量是易失的。

    此外、为了获得更真实的调试体验、请关闭所有优化-然后您将能够在所需的位置添加断点。

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

    [引用 user="Bruno Saraiva"]为了获得更真实的调试体验,请关闭所有优化[/引用]

    很抱歉、Bruno、这是一个不太现实的调试体验、而不是更多。 您应该使用您在中发布的相同优化进行调试。

    如果在特定的 C drop 行上设置断点时遇到问题、请将其放入汇编语言并在此处断开。

    侧注:在这种情况下、优化很可能会导致不同的代码。 但这取决于编译器。

    Robert

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

    没错、接受更正! 也许我应该说"更线性化"、而不是"更现实"。。

    为避免进一步读取器产生混淆:在评估编程逻辑时、关闭所有优化的调试将更加方便。

    您在其他地方评论并完全同意、另一件事是避免使用两种不同的项目设置(遗憾的是、许多 TI 示例都是这样):一种用于调试、另一种用于发布。

    至于"优化导致不同的代码"、我看到这种情况发生了很多。 我最近创建的一个函数用于转置字节、这些字节基本上有两个嵌套用于循环。 经过优化和未经过优化的程序周期计数将4倍更改为"视觉上非常线性和小代码段"!

    此致

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

    [引用 USER="Bruno Saraiva"]为避免读者混淆:在评估编程逻辑时,关闭所有优化的调试将更加方便。

    但它只是混淆了事情的情况除外。 该线程中的原始代码具有相当高的可能在不同的优化级别上表现不同的值。 所有行为都是正确的。 我认为在调试过程中关闭优化是没有意义的。 这就导致了这样一种想法、即代码由于优化错误而失败、而这仅仅是您对故障代码的理解。 问题是这种情况相当普遍,并非总是被初学者所认识。

    所以初学者永远不应该这样做,当他们成为足够的专家来识别他们不需要这样做的条件时,他们也会意识到他们并不总是能够识别这些条件。

    [引用 user="Bruno Saraiva">我最近创建的一个函数用于转置字节、这些字节基本上有两个嵌套的循环。 经过优化和未经过优化的程序周期计数将4倍更改为"视觉上非常线性和很小的代码段"!

    小代码段中更可能发生剧烈变化。 但是、如果您考虑它、"不同代码中的优化结果"是一种自动方法。 当然、这是它应该做的事情。

    Robert