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(); /* 开启任务调度*/