【发布时间】:2021-05-21 23:40:29
【问题描述】:
armcc.exe V5.06 (750) 请让我知道为什么标记为错误的代码在 val16 溢出并变得小于 start_count 时不起作用。循环不再退出。
HAL_GetTick() 返回 uint32_t(或 int)
unsigned short start_count;
unsigned short val16;
unsigned short result;
start_count = HAL_GetTick();
//This does not work
do
{
val16 = HAL_GetTick();
result = val16 - start_count;
}
while ((val16 - start_count) < 100); //this part does not work correctly
//when val16 overflows
//This works! same code logic
do
{
val16 = HAL_GetTick();
result = val16 - start_count;
}
while (result < 100);
`
【问题讨论】:
-
你为什么想要做例子#1(哪个不工作)?它正在复制
val16 - start_count计算[并依靠优化器来解决这个问题]。示例 #2 是我首先要编写的代码,那么问题是什么?您提到HAL_GetTick可以返回 32 位 [或 16 位],那么您/您将如何确定 your 变量是否可以 [仅]unsigned short或uint32_t。在任何情况下,您都有 unsigned 数量,即使使用 32 位,您也必须自己处理潜在的翻转。而且,newval - oldval不会单独这样做。 -
要处理翻转,请参阅我最近的回答:stackoverflow.com/questions/66124895/…
-
这只是一个尝试理解这一点的测试。在这种情况下,翻转在无符号算术减法中应该无关紧要,我从来不需要单独管理它。
-
如果你关心的只是算术,那就不是了。或者,短/增量间隔。但是,您有一个可以翻转的 32 位定时器/计数器。如果您需要高精度的绝对时间,您将必须关心 [per my link]。