FreeRTOS任务(动态)创建与删除(一)

FreeRTOS学习总结

文章目录

  • 前言
  • 一、浅浅了解
  • 二、创建任务
    • 1.动态任务创建
    • 2.动态实践
  • 总结

前言

听朋友说,FreeRTOS很好用,就在无聊的上网课期间浅学一下


提示:以下是本篇文章正文内容,下面案例可供参考

一、浅浅了解

FreeRTOS任务(动态)创建与删除(一)_第1张图片
FreeRTOS任务(动态)创建与删除(一)_第2张图片
注意:1.FreeRTOS共有32个优先级(0~31)使用时0和31不使用
2.优先级规则:数字越大优先级越高
3.vTaskDelay();//延迟函数也称任务调度函数
4.退出调用vTaskDelet(NULL)函数
FreeRTOS任务(动态)创建与删除(一)_第3张图片
两种方法创建任务:动态和静态
注意:1.任务堆栈字节数实际上= 某数 *4
2.若程序出现卡死状态,注意所设定的堆栈大小

二、创建任务


本质是调用API函数
xTaskCreate(): 使用动态方法创建一个任务
xTaskCreateStatic(): 使用静态方法创建一个任务
xTaskCreateRestricted(): 创建一个使用MPU进行限制的任务,相关内存使用动态内存分配
vTaskDelete():删除一个任务

1.动态任务创建

调用xTaskCreate()函数

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint16_t usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )

参数:
pxTaskCode: 任务函数。
pcName: 任务名字,一般用于追踪和调试,任务名字长度不能超过。
configMAX_TASK_NAME_LEN。
usStackDepth: 任务堆栈大小,注意实际申请到的堆栈是 usStackDepth 的 4 倍。其中空闲任
务的任务堆栈大小为 configMINIMAL_STACK_SIZE。
pvParameters: 传递给任务函数的参数。
uxPriotiry: 任务优先级,范围 0~ configMAX_PRIORITIES-1。
pxCreatedTask: 任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是
任务的任务堆栈。此参数就用来保存这个任务句柄。其他 API 函数可能会使
用到这个句柄

2.动态实践

FreeRTOS任务(动态)创建与删除(一)_第4张图片
主要代码如下:
FreeRTOS任务(动态)创建与删除(一)_第5张图片
FreeRTOS任务(动态)创建与删除(一)_第6张图片
FreeRTOS任务(动态)创建与删除(一)_第7张图片

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "timer.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 TASK1_TASK_PRIO		2
//ÈÎÎñ¶ÑÕ»´óС	
#define TASK1_STK_SIZE 		128  
//ÈÎÎñ¾ä±ú
TaskHandle_t Task1Task_Handler;
//ÈÎÎñº¯Êý
void task1_task(void *pvParameters);

//ÈÎÎñÓÅÏȼ¶
#define TASK2_TASK_PRIO		3
//ÈÎÎñ¶ÑÕ»´óС	
#define TASK2_STK_SIZE 		128  
//ÈÎÎñ¾ä±ú
TaskHandle_t Task2Task_Handler;
//ÈÎÎñº¯Êý
void task2_task(void *pvParameters);

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é4	 
	delay_init();	    				//ÑÓʱº¯Êý³õʼ»¯	 
	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();           //½øÈëÁÙ½çÇø
    //´´½¨TASK1ÈÎÎñ
    xTaskCreate((TaskFunction_t )task1_task,             
                (const char*    )"task1_task",           
                (uint16_t       )TASK1_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )TASK1_TASK_PRIO,        
                (TaskHandle_t*  )&Task1Task_Handler);   
    //´´½¨TASK2ÈÎÎñ
    xTaskCreate((TaskFunction_t )task2_task,     
                (const char*    )"task2_task",   
                (uint16_t       )TASK2_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )TASK2_TASK_PRIO,
                (TaskHandle_t*  )&Task2Task_Handler); 
    vTaskDelete(StartTask_Handler); //ɾ³ý¿ªÊ¼ÈÎÎñ
    taskEXIT_CRITICAL();            //Í˳öÁÙ½çÇø
}

//task1ÈÎÎñº¯Êý
void task1_task(void *pvParameters)
{
  int i=0;
	while(1)
	{
     i++; 
     LED0=~LED0;
     if(i==5)
		 {
	     vTaskDelete(Task2Task_Handler);	 
		 }
     vTaskDelay(200);
		 
	}
}

//task2ÈÎÎñº¯Êý
void task2_task(void *pvParameters)
{
	while(1)
	{
     LED1=0;
		 vTaskDelay(800);
		 LED1=1;
		 vTaskDelay(200);
		 
	}
}

总结

了解FreeRTOS操作系统可以多个任务同时执行,感觉很不错,同时在使用的时候也要注意细节!!!
继续加油~

你可能感兴趣的:(stm32,单片机,嵌入式硬件,物联网,mcu)