FreeRTOS学习总结(二)FreeRTOS任务创建和删除API函数

实现动态创建任务流程

任务控制块结构体成员介绍

typedef  struct tskTaskControlBlock       
{volatile StackType_t 		* pxTopOfStack; 					/* 任务栈栈顶,必须为TCB第一个成员 */ListItem_t 			xStateListItem;           					/* 任务状态列表项 */      ListItem_t 			xEventListItem;								/* 任务事件列表项 */     UBaseType_t 			uxPriority;                				/* 任务优先级,数值越大,优先级越大 */StackType_t 			* pxStack;						/* 任务栈起始地址 */char 				pcTaskName[ configMAX_TASK_NAME_LEN ]; 	/* 任务名字 */		…省略很多条件编译的成员
} tskTCB;

任务控制块(TCB)就是任务的身份证

静态创建任务使用流程

TaskHandle_t xTaskCreateStatic
(TaskFunction_t		pxTaskCode,				/* 指向任务函数的指针 */const char * const		pcName,				/* 任务函数名 */const uint32_t			ulStackDepth, 			/* 任务堆栈大小注意字为单位 */void * const			pvParameters, 			/* 传递的任务函数参数 */UBaseType_t			uxPriority, 				/* 任务优先级 */StackType_t * const		puxStackBuffer, 			/* 任务堆栈,一般为数组,由用户分配 */StaticTask_t * const		pxTaskBuffer				/* 任务控制块指针,由用户分配 */
); 		

/* 传递的任务函数参数 */一般为NULL
与动态不同静态需要用户指定任务堆栈和任务控制块的内存
在这里插入图片描述

静态任务创建流程

1
空闲任务是必须的软件定时器任务可选,如果都创建都需要提供堆栈和任务控制块的存储空间。
任务创建完成后进入就绪态,由任务调度器调度

任务删除函数

void vTaskDelete(TaskHandle_t xTaskToDelete);
在这里插入图片描述
用于删除已被创建的任务
被删除的任务将从就绪态任务列表、阻塞态任务列表、挂起态任务列表和事件列表中移除
1、当传入的参数为NULL,则代表删除任务自身(当前正在运行的任务)
**2、空闲任务会负责释放被删除任务中由系统分配的内存(针对动态创建),(这里注意在task1中删除task1任务则在空闲任务中释放内存,如果删除task2则立马在task1中释放)。(针对静态)但是由用户在任务删除前申请的内存, 则需要由用户在任务被删除前提前释放否则将导致内存泄露 **

删除任务流程

在这里插入图片描述
实验目的:学会 xTaskCreateStatic( ) 和 vTaskDelete( ) 的使用

实验设计:将设计四个任务:start_task、task1、task2、task3
开始任务创建123三个任务
任务1 实现LED0每500ms闪烁一次
任务2 实现LED1每500ms闪烁一次
任务3 实现LED0每500ms闪烁一次 判断按键KEY0是否按下,按下则删掉task1

硬件使用到led和按键这里不做硬件介绍

