FreeRTOS 空闲任务

一、简介

        FreeRTOS 会自动创建一个空闲任务,这样就可以确保系统中永远都至少有一个正在被执行的任务。空闲任务是以系统中最低的任务优先级被创建的,这样可以确保空闲任务不会占用其他就绪态任务的被执行时间。当有任务被函数 vTaskDelete()函数删除时,如果函数 vTaskDelete()的调用者与被删除任务不是同一个任务,那么被删除任务的删除工作可以由函数 vTaskDelete()的调用者完成。如果vTaskDelete()的调用者和被删除任务为同一个任务,即一个任务调用函数 vTaskDelete()删除了自身,那么删除工作是不能完全由任务本身完成的,因此这项删除任务自身的工作就交给了空闲任务,也正因如此,如果在任务中调用了函数 vTaskDelete()删除了自身,那么就必须要保证最低任务优先级的空闲任务能够被分配到运行时间

        FreeRTOS系统中,一旦启动,必须保证系统中每时每刻都有一个任务处于运行态,并且空闲任务不可以被挂起与删除,且空闲任务的优先级是最低的。

二、vTaskStartScheduler( void )函数

#ifndef portPRIVILEGE_BIT
#define portPRIVILEGE_BIT  ( ( UBaseType_t ) 0x00 )
#endif

void vTaskStartScheduler( void )
{
	BaseType_t xReturn;
	//此宏用于启用静态方式管理内存,当静态、动态内存管理方式同时被启用时,优先使用静态方式管理内存
	#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
	{
		StaticTask_t * pxIdleTaskTCBBuffer = NULL;
		StackType_t * pxIdleTaskStackBuffer = NULL;
		uint32_t ulIdleTaskStackSize;
		
		//获取空闲任务所需内存空间,此函数由用户实现,即使用静态方式管理内存,任务创建时需要的内存空间由用户手动分配并提供
		vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer,&pxIdleTaskStackBuffer,&ulIdleTaskStackSize);
		
		//使用静态方式创建空闲任务
		xIdleTaskHandle = xTaskCreateStatic(prvIdleTask,  				//任务函数 
											configIDLE_TASK_NAME, 		//任务名
											ulIdleTaskStackSize,  		//任务栈大小
											(void *) NULL, 				//任务函数参数
											portPRIVILEGE_BIT, 			//任务优先级 
											pxIdleTaskStackBuffer, 		//任务栈 
											pxIdleTaskTCBBuffer); 		//任务控制块 
		
		if( xIdleTaskHandle != NULL )
		{
			xReturn = pdPASS;
		}
		else
		{
			xReturn = pdFAIL;
		}
	}
	#else
	{
		/* 使用动态方式创建空闲任务 */
		xReturn = xTaskCreate( 	prvIdleTask, 				 //任务函数
								configIDLE_TASK_NAME, 		 //任务名
								configMINIMAL_STACK_SIZE,	 //任务栈大小 
								( void * ) NULL,  			 //任务函数参数
								portPRIVILEGE_BIT, 			 //任务优先级
								&xIdleTaskHandle); 			 //任务句柄 
	}
	#endif
	/* 其他代码省略 */
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值