当前位置: 首页 > news >正文

FreeRTOS任务创建和删除(动态)

  1. 实验目的:学会xTaskCreate()和vTaskDelete()的使用
  2. 实验设计:将设计四个任务:start_task、task1、task2、task3

四个任务功能如下:

start_task        用来创建其他的三个任务

task1               实现LED0每500ms闪烁一次

task2               实现LED1每500ms闪烁一次

task3               判断按键KEY0是否按下,按下则删掉task1

基于移植好的框架

FreeRTOS框架(STM32标准库)https://gitee.com/fei-c-language/free-rtos/tree/master/FreeRTOS%E7%A7%BB%E6%A4%8D%E6%A1%86%E6%9E%B6(STM32%E6%A0%87%E5%87%86%E5%BA%93)

第一步

将宏configSUPPORT_DYNAMIC_ALLOCATION配置为1

第二步

定义函数入口参数

根据官网例程https://freertos.org/

 BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,
                         const char * const pcName,
                         const configSTACK_DEPTH_TYPE uxStackDepth,
                         void *pvParameters,
                         UBaseType_t uxPriority,
                         TaskHandle_t *pxCreatedTask
                       );

Example usage:

/* Task to be created. */
void vTaskCode( void * pvParameters )
{
    /* The parameter value is expected to be 1 as 1 is passed in the
       pvParameters value in the call to xTaskCreate() below. */

    configASSERT( ( ( uint32_t ) pvParameters ) == 1 );

    for( ;; )
    {
        /* Task code goes here. */
    }
}

/* Function that creates a task. */
void vOtherFunction( void )
{
    BaseType_t xReturned;
    TaskHandle_t xHandle = NULL;

    /* Create the task, storing the handle. */
    xReturned = xTaskCreate(
                    vTaskCode,       /* Function that implements the task. */
                    "NAME",          /* Text name for the task. */
                    STACK_SIZE,      /* Stack size in words, not bytes. */
                    ( void * ) 1,    /* Parameter passed into the task. */
                    tskIDLE_PRIORITY,/* Priority at which the task is created. */
                    &xHandle );      /* Used to pass out the created task's handle. */

    if( xReturned == pdPASS )
    {
        /* The task was created. Use the task's handle to delete the task. */
        vTaskDelete( xHandle );
    }
}
  • 创建动态任务函数
/**
*@brief		FreeRTOS例程入口函数
*@param		无
*@retval	无
*/
void freertos_demo(void)
{
	xTaskCreate((TaskFunction_t			) 	start_task,				//开始任务函数
				(char*					)	"start_task",			//开始任务函数名称
				(configSTACK_DEPTH_TYPE	) 	START_TASK_STACK_SIZE,	//堆栈大小-字
				(void*					)	NULL,					//传递的任务函数参数
				(UBaseType_t			) 	START_TASK_PRIO,		//任务优先级
				(TaskHandle_t*			)	&start_task_handler		//任务句柄
               );

	vTaskStartScheduler();//开启任务调度器
}
  • 创建开始任务
