STM32H750之FreeRTOS学习--------(二)任务的创建和删除

2023-10-28 18:30

本文主要是介绍STM32H750之FreeRTOS学习--------(二)任务的创建和删除,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

FreeRTOS

二、任务的创建和删除

任务创建

动态方式创建任务
BaseType_t xTaskCreate
( TaskFunction_t 					pxTaskCode,		/* 指向任务函数的指针 */					const char * const 				pcName, 		/* 任务名字,最大长度configMAX_TASK_NAME_LEN */const 	configSTACK_DEPTH_TYPE 	usStackDepth, 	/* 任务堆栈大小,注意字为单位 */void * const 					pvParameters,	/* 传递给任务函数的参数 */UBaseType_t 					uxPriority,		/* 任务优先级,范围:0 ~ configMAX_PRIORITIES - 1 */TaskHandle_t * const 			pxCreatedTask 	/* 任务句柄,就是任务的任务控制块 */
)

返回值

  • pdPASS 任务创建成功
  • errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 任务创建失败

创建流程

  1. 将宏configSUPPORT_DYNAMIC_ALLOCATION 配置为 1
  2. 定义函数入口参数
  3. 编写任务函数
  • 函数创建任务后会立刻进入就绪态、后由任务调度器运行下面步骤
  1. 申请堆栈内存&任务控制块内存
  2. TCB结构体成员赋值
  3. 添加新任务到就绪列表中

任务控制块结构体

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;
静态创建任务
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. 需将宏configSUPPORT_STATIC_ALLOCATION 配置为 1
  2. 定义空闲任务&定时器任务的任务堆栈及TCB
  3. 实现两个接口函数 vApplicationGetIdleTaskMemory( ) vApplicationGetTimerTaskMemory ( )
  4. 定义函数入口参数
  5. 编写任务函数
  • 函数创建的任务会立刻进入就绪态,由任务调度器调度运行
  1. TCB结构体成员赋值
  2. 添加新任务到就绪列表中

在FreeRTOS中,vApplicationGetIdleTaskMemory()vApplicationGetTimerTaskMemory()是两个与静态内存分配相关的函数。

  1. vApplicationGetIdleTaskMemory(): 此函数在静态内存分配(configSUPPORT_STATIC_ALLOCATION设置为1)的情况下被调用,用于为闲置任务提供内存。在静态内存分配模式下,闲置任务将以静态方式分配,开发者需要使用vApplicationGetIdleTaskMemory()函数为其提供内存。函数原型如下:

    void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, ... );
    

    其中,ppxIdleTaskTCBBuffer参数是一个指向闲置任务的任务控制块(TCB)的指针的指针

  2. vApplicationGetTimerTaskMemory(): 类似地,此函数在静态内存分配模式下被调用,用于为定时器服务任务提供内存。函数原型如下:

    void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize );
    

    其中,ppxTimerTaskTCBBuffer参数是一个指向定时器任务的任务控制块(TCB)的指针的指针,ppxTimerTaskStackBuffer是一个指向定时器任务堆栈的指针的指针,而pulTimerTaskStackSize是一个指向定时器任务堆栈大小的指针

这两个函数是在使用静态内存分配时由FreeRTOS调用,而非由用户直接调用,但用户需要为这两个函数提供实现,以分配适当的内存给闲置任务和定时器服务任务。在实际应用中,configTIMER_TASK_STACK_DEPTH常量由应用程序编写者提供,不是内核实现的一部分,不同的示例可能会使用不同的类型,因为不同的架构可能具有不同的字长。示例应用程序不是内核实现的一部分,所以如果在示例应用程序或实际代码中的定义不正确,可以在FreeRTOSConfig.h文件中进行编辑,而不必更改内核实现5.

任务删除

删除任务
void vTaskDelete(TaskHandle_t xTaskToDelete);
  • xTaskToDelete 待删除任务的任务句柄

用于删除已被创建的任务

被删除的任务将从就绪态任务列表、阻塞态任务列表、挂起态任务列表和事件列表中移除

  • 当传入的参数为NULL,则代表删除任务自身(当前正在运行的任务)
  • 空闲任务会负责释放被删除任务中由系统分配的内存,但是由用户在任务删除前申请的内存, 则需要由用户在任务被删除前提前释放,否则将导致内存泄露

删除任务流程

  1. 使用删除任务函数,需将宏INCLUDE_vTaskDelete 配置为 1
  2. 入口参数输入需要删除的任务句柄(NULL代表删除本身)
  • 删除任务函数内部
  1. 获取所要删除任务的控制块
  2. 将被删除任务,移除所在列表
  3. 判断所需要删除的任务
    在任务被删除前提前释放,否则将导致内存泄露

删除任务流程

  1. 使用删除任务函数,需将宏INCLUDE_vTaskDelete 配置为 1
  2. 入口参数输入需要删除的任务句柄(NULL代表删除本身)
  • 删除任务函数内部
  1. 获取所要删除任务的控制块
  2. 将被删除任务,移除所在列表
  3. 判断所需要删除的任务
  4. 更新下个任务的阻塞时间

这篇关于STM32H750之FreeRTOS学习--------(二)任务的创建和删除的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/295121

相关文章

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.