FreeRTOS学习笔记——动态创建任务(STM32)

博客介绍了任务创建和删除的API函数,重点讲述xTaskCreate动态创建函数,创建任务需定义优先级、堆栈等配置,在调度前完成配置,可在任务函数里编写程序。还给出STM32F4三任务创建测试示例,创建开始任务后再创建三个任务,成功后删除开始任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.任务创建和删除API函数

函数描述
xTaskCreate动态创建一个任务
xTaskCreateStatic静态创建一个任务
xTaskCreateRestricted创建使用MPU进行限制任务。内存相关分配
vTaskDelete删除一个任务

1.1 xTaskCreate动态创建函数

BaseType_t xTaskCreate
(
    TaskFunction_t     pvTaskCode,    //任务函数
    const char * const pcName,        //任务名称
    uint16_t           usStackDepth,  //任务堆栈大小
    void *             pvParameters,  //传递给任务函数的参数
    UBaseType_t        uxPriority,    //任务优先级
    TaskHandle_t *     pvCreatedTask  //任务句柄
);

动态创建一个任务需要定义一些配置,优先级堆栈等

#define START_TASK_PRIO		1        //任务优先级	
#define START_STK_SIZE 		128      //任务堆栈大小
TaskHandle_t StartTask_Handler;      //任务句柄
void start_task(void *pvParameters); //任务函数

创建函数仿真main函数中,最后开启任务调度函数,其他任务也按这个格式,在调度之前配置

//创建开始任务
xTaskCreate((TaskFunction_t )start_task,            //任务函数
            (const char*    )"start_task",          //任务名称
            (uint16_t       )START_STK_SIZE,        //任务堆栈大小
            (void*          )NULL,                  //传递给任务函数的参数
            (UBaseType_t    )START_TASK_PRIO,       //任务优先级
            (TaskHandle_t*  )&StartTask_Handler);   //任务句柄    

vTaskStartScheduler();          //开启任务调度

就可以在定义的任务函数里写自己的程序

//任务函数
void start_task(void *pvParameters)
{
  while(1)
	 {
		 // Task code goes here.
	 }
}

下面为STM32F4三任务创建测试,开始创建一个开始任务,任务开始执行时,创建三个任务,创建成功后,vTaskDelete(StartTask_Handler)删除开始任务因为只需要用一次。

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"

#define START_TASK_PRIO		1        //任务优先级
#define START_STK_SIZE 		128      //任务堆栈大小	
TaskHandle_t StartTask_Handler;      //任务句柄
void start_task(void *pvParameters); //任务函数

#define LED0_TASK_PRIO		2        //任务优先级	
#define LED0_STK_SIZE 		50       //任务堆栈大小
TaskHandle_t LED0Task_Handler;       //任务句柄
void led0_task(void *pvParameters);  //任务函数

#define LED1_TASK_PRIO		3        //任务优先级
#define LED1_STK_SIZE 		50       //任务堆栈大小	
TaskHandle_t LED1Task_Handler;       //任务句柄
void led1_task(void *pvParameters);  //任务函数

#define FLOAT_TASK_PRIO		4        //任务优先级	
#define FLOAT_STK_SIZE 		128      //任务堆栈大小
TaskHandle_t FLOATTask_Handler;      //任务句柄
void float_task(void *pvParameters); //任务函数

int main(void)
{ 
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
  delay_init(168);		//初始化延时函数
  uart_init(115200);     	//初始化串口
  LED_Init();		        //初始化LED端口
	
	//创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          //开启任务调度
}
 
//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
    //创建LED0任务
    xTaskCreate((TaskFunction_t )led0_task,     	
                (const char*    )"led0_task",   	
                (uint16_t       )LED0_STK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )LED0_TASK_PRIO,	
                (TaskHandle_t*  )&LED0Task_Handler);   
    //创建LED1任务
    xTaskCreate((TaskFunction_t )led1_task,     
                (const char*    )"led1_task",   
                (uint16_t       )LED1_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )LED1_TASK_PRIO,
                (TaskHandle_t*  )&LED1Task_Handler);        
    //浮点测试任务
    xTaskCreate((TaskFunction_t )float_task,     
                (const char*    )"float_task",   
                (uint16_t       )FLOAT_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )FLOAT_TASK_PRIO,
                (TaskHandle_t*  )&FLOATTask_Handler); 
 
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}

//LED0任务函数 
void led0_task(void *pvParameters)
{
    while(1)
    {
        LED0=~LED0;
        vTaskDelay(500);
    }
}   

//LED1任务函数
void led1_task(void *pvParameters)
{
    while(1)
    {
        LED1=0;
        vTaskDelay(200);
        LED1=1;
        vTaskDelay(800);
    }
}

//浮点测试任务
void float_task(void *pvParameters)
{
	static float float_num=0.00;
	while(1)
	{
		float_num+=0.01f;
		printf("float_num的值为: %.4f\r\n",float_num);
        vTaskDelay(1000);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值