FreeRTOS开发二、如何使用vTaskDelay对任务延时准确的时间

FreeRTOS中的时间和tick之间的转换

在FreeRTOS中,有时候需要阻塞task一段时间,或者是队列等需要等待一定的时间,通常这些函数中的相关的参数,都是使用tick数来表示的,显然tick数和时间之间还存在不一致。即使同样的tick,如果系统工作的频率不同,那么其时间也是不一样的,如果A配置的频率是B的两倍,则使用相同tick时,B实际的时间是A的两倍。

但是我们更多的是使用物理时间,例如一个简单的翻转,可能需要500ms,而不关心系统到底被配置为多少的频率,这个情况下,我们可以使用FreeROS提供的宏来实现,通常有两种方法,但是本质上是一样的。

1、portTICK_RATE_MS

这个在FreeROS.h中被定义为:

#define portTICK_RATE_MS              portTICK_PERIOD_MS

然后跟踪portTICK_PERIOD_MS发现在portmacro.h中被定义为:

#define portTICK_PERIOD_MS    ( ( TickType_t ) 1000 / configTICK_RATE_HZ )

然后继续跟踪可以知道configTICK_RATE_HZ是在FreeRTOSConfig.h中定义的:

#define configTICK_RATE_HZ                    ((TickType_t)1000)

configTICK_RATE_HZ其含义是1秒钟TICK中断产生的次数,因为FreeRTOS使用Tick终端进行调度,这个频率越高则定时的精度越高,但是由此带来的系统开销也越大。
知道了这个宏定义以后,我们就可以进行时间的换算了,例如我们想演示500ms,则可以使用:

vTaskDelay(500/portTICK_RATE_MS);

2、 pdMS_TO_TICKS

这是一个带参数的宏,其实本质上就是把上面的那个公式进行了一次封装,将毫秒数换算成了tick数,projdefs.h中的宏定义:

#ifndef pdMS_TO_TICKS
    #define pdMS_TO_TICKS( xTimeInMs )    ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000U ) )
#endif

例如我们上面把500/portTICK_RATE_MS进行展开,其实就是500*configTICK_RATE_HZ/1000了

所以上面的延时也可以写成:

vTaskDelay(pdMS_TO_TICKS(500));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值