当条件仍为 true 时,循环停止

while loop stops when condition is still true

提问人:Wesley Kienhuis 提问时间:7/21/2022 最后编辑:Wesley Kienhuis 更新时间:7/21/2022 访问量:116

问:

我有以下代码:

void EXTI_Main(uint8_t mult)//range 1-4(inclusive)
{
    uint16_t minimum = 200 * mult;
    while(TMR3_GetTick() < minimum);
    printf("mult:%hhu\ttick:%hu\tminimum:%hu\r\n", mult, TMR3_GetTick(), minimum);
    //RF_Main();
    LCD_Read();
    
}

输出如下:(不知道如何使 blockquote 与换行符一起使用)

mult:0  tick:0  minimum:0
mult:1  tick:414        minimum:200
mult:2  tick:453        minimum:400
mult:3  tick:600        minimum:600
mult:4  tick:800        minimum:800
mult:0  tick:0  minimum:0
mult:1  tick:414        minimum:200
mult:2  tick:453        minimum:400
mult:3  tick:600        minimum:600
mult:4  tick:768        minimum:800
mult:0  tick:0  minimum:0
mult:1  tick:414        minimum:200
mult:2  tick:453        minimum:400
mult:3  tick:512        minimum:600
mult:4  tick:768        minimum:800
mult:0  tick:0  minimum:0

TMR3.C 中的相关代码:

static volatile uint16_t msTick;//incremented using ISR
uint16_t TMR3_GetTick(void)
{
    return msTick;
}

为什么这会导致问题 mult == 3 |4? 挥发性是问题吗??我一直在阅读有关如何使用易失性变量的信息,但无法确定这是否是问题的一部分。

请询问是否需要更多信息。 谢谢。

编辑:idk,如果它有帮助,但是当它们失败时,3和4始终是512(256 * 2)和768(256 * 3)

EDIT2:解决方案原来是:

uint16_t tock; while((tock = TMR3_GetTick()) < minimum);
C while 循环 嵌入 易失 布尔逻辑

评论

5赞 Weather Vane 7/21/2022
将结果保存在局部变量中:当您再次调用它以报告其值时,它可能已经移动了。 然后报告而不是另一个电话。TMR3_GetTick()uint16_t tock; while((tock = TMR3_GetTick()) < minimum);tock
4赞 Jonathon S. 7/21/2022
不确定您使用的是什么 CPU,但您应该确保读取 16 位值是原子操作(即需要使用单个指令读取用于的 16 位内存)。否则,如果在仅读取了 16 位的一半时激活,则可能会将更新和递增的上字节与较旧的下字节组合在一起,反之亦然。如果需要,您可以通过在阅读时暂时禁用 ISR 来避免这种情况。msTickTMR3_GetTick()EXTI_Main()TMR3_GetTick()msTick
1赞 Eugene Sh. 7/21/2022
嗨,我有 95% 的把握我已经尝试过了,但没有用。- 然后展示你尝试过什么。目前,此代码的行为不是确定性的。
2赞 interjay 7/21/2022
事实上,512 和 768 的“错误”值都将较低的 8 位设置为 0,这表明@JonathonS。关于单独更新的两个字节可能是正确的。在这种情况下,将结果放在局部变量中只会隐藏问题而不是解决问题。
1赞 Weather Vane 7/21/2022
如果您想知道导致结束的确切值,您仍应将其保存为局部变量。while

答:

2赞 Wesley Kienhuis 7/21/2022 #1

在评论中向我的男人 Weather Vane 大喊大叫。

取代:

 while(TMR3_GetTick() < minimum);

跟:

uint16_t tock; while((tock = TMR3_GetTick()) < minimum);