FreeRTOS静态任务的创建和删除

 使用静态创建函数的方式要在FreeRTOSConfig.h中配置允许创建静态函数

 

#define configSUPPORT_STATIC_ALLOCATION   1          // 支持静态的方式申请内存

 在FreeRTOS中创建静态任务使用xTaskCreateStatic()

注:不同参数的含义

  • 第一个参数表示【操作的函数】
  • 第二个参数【任务的名称】
  • 第三个参数【任务堆栈大小】
  • 第四个参数表示【传递给任务参数处理的值】
  • 第五个参数表示【处理任务的优先级】
  • 第六个参数【任务堆栈的大小】
  • 第七个参数【函数的任务控制块(也就是任务的句柄---->用于接收函数返回来的值))】

配置函数的参数

空闲任务堆栈的优先级等

创建空闲的任务函数(不创建这个的话任务会报错)

 创建开始任务函数,在开始任务中创建任务1,并删除开始任务

注:任务的删除要在一个空闲的任务中进行(在执行中的任务是不能进行删除操作的)

实现任务1函数验证创建效果

具体代码如下所示(实现led灯的闪烁)

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "freeRTOS.h"
#include "task.h"
#include "LED.h"

//空闲任务任务堆栈
static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
//空闲任务控制块
static StaticTask_t IdleTaskTCB;

//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务堆栈
StackType_t StartTaskStack[START_STK_SIZE];
//任务控制块
StaticTask_t StartTaskTCB;
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);

//任务优先级
#define TASK1_TASK_PRIO		2
//任务堆栈大小	
#define TASK1_STK_SIZE 		128  
//任务堆栈
StackType_t Task1TaskStack[TASK1_STK_SIZE];
//任务控制块
StaticTask_t Task1TaskTCB;
//任务句柄
TaskHandle_t Task1Task_Handler;
//任务函数
void task1_task(void *pvParameters);



void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, 
								   StackType_t **ppxIdleTaskStackBuffer, 
								   uint32_t *pulIdleTaskStackSize)
{
	*ppxIdleTaskTCBBuffer=&IdleTaskTCB;
	*ppxIdleTaskStackBuffer=IdleTaskStack;
	*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
}

		 
int main(void){
	//创建开始任务
	StartTask_Handler=xTaskCreateStatic((TaskFunction_t	)start_task,		//任务函数
										(const char* 	)"start_task",		//任务名称
										(uint32_t 		)START_STK_SIZE,	//任务堆栈大小
										(void* 		  	)NULL,				//传递给任务函数的参数
										(UBaseType_t 	)START_TASK_PRIO, 	//任务优先级
										(StackType_t*   )StartTaskStack,	//任务堆栈
										(StaticTask_t*  )&StartTaskTCB);	//任务控制块              
	  vTaskStartScheduler();
    while(1){
		
		}
    return 0;

}

//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
    //创建TASK1任务
	Task1Task_Handler=xTaskCreateStatic((TaskFunction_t	)task1_task,		
										(const char* 	)"task1_task",		
										(uint32_t 		)TASK1_STK_SIZE,	
										(void* 		  	)NULL,				
										(UBaseType_t 	)TASK1_TASK_PRIO, 	
										(StackType_t*   )Task1TaskStack,	
										(StaticTask_t*  )&Task1TaskTCB);	
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}
void task1_task(void *pvParameters){
   LED_Init();
	 while(1){
	    LED1_ON();
		  vTaskDelay(100);
		  LED1_OFF();
		  vTaskDelay(100);
	 }

}



相关推荐

  1. 【2】STM32·FreeRTOS·任务创建删除

    2024-04-15 02:50:02       25 阅读
  2. FreeRtos任务挂起恢复实验示例(后续)

    2024-04-15 02:50:02       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-15 02:50:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-15 02:50:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-15 02:50:02       82 阅读
  4. Python语言-面向对象

    2024-04-15 02:50:02       91 阅读

热门阅读

  1. Android 编译C程序APP

    2024-04-15 02:50:02       31 阅读
  2. 读《股票大作手回忆录》有感

    2024-04-15 02:50:02       32 阅读
  3. Go 之常见的几种设计模式

    2024-04-15 02:50:02       36 阅读
  4. AcWing 794. 高精度除法——算法基础课题解

    2024-04-15 02:50:02       35 阅读
  5. lstm时间序列预测python

    2024-04-15 02:50:02       36 阅读
  6. 【LeetCode刷题记录】560. 和为 K 的子数组

    2024-04-15 02:50:02       35 阅读
  7. 文心一言VSchatGPT4

    2024-04-15 02:50:02       31 阅读
  8. 使用 bert-base-chinese-ner 模型实现中文NER

    2024-04-15 02:50:02       33 阅读