RTOS 中的延时叫阻塞延时,即任务需要延时的时候,任务会放弃 CPU 的使用权,CPU 可以去干其它的事情,当任务延时时间到,重新获取 CPU 使用权,任务继续运行。当任务需要延时,进入阻塞状态,CPU 就运行空闲任务。在FreeRTOS 中,空闲任务是系统在【启动调度器】的时候创建的优先级最低的任务,空闲任务主体主要是做一些系统内存的清理工作,也可以进入休眠或者低功耗等操作。
定义空闲任务栈,空闲任务的栈是一个定义好的数组,大小由 宏 configMINIMAL_STACK_SIZE 控制,默认为 128,单位为字,即 512个字节。定义空闲任务的任务控制块,任务控制块是每一个任务必须的,空闲任务的的任务控制块我们在 main.c 中定义,是一个全局变量。创建空闲任务,空闲任务在调度器启动函数 vTaskStartScheduler() 中创建。将空闲任务插入到就绪列表的开头,空闲任务默认的优先级是最低的,即排在就绪列表的开头。
2. 阻塞延时
阻塞延时的阻塞是指任务调用该延时函数后,任务会被剥离 CPU 使用权,然后进入阻塞状态,直到延时结束,任务重新获取 CPU 使用权才可以继续运行。在任务阻塞的这段时间,CPU 可以去执行其它的任务,如果其它的任务也在延时状态,那么 CPU 就将运行空闲任务。阻塞延时函数vTaskDelay ()函数,通过 xTicksToDelay 设置当前任务的延时时间,切换任务。xTicksToDelay 是任务控制块的一个成员,用于记录任务需要延时的时间,单位为 SysTick 的中断周期。