FreeRTOS 笔记之⑥:空闲任务与阻塞延时的实现

本文详细介绍了FreeRTOS中的空闲任务实现,包括其在系统启动时的创建和作为低功耗操作的用途。同时,文章深入解析了阻塞延时的实现,通过vTaskDelay()函数、vTaskSwitchContext()的任务切换以及SysTick中断服务函数的角色。在SysTick初始化后,任务延时以中断周期为单位递减,确保CPU资源的有效利用。
摘要由CSDN通过智能技术生成

目录

1. 空闲任务实现

2. 实现阻塞延时

2.1 vTaskDelay ()函数

2.2 vTaskSwitchContext()函数

2.3 SysTick中断服务函数

2.4 SysTick初始化函数


之前的章节中,任务体内的延时使用的是软件延时,即还是让CPU空等来达到延时的效果。使用RTOS的很大优势就是榨干CPU的性能,永远不能让它闲着,任务如果需要延时也就不能再让CPU空等来实现延时的效果。

RTOS中的延时叫阻塞延时,即任务需要延时的时候,任务会放弃CPU的使用权,CPU可以去干其它的事情,当任务延时时间到,重新获取CPU使用权,任务继续运行,这样就充分地利用了CPU的资源,而不是干等着。

当任务需要延时,进入阻塞状态,那CPU又去干什么事情了?如果没有其它任务可以运行,RTOS都会为CPU创建一个空闲任务,这个时候CPU就运行空闲任务。在FreeRTOS中,空闲任务是系统在【启动调度器】的时候创建的优先级最低的任务,空闲任务主体主要是做一些系统内存的清理工作。

但是为了简单起见,我们本章实现的空闲任务只是对一个全局变量进行计数。

鉴于空闲任务的这种特性,在实际应用中,当系统进入空闲任务的时候,可在空闲任务中让单片机进入休眠或者低功耗等操作。

1. 空闲任务实现

目前我们在创建任务时使用的栈和TCB都使用的是静态的内存,即需要预先定义好内存,空闲任务也不例外。有关空闲任务的栈和TCB需要用到的内存空间均在main.c中定义。

/* 定义空闲任务的栈 */
StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];

/* 定义空闲任务的任务控制块 */
TCB_t IdleTaskTCB;


void vTaskStartScheduler( void )
{
/*======================================创建空闲任务start==============================================*/     
    TCB_t *pxIdleTaskTCBBuffer = NULL;               /* 用于指向空闲任务控制块 */
    StackType_t *pxIdleTaskStackBuffer = NULL;       /* 用于空闲任务栈起始地址 */
    uint32_t ulIdleTaskStackSize;
    
    /* 获取空闲任务的内存:任务栈和任务TCB */
    vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, 
                                   &pxIdleTaskStackBuffer, 
                                   &ulIdleTaskStackSize );    
    
    xIdleTaskHandle = xTaskCreateStatic( (TaskFunction_t)prvIdleTask,              /* 任务入口 */
					                     (char *)"IDLE",                           /* 任务名称,字符串形式 */
					         
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值