freeRTOS---空闲任务与阻塞延时(1)

在上传这篇文章的时候,同时也上传了代码,欢迎下载!

RTOS中的延时是在需要延时的时间内任务放弃CPU的使用权,超过延时时间后重新获得CPU的使用权。叫做:阻塞延时。

**空闲任务是在启动调度器后创建的,是CPU空闲时候运行的,是优先级最低的。空闲任务主要做一些清理内存的的任务。**空闲任务是不允许阻塞的。
如何实现空闲任务?
1.在main.c定义空闲任务栈。
首先在freeRTOS中定义空闲任务栈最小的任务栈大小(单位是 :字):

#define configMINIMAL_STACK_SIZE             ((unsigned short)  128)  //单位是 字

然后在main.c中获取空闲任务的内存:

// 获取空闲任务的内存
StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];

2.main.c中定义空闲任务的任务控制块。

TCB_t IdleTaskTCB;

Idle 是空闲的意思。

3.在task.c中定义空闲任务函数主体。

#define portTASK_FUNCTION(prvIdleTask,  pvParameters)   void vFunction(void *pvParameters)
static portTASK_FUNCTION(prvIdleTask,  pvParameters)
{
    // 禁止编译的警告
	  (void)pvParameters;
	  for(;;)
	 {
	     // 空闲任务暂时什么什么都不做
	 }
}	

4.在task.c的调度器函数中创建空闲任务。

void vTaskStartScheduler(void)   // 调度器函数
{
	  // 创建空闲任务开始
	  TCB_t *pxIdleTaskTCBBuffer = NULL;            // 用于指向空闲任务控制块
	  StackType_t *pxIdleTaskStackBuffer = NULL;   // 用于空闲任务栈起始地址
	  uint32_t ulIdleTaskStackSize;
	  
	  // 获取空闲任务的内容
	  vApplicationGetIdleTaskMemory(&pxIdleTaskTCBBuffer,  
	                                &pxIdleTaskStackBuffer, 
	                                &ulIdleTaskStackSize  
	                                );
	
	  xIdleTaskHandle = xTaskCreateStatic((TaskFunction_t)prvIdleTask,   //任务入口
	                                      (char *)"IDLE",                //任务名称,字符串形式
																				(uint32_t)ulIdleTaskStackSize, //任务栈大小,单位为字
																				(void *)NULL,                  // 任务形参
																				(StackType_t *)pxIdleTaskStackBuffer, // 任务栈起始地址
																				(TCB_t *)pxIdleTaskTCBBuffer //任务控制块
	                                     );
	  // 将任务添加到就绪列表
		vListInsertEnd(&(pxReadyTasksLists[0]),&(((TCB_t *)pxIdleTaskTCBBuffer)->xStateListItem));
	   // 创建任务函数结束
	 
    // 手动指定第一个运行的任务
	  pxCurrentTCB = &Task1TCB;
	
	  // 启动调度器
	  if(xPortStartScheduler() != pdFALSE)
		{
		    // 调度器启动成功,否则返回,即不会来到这里
		}
}

在main.c中定义:

void vApplicationGetIdleTaskMemory(TCB_t **ppxIdleTaskTCBBuffer,  
	                                StackType_t **ppxIdleTaskStackBuffer, 
	                                uint32_t *pulIdleTaskStackSize  
	                                )
{
    *ppxIdleTaskStackBuffer = &IdleTaskTCB;
	  *ppxIdleTaskStackBuffer = IdleTaskStack;
	  *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}	

在task.c中声明空闲任务的句柄;

static TaskHandle_t xIdleTaskHandle   =    NULL;

并且在task.c中声明:

extern void vApplicationGetIdleTaskMemory(TCB_t **ppxIdleTaskTCBBuffer,  
	                                StackType_t **ppxIdleTaskStackBuffer, 
	                                uint32_t *pulIdleTaskStackSize  
	                                );	                          

在task.c中声明:

#define portTASK_FUNCTION(vFunction,pvParameters) void vFunction(void *pvParameters)

写函数:

//空闲任务就是在这个函数中实现。
static portTASK_FUNCTION(prvIdleTask,  pvParameters)
{
    // 禁止编译的警告
	  (void)pvParameters;
	  for(;;)
	 {
	     // 空闲任务暂时什么什么都不做
	 }
}	

注意声明的位置。我写代码的时候很多次因为声明的位置上不正确而报错。

如果有错误,欢迎批评指正!
欢迎交流学习!

完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值