创建多任务只需要按照创建单任务的套路依葫芦画瓢即可,接下来我们创建两个任务,
任务 1 让一个 LED 灯闪烁,任务 2 让另外一个 LED 闪烁,两个 LED 闪烁的频率不一样。
注意:两个任务的优先级不一样。使用还是比较简单的。
/* 包含头文件 ----------------------------------------------------------------*//* Includes ------------------------------------------------------------------*/#include "stm32f10x.h"/* FreeRTOS头文件 */#include "FreeRTOS.h"#include "task.h"/* 开发板硬件bsp头文件 */#include "bsp_usart.h"#include "bsp_led.h"/* 私有类型定义 --------------------------------------------------------------*//* 私有宏定义 ----------------------------------------------------------------*//* 私有变量 ------------------------------------------------------------------*//** 任务句柄是一个指针,用于指向一个任务,当任务创建好之后,它就具有了一个任务句柄* 以后我们要想操作这个任务都需要通过这个任务句柄,如果是自身的任务操作自己,那么* 这个句柄可以为NULL。*//* 创建任务句柄 */static TaskHandle_t AppTaskCreate_Handle = NULL;/* LED任务句柄 */static TaskHandle_t LED_Task_Handle = NULL;/* LED2任务句柄 */static TaskHandle_t LED2_Task_Handle = NULL;/* 扩展变量 ------------------------------------------------------------------*//* 私有函数原形 --------------------------------------------------------------*/static void BSP_Init(void);static void LED_Task(void* parameter);static void AppTaskCreate(void);static void LED2_Task(void* parameter);/* 函数体 --------------------------------------------------------------------*//*** 函数功能: 主函数.* 输入参数: 无* 返 回 值: 无* 说 明: 无*/int main(void){BaseType_t xReturn = pdPASS;BSP_Init();/* 创建AppTaskCreate任务 */xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate, /* 任务入口函数 */(const char* )"AppTaskCreate", /* 任务名字 */(uint16_t )512, /* 任务栈大小 */(void* )NULL, /* 任务入口函数参数 */(UBaseType_t )1, /* 任务的优先级 */(TaskHandle_t* )&AppTaskCreate_Handle); /* 任务控制块指针 *//* 启动任务调度 */if(pdPASS == xReturn)vTaskStartScheduler(); /* 启动任务,开启调度 */elsereturn -1;}/************************************************************************ @ 函数名 : AppTaskCreate* @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面* @ 参数 : 无* @ 返回值 : 无**********************************************************************/static void AppTaskCreate(void){BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */taskENTER_CRITICAL(); //进入临界区/* 创建LED_Task任务 */xReturn = xTaskCreate((TaskFunction_t )LED_Task, /* 任务入口函数 */(const char* )"LED_Task", /* 任务名字 */(uint16_t )512, /* 任务栈大小 */(void* )NULL, /* 任务入口函数参数 */(UBaseType_t )2, /* 任务的优先级 */(TaskHandle_t* )&LED_Task_Handle); /* 任务控制块指针 */if(pdPASS == xReturn)printf("创建LED1_Task任务成功!\r\n");/* 创建LED_Task任务 */xReturn = xTaskCreate((TaskFunction_t )LED2_Task, /* 任务入口函数 */(const char* )"LED2_Task",/* 任务名字 */(uint16_t )512, /* 任务栈大小 */(void* )NULL, /* 任务入口函数参数 */(UBaseType_t )3, /* 任务的优先级 */(TaskHandle_t* )&LED2_Task_Handle);/* 任务控制块指针 */if(pdPASS == xReturn)printf("创建LED2_Task任务成功!\r\n");vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务taskEXIT_CRITICAL(); //退出临界区}/*********************************************************************** @ 函数名 : LED_Task* @ 功能说明: LED_Task任务主体* @ 参数 :* @ 返回值 : 无********************************************************************/static void LED_Task(void* parameter){while (1){LED1_ON;vTaskDelay(500); /* 延时500个tick */printf("LED_Task Running,LED1_ON\r\n");LED1_OFF;vTaskDelay(500); /* 延时500个tick */printf("LED_Task Running,LED1_OFF\r\n");}}/*********************************************************************** @ 函数名 : LED_Task* @ 功能说明: LED_Task任务主体* @ 参数 :* @ 返回值 : 无********************************************************************/static void LED2_Task(void* parameter){while (1){LED2_ON;vTaskDelay(500); /* 延时500个tick */printf("LED2_Task Running,LED2_ON\r\n");LED2_OFF;vTaskDelay(500); /* 延时500个tick */printf("LED2_Task Running,LED2_OFF\r\n");}}/************************************************************************ @ 函数名 : BSP_Init* @ 功能说明: 板级外设初始化,所有板子上的初始化均可放在这个函数里面* @ 参数 :* @ 返回值 : 无*********************************************************************/static void BSP_Init(void){/** STM32中断优先级分组为4,即4bit都用来表示抢占优先级,范围为:0~15* 优先级分组只需要分组一次即可,以后如果有其他的任务需要用到中断,* 都统一用这个优先级分组,千万不要再分组,切忌。*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);/* LED初始化 */LED_GPIO_Init();LED1_ON;/* 串口初始化 */USART_Config();}
