FreeRTOS延时

1、相对延时函数
将当前任务添加到阻塞列表pxDelayedTaskList,任务进入阻塞态。
vTaskDelay → prvAddCurrentTaskToDelayedList → vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) )。任务的阻塞时间更新到状态列表项xStateListItem

	xTimeToWake = xConstTickCount + xTicksToWait;

	/* The list item will be inserted in wake time order. */
	listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake );

2、绝对延时函数
将当前任务添加到阻塞列表pxDelayedTaskList,任务进入阻塞态。比相对

### FreeRTOS 延时的使用方法 #### vTaskDelay() `vTaskDelay()` 用于让任务进入阻塞态一段固定的时钟节拍数。使用示例代码如下: ```c #include "FreeRTOS.h" #include "task.h" void vTaskFunction( void *pvParameters ) { for( ;; ) { // 执行任务操作 // ... // 任务延时 100 个时钟节拍 vTaskDelay( 100 ); } } ``` 在上述代码中,任务会执行一些操作后,调用 `vTaskDelay(100)` 使任务进入阻塞态 100 个时钟节拍,然后再继续执行后续操作。 #### vTaskDelayUntil() `vTaskDelayUntil()` 用于实现周期性任务,它能保证任务以固定的周期执行。示例代码如下: ```c #include "FreeRTOS.h" #include "task.h" void vTaskFunction( void *pvParameters ) { TickType_t xLastWakeTime; const TickType_t xFrequency = 100; // 初始化上一次唤醒时间 xLastWakeTime = xTaskGetTickCount(); for( ;; ) { // 执行任务操作 // ... // 等待下一个周期 vTaskDelayUntil( &xLastWakeTime, xFrequency ); } } ``` 这里,`xLastWakeTime` 记录任务上一次唤醒的时间,`xFrequency` 是任务执行的周期。`vTaskDelayUntil()` 会根据这两个参数,确保任务每隔 `xFrequency` 个时钟节拍执行一次。 ### FreeRTOS 延时的原理 FreeRTOS延时机制基于系统时钟节拍。系统有一个定时器,以固定的频率产生时钟中断,每产生一次中断,系统的时钟节拍计数器 `xTickCount` 就会加 1。 当任务调用 `vTaskDelay()` 或 `vTaskDelayUntil()` 时,任务会被放入延时列表中,并将任务的状态设置为阻塞态。延时列表是按照任务的唤醒时间排序的链表。 调度器会在每个时钟节拍中断时检查延时列表,当发现某个任务的唤醒时间到达时,就会将该任务从延时列表中移除,并将其状态设置为就绪态,等待调度器调度执行。 例如,当任务调用 `vTaskDelay(100)` 时,任务会计算出自己的唤醒时间(当前 `xTickCount` 加上 100),然后将自己插入到延时列表中合适的位置。在后续的时钟节拍中断中,调度器会不断检查延时列表,当 `xTickCount` 达到该任务的唤醒时间时,任务就会被唤醒。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值