/******************************************************************************************************* @file        freertos.c* @author      正点原子团队(ALIENTEK)* @version     V1.4* @date        2022-01-04* @brief       FreeRTOS 移植实验* @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司***************************************************************************************************** @attention** 实验平台:正点原子 F407电机开发板* 在线视频:www.yuanzige.com* 技术论坛:www.openedv.com* 公司网址:www.alientek.com* 购买地址:openedv.taobao.com******************************************************************************************************/#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"/******************************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t   task1_handler;
void task1( void * pvParameters );#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t   task2_handler;
void task2( void * pvParameters );#define TASK3_PRIO         4
#define TASK3_STACK_SIZE   128
TaskHandle_t   task3_handler;
void task3( void * pvParameters );/******************************************************************************************************//*** @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();               /* 进入临界区  任何任务和中断都不能打断当前程序运行*/xTaskCreate((TaskFunction_t) task1,(char *)	"task1",(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK1_PRIO,(TaskHandle_t *)&task1_handler	);xTaskCreate((TaskFunction_t) task2,(char *)	"task2",(configSTACK_DEPTH_TYPE) TASK2_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK2_PRIO,(TaskHandle_t *)&task2_handler	);					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();}void task1( void * pvParameters )
{while(1){printf("task1 正在运行");LED0_TOGGLE();vTaskDelay(500);}
}void task2( void * pvParameters )
{while(1){printf("task2 正在运行");LED1_TOGGLE();vTaskDelay(500);}
}void task3( void * pvParameters )
{uint8_t key =0;while(1){printf("task3 正在运行");key = key_scan(0);if(key==KEY0_PRES){if(task1_handler!=NULL){printf("任务1删除");vTaskDelete(task1_handler);task1_handler=NULL;}}vTaskDelay(10);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/333760.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习每日小知识】Data Augmentation 数据增强

数据增强是通过对原始数据进行各种转换和修改来人工生成附加数据的过程,旨在增加机器学习模型中训练数据的大小和多样性。这对于计算机视觉领域尤为重要,因为图像经常被用作输入数据。 计算机视觉中的数据增强 数据增强的主要目标是解决过拟合问题&…

abp vnext 下载指定版本的项目

开发环境 Win11 vs2022 abp vnext 下载地址:Get Started | ABP.IO 下载abp框架之前,需要先安装CLI,打开命令提示符,执行以下命令即可,这个也可以指定版本下载,这里就不做介绍了,以及删除命令…

110.线程(创建、终止)

一、线程概述 ◼ 与进程(process)类似,线程(thread)是允许应用程序并发执行多个任务的一种机 制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同程序,且共 享同一份全局内存区域&…

低抖动可编程SPXO SG-8200CG, SG-8201CG -高稳定性和低抖动特性

描述 SG-8200CG和SG-8201CG (sg -8201系列)利用爱普生新的低噪声分n锁相环技术&#xff0c;与上一代爱普生可编程晶体振荡器相比&#xff0c;稳定性提高了约2x&#xff0c;相位抖动降低了<1/25。sg -8201系列可编程为1.2MHz至170MHz的任何频率&#xff0c;工作温度范围可达…

C#,背包问题(Knapsack Problem)贪心算法的源代码

背包问题&#xff08;KnapSack Problem&#xff09;的相关算法是常用的规划算法。 一、什么是背包问题&#xff1f; 背包的问题是&#xff0c;你有一个“袋子”&#xff0c;可以装有限数量的物品&#xff0c;鉴于你有一组物品可以从每个物品中选择&#xff0c;每个物品都有各自…

Spring基于注解的AOP控制事务

首先在.xml中开启sprong对注解事务的支持 applicationContext.xml <tx:annotation-driven transaction-manager"transactionManager"/> 然后再Service中加上注解 service Service Transactional(readOnlytrue,propagation Propagation.SUPPORTS) public cl…

MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 当谈论MySQL高可用性解决方案时&#xff0c;从…

java中实现对文件高效的复制

不多说我们直接上代码&#xff1a; 这个是使用NIO包下的FileChannel和ByteBuffer进行文件的操作的&#xff0c;会比较高效。

计算机毕业设计 基于SpringBoot的公司资产网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

深入理解Java源码:提升技术功底,深度掌握技术框架,快速定位线上问题

为什么要看源码&#xff1a; 1、提升技术功底&#xff1a; 学习源码里的优秀设计思想&#xff0c;比如一些疑难问题的解决思路&#xff0c;还有一些优秀的设计模式&#xff0c;整体提升自己的技术功底 2、深度掌握技术框架&#xff1a; 源码看多了&#xff0c;对于一个新技术…

【hyperledger-fabric】使用couchDB

简介 本文章主要参考来自于官方文档使用CouchDB以及 https://www.bilibili.com/video/BV1Li4y1f7ex/?spm_id_frompageDriver&vd_source2c5f2831e1c63d3a20045b167ae044e6 B站视频&#xff0c;还是非常感谢up主提供了学习的思路。 为什么要使用couchDB&#xff1f; 原文…

Qt 三维柱状图 Q3DBar 和 三维条形图中的数据序列 QBar3DSeries

(一) 使用 Q3DBars 图形类和 QBar3DSeries 序列类可以绘制三维柱状图 窗口右侧是用 Q3DBars 和 QBar3DSeries 绘制的三维柱状图&#xff0c;这个图只有一个QBar3DSeries序列&#xff0c;数据是按行存储的&#xff0c;可以有多行。水平方向是行坐标轴和列坐标轴&#xff0c;使用…