FreeRTOS创建静态任务

1、配置FreeRTOSConfig.h

/*****************************************************************
              FreeRTOS与内存申请有关配置选项                                            
*****************************************************************/
//支持动态内存申请
#define configSUPPORT_DYNAMIC_ALLOCATION        1    
//支持静态内存
#define configSUPPORT_STATIC_ALLOCATION					1					
//系统所有总的堆大小(单位:字,32位则是四个字节)
#define configTOTAL_HEAP_SIZE					((size_t)(36*1024))    

2、实现函数

/**
  **********************************************************************
  * @brief  获取空闲任务的堆栈和任务控制块内存
	*					ppxTimerTaskTCBBuffer	:		任务控制块内存
	*					ppxTimerTaskStackBuffer	:	任务堆栈内存
	*					pulTimerTaskStackSize	:		任务堆栈大小
  * @author  fire
  * @version V1.0
  * @date    2018-xx-xx
  **********************************************************************
  */ 
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, 
								   StackType_t **ppxIdleTaskStackBuffer, 
								   uint32_t *pulIdleTaskStackSize)
{
	*ppxIdleTaskTCBBuffer=&Idle_Task_TCB;/* 任务控制块内存 */
	*ppxIdleTaskStackBuffer=Idle_Task_Stack;/* 任务堆栈内存 */
	*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;/* 任务堆栈大小 */
}

/**
  *********************************************************************
  * @brief  获取定时器任务的任务堆栈和任务控制块内存
	*					ppxTimerTaskTCBBuffer	:		任务控制块内存
	*					ppxTimerTaskStackBuffer	:	任务堆栈内存
	*					pulTimerTaskStackSize	:		任务堆栈大小
  * @author  fire
  * @version V1.0
  * @date    2018-xx-xx
  **********************************************************************
  */ 
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, 
									StackType_t **ppxTimerTaskStackBuffer, 
									uint32_t *pulTimerTaskStackSize)
{
	*ppxTimerTaskTCBBuffer=&Timer_Task_TCB;/* 控制任务卡=块内存 */
	*ppxTimerTaskStackBuffer=Timer_Task_Stack;/* 控制任务块大小 */
	*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;/* 任务堆栈大小 */
}
/**
  *********************************************************************
  * @brief  APP任务创建
  * @author  
  * @version V1.0
  * @date    2018-xx-xx
  **********************************************************************
  */ 
static void AppTaskCreate(void)
{
  taskENTER_CRITICAL();           //进入临界区

  /* 创建LED_TASK 任务 */
	LED_Task_Handle = xTaskCreateStatic((TaskFunction_t	)LED_Task,		//任务函数
															(const char* 	)"LED_Task",		//任务名称
															(uint32_t 		)128,					//任务堆栈大小
															(void* 		  	)NULL,				//传参
															(UBaseType_t 	)4, 				//任务优先级
															(StackType_t*   )LED_Task_Stack,	//任务堆栈
															(StaticTask_t*  )&LED_Task_TCB);	//任务控制块
	
	if(NULL != LED_Task_Handle)/* 创建成功 */
		printf("LED_Task任务创建成功!\n");
	else
		printf("LED_Tas任务创建失败!\n");
	
  vTaskDelete(AppTaskCreate_Handle); //删除App_task任务
  
  taskEXIT_CRITICAL();            //退出临界区
}
/**
  *********************************************************************
  * @brief LED_TASK任务
  * @author  
  * @version V1.0
  * @date    2018-xx-xx
  **********************************************************************
  */ 
  static void LED_Task(void* parameter)
{	
    while (1)
    {
        HAL_GPIO_WritePin(LD1_GPIO_Port, LD1_Pin, (GPIO_PinState)SET);
        vTaskDelay(500);   /* 延时500个tick */
        printf("LED_Task Running,LED1_ON\r\n");
        
        HAL_GPIO_WritePin(LD1_GPIO_Port, LD1_Pin, (GPIO_PinState)RESET);   
        vTaskDelay(500);   /* 延时500个tick */		 		
        printf("LED_Task Running,LED1_OFF\r\n");
    }
}

3、定义实体

/* AppTask 任务句柄 */
static TaskHandle_t AppTaskCreate_Handle;
/* LED_TASK 任务句柄 */
static TaskHandle_t LED_Task_Handle;		

/* AppTask任务堆栈 */
static StackType_t AppTaskCreate_Stack[128];
/* LED_TASK任务堆栈 */
static StackType_t LED_Task_Stack[128];
/* 空闲任务堆栈*/
static StackType_t Idle_Task_Stack[configMINIMAL_STACK_SIZE];
/* 定时任务堆栈 */
static StackType_t Timer_Task_Stack[configTIMER_TASK_STACK_DEPTH];

/* AppTask任务控制块 */
static StaticTask_t AppTaskCreate_TCB;
/* LED_TASK 任务控制块 */
static StaticTask_t LED_Task_TCB;
/* 空闲任务控制块 */
static StaticTask_t Idle_Task_TCB;	
/* 定时任务控制块 */
static StaticTask_t Timer_Task_TCB;


4、创建任务

 /* ´创建App_Task */
	AppTaskCreate_Handle = xTaskCreateStatic((TaskFunction_t	)AppTaskCreate,		//任务函数
															(const char* 	)"AppTaskCreate",		//任务名称
															(uint32_t 		)128,	// 任务堆栈大小
															(void* 		  	)NULL,				//传参
															(UBaseType_t 	)3, 	//优先级
															(StackType_t*   )AppTaskCreate_Stack,	//任务堆栈
															(StaticTask_t*  )&AppTaskCreate_TCB);	//任务控制块
	if(NULL != AppTaskCreate_Handle)/*任务创建成功 */
    vTaskStartScheduler();   /* 开启任务调度*/

你可能感兴趣的:(RTOS)