关于STM32的HAL库中超时函数中的tick溢出后产生的问题的思考及求证

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/eibo51/article/details/53615060
命题:

引用变量及函数:

__IO uint32_t uwTick;
__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

 源代码:

__weak void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t tickstart = 0;
  tickstart = HAL_GetTick();
  while((HAL_GetTick() - tickstart) < Delay)
  {
  }
}
求证:

如下假设:

由题设可知: 当每个时间Tick(滴答时钟)  到来时uwTick加1;

需要延时Delay = 0x0D;

此时 获得 tickstart = 0xFFFF FFFF - 0x0A==》因此可知此时 uwTick = 0xFFFF FFFF - 0x0A;

经过0x0B次滴答时钟后,uwTick =  0xFFFF FFFF - 0x0A + 0x0B) = 0x1 0000 0000==》此时数据溢出uwTick = 0;

(uint32_t)uwTick - (uint32_t)(tickstart)=  0x00 -  (0xFFFF FFFF - 0x0A)  = 0x00 +  (uint32_t) 0xA - 0xFFFF FFFF = (uint32_t) 0x ‭FFFFFFFF00000001‬ = 0x01;

滴答时钟再加(+)1;

(uint32_t)uwTick - (uint32_t)(tickstart)=  0x01 -  (0xFFFF FFFF - 0x0A)  = 0x01 -  (uint32_t) 0xA - 0xFFFF FFFF = (uint32_t) 0x ‭FFFFFFFF00000002‬ = 0x02;

再(+)1;

(uint32_t)uwTick - (uint32_t)(tickstart)=  0x01 -  (0xFFFF FFFF - 0x0A)  = 0x02 -  (uint32_t) 0xA - 0xFFFF FFFF = (uint32_t) 0x ‭FFFFFFFF00000003‬ = 0x03;

…… 继续累加到0xD

(uint32_t)uwTick - (uint32_t)(tickstart)=  0x0D-  (0xFFFF FFFF - 0x0A)  = 0x0D -  (uint32_t) 0xA - 0xFFFF FFFF = (uint32_t) 0x ‭FFFFFFFF00000003‬ = 0x0D;

延时时间到

(HAL_GetTick() - tickstart) = uwTick - tickstart = 0x0D ==》等于要求的延时 Delay = 0x0D ,定时到退出while循环;

从而显然可知:

当Tick溢出为0后,变为:(0 - tickstart ) > Timeout,一个负数会大于一个正数么? 系统Tick频率设置为1毫秒中断一次,那么0xFFFFFFFF毫秒大约为49.71026961805556天,也就是49天以后会产生第一次溢出

不成立

后记

延时时间Delay不能超过溢出数据类型的最大长度,否则while将永远的循环;


参考内容:

1.、http://www.stmcu.org/module/forum/thread-605615-1-1.html


wiwa 2016.12.13


展开阅读全文

没有更多推荐了,返回首页