FreeRTOS创建静态任务

    技术2022-07-11  171

    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(); /* 开启任务调度*/
    Processed: 0.026, SQL: 9