FreeRTOS常用动态任务创建。FreeRTOS 做法是在 SRAM 里面定义一个大数组,
也就是堆内存,供 FreeRTOS 的动态内存分配函数使用,在第一次使用的时候,系统会将
定义的堆内存进行初始化,这些代码在 FreeRTOS 提供的内存管理方案中实现(heap_1.c、
heap_2.c、 heap_4.c 等)
在使用动态创建任务时
必须关闭宏定义 configSUPPORT_STATIC_ALLOCATION
同时打开宏定义 configSUPPORT_DYNAMIC_ALLOCATION
动态任务创建要比静态任务创建简单得多,只需要创建认任务句柄,然后创建任务,判返回值即可。
完整功能demo main.c如下
#include "stm32f10x.h"
#include "EXC_Gpio.h"
#include "EXC_Usart.h"
#include "EXC_Led.h"
#include "EXC_Key.h"
#include "FreeRTOS.h"
#include "task.h"
static TaskHandle_t AppTaskCreate_Handle;
static TaskHandle_t LED_Task_Handle;
static void AppTaskCreate(void);
static void LED_Task(void* pvParameters);
static void BSP_Init(void);
int main(void)
{
BaseType_t xReturn = pdPASS;
BSP_Init();
xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate, //任务函数
(const char* )"AppTaskCreate", //任务名称
(uint32_t )128, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )3, //任务优先级
(TaskHandle_t* )AppTaskCreate_Handle); //任务控制块指针
//任务控制块
if(pdPASS == xReturn)
{
vTaskStartScheduler();
}
else
{
return -1;
}
while(1)
{
}
}
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL(); //进入临界区
xReturn = xTaskCreate((TaskFunction_t )LED_Task, //任务函数
(const char* )"LED_Task", //任务名称
(uint32_t )128, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )4, //任务优先级
(TaskHandle_t* )&LED_Task_Handle); //任务控制块指针
if(pdPASS == xReturn)
printf("LED_Task任务创建成功!n");
else
printf("LED_Task任务创建失败!n");
vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
taskEXIT_CRITICAL(); //退出临界区
}
static void LED_Task(void* parameter)
{
while (1)
{
LED3Color_Set(LEDBLUE);
vTaskDelay(500);
printf("LED_Task Running,LED1_ONrn");
LED3Color_Set(LEDOFF);
vTaskDelay(500);
printf("LED_Task Running,LED1_OFFrn");
}
}
static void BSP_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
LED3Color_Set(LEDBLUE);
USART_init(SYSTEM_UART,115200,1);
printf("串口初始化成功rn");
}