/* 开始任务函数-用来创建其他的三个任务*/
void start_task( void * pvParameters)
{
    taskENTER_CRITICAL();/*进入临界区--关闭中断,任务切换就不会进行*/
	/*创建任务1*/
	xTaskCreate((TaskFunction_t			) 	task1,				//开始任务函数
				(char*					)	"task1",			//开始任务函数名称
				(configSTACK_DEPTH_TYPE	) 	TASK1_STACK_SIZE,	//堆栈大小-字
				(void*					)	NULL,					//传递的任务函数参数
				(UBaseType_t			) 	TASK1_PRIO,		//任务优先级
				(TaskHandle_t*			)	&task1_handler		//任务句柄
               );
				
	/*创建任务2*/
	xTaskCreate((TaskFunction_t			) 	task2,				//开始任务函数
				(char*					)	"task2",			//开始任务函数名称
				(configSTACK_DEPTH_TYPE	) 	TASK2_STACK_SIZE,	//堆栈大小-字
				(void*					)	NULL,					//传递的任务函数参数
				(UBaseType_t			) 	TASK2_PRIO,		//任务优先级
				(TaskHandle_t*			)	&task2_handler		//任务句柄
               );
				
	/*创建任务3*/
	xTaskCreate((TaskFunction_t			) 	task3,				//开始任务函数
				(char*					)	"task3",			//开始任务函数名称
				(configSTACK_DEPTH_TYPE	) 	TASK3_STACK_SIZE,	//堆栈大小-字
				(void*					)	NULL,					//传递的任务函数参数
				(UBaseType_t			) 	TASK3_PRIO,		//任务优先级
				(TaskHandle_t*			)	&task3_handler		//任务句柄
               );
	vTaskDelete(NULL);//使用完删除任务
	taskEXIT_CRITICAL();/*退出临界区--开始任务切换-开启任务调度-限制性任务优先级最高的任务*/

}
  • 每个任务函数的参数宏定义,函数声明
/*START_TASK 任务 配置
*包括:任务句柄 任务优先级 堆栈大小 创建任务
*/
#define START_TASK_PRIO			1
#define START_TASK_STACK_SIZE	128
TaskHandle_t start_task_handler;
void start_task( void * pvParameters);
/*task1 任务 配置
*包括:任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK1_PRIO			2
#define TASK1_STACK_SIZE	128
TaskHandle_t task1_handler;
void task1( void * pvParameters);
/*task2 任务 配置
*包括:任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK2_PRIO			3
#define TASK2_STACK_SIZE	128
TaskHandle_t task2_handler;
void task2( void * pvParameters);
/*task3 任务 配置
*包括:任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK3_PRIO			4
#define TASK3_STACK_SIZE	128
TaskHandle_t task3_handler;
void task3( void * pvParameters);
/********************************************************************/

定义在创建函数的上部

移植成品

FreeRTOS动态创建

http://www.dtcms.com/a/112735.html

相关文章:

  • 如何在 Windows 10 上安装 PyGame
  • 将电脑控制手机编写为MCP server
  • UE5学习笔记 FPS游戏制作39 制作一个带有背景的预制面板 使用overlay和nameSlot
  • 解决上传PDF、视频、音频等格式文件到FTP站点时报错“将文件复制到FTP服务器时发生错误。请检查是否有权限将文件放到该服务器上”问题
  • Vue 3 的响应式原理
  • Qt UI框架和Duilib UI框架差别
  • 文档的预解析
  • JavaWeb 课堂笔记 —— 02 JavaScript
  • 机器视觉开发工程师常用C#运算符与使用方法大总结
  • 网络安全防御核心原则与实践指南
  • php7.4.3连接MSsql server方法
  • 方差分析_单因素、多因素、析因方差分析
  • 【首款ARMv9开源芯片“星睿“O6测评】在“周易”NPU上部署Yolov8l模型并实现实时目标检测
  • 场馆预定系统小程序PHP+uniapp
  • 讲述我的PLC自学之路 第六章
  • Harmony OS“一多” 详解:基于窗口变化的断点自适应实现
  • 类的基本概念
  • 深入剖析丝杆升降机工作原理,解锁工业传动奥秘
  • 【C++】C++11<包装器没写>
  • 动态规划1——斐波那契数列模型——第 N 个泰波那契数
  • 算法题(117):字符串的展开
  • 16.2Linux自带的LED灯驱动实验(详细编写)_csdn
  • OJ系统C端UI自动化测试
  • Kubernetes 集群搭建(一):从环境准备到 Calico 网络插件部署
  • 自定义填充 cad
  • SpringCloudGateWay
  • spring security 过滤器链相关初始化过程
  • 使用 Elastic 实现端到端的大语言模型(LLM)可观测性:洞察生成式 AI 应用这个不透明的世界
  • C/C++测试框架googletest使用示例
  • 用HTML.CSS.JavaScript实现一个贪吃蛇小游戏