裸机系统的软件延时通过让CPU等待来达到延时效果;而RTOS的优点就是完全发挥CPU的性能,即使延时也不会让CPU空等。操作系统的延时叫做阻塞延时,当任务需要延时的时候,任务会放弃CPU的使用权,直到延时结束,重新获得CPU进行运行。在延时期间,CPU可以处理其他的事情。
在当前任务进入阻塞状态时,CPU可以去处理别的任务。假如当前没有别的任务可运行,CPU就会进入系统创建的空闲任务。空闲任务在调度器里是优先级最低的任务,其主体主要是做一些系统内存的清理工作。在实际应用中,当系统进入空闲任务后,可以让单片机进入休眠或者低功耗等操作。
这里野火让空闲任务实现对一个全局变量进行计数的功能。
实现空闲任务
目前创建栈和任务控制块都是静态创建,使用静态内存。因此,需要预先定义内存空间。
定义空闲任务栈和任务控制块
栈和TCB的内存空间均在main.c中定义。
任务栈是一个定义好的数组,大小由 FreeRTOSConfig.h 中定义的宏 控制,默认为 128, 单位为字(byte),即 512 个字节(bit)。
/* 定义空闲任务的栈 */
/* 在FreeRTOSConfig.h中定义 */
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 )
/* 获取空闲任务的内存 */
/* 在main.c中定义 */
StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
TCB_t IdleTaskTCB; //定义空闲任务发任务控制块
创建任务
在定义好空闲任务的栈和任务控制块后,才可以创建空闲任务。空闲任务在调度器启动函数 vTaskStartScheduler()中创建。
该部分在task.c中实现。
extern TCB_t IdleTaskTCB;
/* 传参函数声明 */
void vApplicationGetIdleTaskMemory( TCB_t **ppxIdleTaskTCBBuffer,
StackType_t **ppxIdleTaskStackBuffer,
uint32_t *pulIdleTaskStackSize );
void vTaskStartScheduler( void )
{
TCB_t *pxIdleTaskTCBBuffer = NULL; /* 用于指向空闲任务控制块 */
StackType_t *pxIdleTaskStackBuffer = NULL; /* 用于空闲任务栈起始地址 */
uint32_t ulIdleTaskStackSize;
/* 获取空闲任务的内存:任务栈和任务TCB */
vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer,

本文介绍了如何在FreeRTOS环境中创建空闲任务,管理任务延时,特别是通过SysTick实现阻塞延时,并在任务切换时处理空闲任务和延时任务的调度。
最低0.47元/天 解锁文章
1872





