硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3538|回复: 1
收起左侧

[HAL] 使用HAL_Delay,注意HAL_Delay(0)表示0.xms,HAL_Delay(1)表示1.xms,依次类推

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2021-2-24 08:48:40 | 显示全部楼层 |阅读模式
默认情况下,我们设置的滴答定时器都是1ms为单位,HAL_Delay也是以这个为时基执行的。

为了保证最小执行时间,HAL库里面直接对这个函数做了+1操作。

QQ图片20210224084042.png

由于我们调用HAL_Delay的时刻不定,所以这个函数是无法保证1ms的精度,误差1ms。

HAL_Delay(0)  延迟时间范围0 - 1ms
HAL_Delay(1)  延迟时间范围1 - 2ms
HAL_Delay(2)  延迟时间范围2 - 3ms
。。。。。。。
。。。。。。。

以此类推


回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2023-10-19 13:50:27 | 显示全部楼层
本帖最后由 caicaptain2 于 2023-10-19 14:02 编辑

这是个有趣的现象,以前从未想到HAL_Delay()可以设定为数值0。
我今天在任务中调用HAL_Delay()就遇到了。 在FreeRTOS任务函数的同一个位置,调用HAL_Delay(0) 等效于osDelay(1),延时时间是0.x毫秒。

而且,这个x的数值与它在任务函数中的位置有关系。
如果是在任务函数的刚开始的阶段调用HAL_Delay(0) 或osDelay(1),延时时间就比较接近于1ms。可以认为刚进入任务函数时,起点时间就是0.0毫秒。
如果是在任务函数的中间调用它们,延时时间就比较随机了。比如任务函数经过一段数值计算后,再调用延时这种情况。但是都处于0~1毫秒之间。因为此时延时的起点时间是个大约随机的0.y毫秒。


另外,由于只是需要延时1ms左右,osDelay(1)的时间也无法给其他任务使用。所以说HAL_Delay(0) 等效于osDelay(1)意义相同。
还有个考虑,HAL_Delay()的计时来自于TIM11(cubemx的配置) ,RTOS的osDelay(1)计时来自于systick。这2个定时器的启动时间有所不同,也可能带来一些区别吧。我这个实验中,HAL的初始化和任务调度器运行之间只有几个外设的初始化,可以认为启动时间在毫秒尺度上几乎一致,才会有开头的结论。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 10:17 , Processed in 0.156006 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表