滴答的分辨率
如 RTOS 滴答文档页面所述,RTOS 时间
基于周期性的滴答中断。当 RTOS 任务希望等待一定的时间过去,
例如通过调用 vTaskDelay(),或等待事件发生,
例如通过在调用 xQueueReceive() 时指定阻塞时间,
任务会将最大阻塞时间(即在不使用任何 CPU 周期的情况下等待)
指定为滴答计数。宏 pdMS_TO_TICKS() 将毫秒转换为滴答计数。请求的阻塞时间始于
调用 API 时,也就是两个滴答中断之间。 滴答数是一个整数,
不能计算部分滴答周期,因此从调用 API 到下一个滴答中断之间的时间
被算作延迟(阻塞)周期的第一个滴答。这将导致在请求相同阻塞时间的不同 API 调用之间,
观察到的阻塞时间(挂钟时间)存在轻微差异。下图
以调用 vTaskDelay( 2 ) 为例,假设滴答周期为 1 毫秒,对此进行了演示。
第一张图显示的是在滴答中断后立即调用 vTaskDelay() 的情况
。观察到的阻塞时间将接近 2 毫秒(滴答 1 和滴答 2 之间的大部分时间,
加上滴答 2 和滴答 3 之间的所有时间)。
第二张图显示的是调用 vTaskDelay() 恰好发生在一个滴答中断之前的情况
。观察到的阻塞时间将略高于 1 毫秒(滴答 1 和滴答 2 之间的一小部分时间,
加上滴答 2 和滴答 3 之间的所有时间)。
通过这些示例可以看出,当指定 N 个滴答的延迟时,
实际延迟时间将始终介于((N-1)个滴答 * 滴答周期)和(N 个滴答 * 滴答周期)之间。对于这个具体的例子,
这意味着总延迟时间在 1.0000000001 毫秒和 1.99999999999 毫秒之间。
关于延迟时间的几个重要注意事项:
-
滴答精度始终取决于作为参数指定的滴答计数,但不会少于(N-1)个滴答
。基本上,范围是从(N-1)个滴答到 N 个滴答(不包括 N 个滴答)。
-
为了保证最小延迟时间为 N,您需要延迟(N/(滴答周期))+ 1 个滴答
。
-
延迟的持续时间(以时间为单位)取决于调用延迟时 RTOS 滴答之间的时刻,
调用越接近即将到来的滴答,延迟时间就会越短。
下一节: RTOS 实现 - GCC 信号属性
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.