vTaskDelayUntil 任务绝对延时

2018-07-22 14:12 更新

vTaskDelayUntil

函数名 :vTaskDelayUntil 头文件 :task.h 函数功能:任务绝对延时 函数声明:

void vTaskDelayUntil( portTickType *pxPreviousWakeTime, portTickTypexTimeIncrement );

INCLUDE_vTaskDelayUntil 必须定义为 1以使能此函数。见configuration 章节获得更多信息。 延迟任务直到一个指定的时间结束。该函数用在周期性任务以保证任务执行频率的稳定。 与上vTaskDelay 不同的是该任务指定绝对时间,vTaskDelay指定相对时间。 (笔者注释:原文接下来两小段反复解释为什么一个是相对时间一个是绝对时间,翻译 省略,后续笔者会描述。) 必须注意,vTaskDelayUntil() 会立即返回(没有阻塞)如果它用来指定一个已经过去 的唤醒时间。所以任务用vTaskDelayUntil() 来执行周期必须重新计算它需要的唤醒时间, 如果该周期执行由于任何导致任务丢失 1个或者多个周期的理由被打断(比如该任务被挂 起) 这可以由检查pxPreviousWake 传递的变量与当前的时间封计数器来做比较检测到。在 大多数情况这不是必须的的。 常量portTICK_RATE_MS 可以用来计算时间封的实际时间间隔。 当调度器由于应用调用vTaskSuspendAll()导致挂起(调度器暂停),不能调用此函数。 具体参数 pxPreviousWakeTime :上一次唤醒的时间计数器。 xTimeIncrement :间隔周期计数器。 (笔者注释:如果有写过以定时器方式查询按键,去抖动等程序,或者看过 PIC591键盘程序的用户,对这两个参数的作用应当很容易从直观上理解。对于所有的 RTOS,都有一个时间封(心跳时间),需要靠经过设置后能提供周期性中断功能的定时器来实现,而当 RTOS发动时,将有一个计数器来计数这是第几次定时中断,这个计数器一般只会自然溢出,即达到最大值后归0。读这个计数器的值,就等于了解了从FRTOS开始运行,到当下,经历了多少时间间隔(不考虑归0),而所谓的绝对延时,就是只关心上一次的计数器时间 pxPreviousWakeTime,以及经历多长时间 xTimeIncrement后完成定时。至于计数器溢出,不会影响什么,只要这两个参数与系统的计数器的数据类型一致,又都采用自然溢出方式计算就可以。) 范例:

// Perform an action every 10 ticks.
void vTaskFunction( void * pvParameters )
{
    portTickType xLastWakeTime;
    const portTickType xFrequency = 10;
    // Initialise the xLastWakeTime variable with the current time.
    xLastWakeTime = xTaskGetTickCount();
    for( ;; )
    {
        // Wait for the next cycle.
        vTaskDelayUntil( &xLastWakeTime, xFrequency );
        // Perform action here.
    }
}
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号