2

我是微控制器 C 编程的新手,在使用嵌套循环时遇到了一些问题。以下是我在 C 代码中的示例构造。问题后面会提到

// I am trying to ramp down the while loop
while (i>= stop_value)
{
    step_value = default_value;
    R32(a particular register, content_register);
    if (content_register = a_set_value)
    {
        if( step_value <= step_max)
        {
            step_value = step_value +1;
            i=start_value;
            continue;
        }
        if(step_value =step_max)
        {
            // do something;
            break;
        }
    }
    WR32(a particular register, content_reset_register); // resetting the register
    i=i-1;
}

基本上,我正在尝试执行以下操作:降低循环直到它达到 stop_value 并在降低时读取特定寄存器。如果寄存器有定义的值,则检查 step_value <= step_max。如果 step_value < step_max 然后使用 continue 语句重置 while 循环,并将 i 设置为初始起始值。此时,我的 step_value 应该是最新的值,而不是默认的 step 值。我确实明白上面的代码对于 step_value 并不完全正确,因为我将 step_value 初始化为 default_value。(那么,我如何修改初始 step_value = default_value 语句,以便在第一次执行循环时,我有一个 default_value,随后是最新的step_value?)但是,如果 step_value 等于我的 step_max 则只需做一些事情并随后中断(这部分有效!)。还,

所以,我想用最新的step_value有效地重置while循环,当我的step_value小于step_max时,寄存器的内容会重置吗?谢谢您的回复!

4

2 回答 2

1

我假设至少适用以下替代方案之一:

首先,在C语言=中是一个赋值,它返回所分配的值,如果该值不等于则假定为真0。因此,您必须== 在所有 if 语句中使用而不是=(除非它是您在 if 语句中一步分配并检查 != 0 的期望行为 - 但即使在这种情况下,我更愿意分两步执行此操作更好的可维护性),即代替

if (content_register = a_set_value)
    {
            // your code
    }

我会说

content_register = a_set_value;
if (content_register!=0)
    {
            // your code
    }

以更清楚地说明您要检查的内容。

其次,如果step_value==step_max(并且您==在 2nd 中正确使用if)然后执行两个 IF,这不是您想要的。所以你我假设你的意思是<而不是<=

第三,从我们的聊天中,我从您那里得知循环正在等待来自外部线程的寄存器更改。在这种情况下,循环重置寄存器太快了。考虑同步或至少在重置寄存器后添加线程休眠以允许其他线程更改寄存器。

改变它,看看它是否有效。

于 2013-04-09T15:36:21.680 回答
1

在这段代码中:

   if( step_value <= step_max)
    {
        step_value = step_value +1;
        i=start_value;
        continue;
    }
    if(step_value =step_max)
    {
        // do something;
        break;
    }

第二个如果永远无法达到。您正在检查 <= 然后使用 continue 跳到循环的底部。

根据您的上述逻辑:

然后检查 step_value <= step_max。如果 step_value < step_max 然后使用 continue 语句重置 while 循环,并将 i 设置为初始起始值。

该代码可能应该是:

   if( step_value < step_max)
    {
        step_value = step_value +1;
        i=start_value;
        continue;
    }
    ...

然后可以评估第二个 if 。这应该会生成编译器警告,就像在 if 语句中无法访问代码和赋值一样疯狂。请打开您的编译器警告并听取它们!

于 2013-04-09T16:39:32.903 回答