FreeRTOS动态 / 静态创建和删除任务

本篇文章记录我学习FreeRTOS的动态 / 静态创建和删除任务的知识。希望我的分享能给你带来不一样的收获!文中涉及FreeRTOS创建和删除任务的API函数,建议读者参考以下文章:

FreeRTOS任务相关的API函数-CSDN博客

目录

​编辑

 一、FreeRTOS动态创建任务和删除任务

1、动态创建/删除任务实例分析

2、程序与分析 

(1)、任务设置

(2)、main()函数 

(3)、任务函数 

二、FreeRTOS静态创建和删除任务 

 1、静态创建任务红外删除任务实例分析

2、 程序与分析

(1)、系统配置 

(2)、任务设置 

(3)、main()函数

(4)、任务函数

三、结语 



 一、FreeRTOS动态创建任务和删除任务

1、动态创建/删除任务实例分析

实验内容:

本实验设计三个任务: start_task、task1_task和 task2_task ,这三个任务的任务功能如下:

1、start_task:用来创建其他两个任务。


2、taskl_task :当此任务运行5此以后就会调用函数vTaskDelete()删除任务task2_task,此任务也会控制LEDO的闪烁,并且周期性的刷新LCD指定区域的背景颜色。


3、task2_task :此任务普通的应用任务,此任务也会控制LED1的闪烁,并且周期性的刷新LCD指定区域的背景颜色。

2、程序与分析 

(1)、任务设置

(1) 、start_task任务的任务优先级,此处用宏来表示,以后所有的任务优先级都用宏来表示。创建任务设置优先级的时候就用这个宏,当然了也可以直接在创建任务的时候指定任务优先级。
(2)、start_task 任务的任务堆栈大小。

(3)、start_task任务的任务句柄。

(4)、start_task任务的任务函数声明。

(2)、main()函数 

(1)、调用函数xTaskCreate()创建tart_task任务,函数中的各个参数就是上面的任务设置中定义的,其他任务的创建也用这种方法。
(2)、调用函数 vTaskStartScheduler()开启FreeRTOS的任务调度器,FreeRTOS开始运行。

(3)、任务函数 

(1)、start_task任务的任务函数,在此任务函数中我们创建了另外两个任务taskl_task 和task2_task。start_task任务的职责就是用来创建其他的任务或者信号量、消息队列等的,当创建完成以后就可以删除掉start_task任务。


(2)、删除 start_task 任务,注意函数 vTaskDelete()的参数就是 start_task任务的任务句柄StartTask_Handler。


(3)、task1_task任务函数(任务1),任务比较简单,每隔Ⅰ秒钟taskl_num加一并且LEDO反转,串口输出任务运行的次数,其实就是taskl_num的值。当taskl_task运行5次以后就调用函数vTaskDelete()删除任务task2_task。


(4)、任务taskl_task运行了5次,调用函数vTaskDelete()删除任务task2_task。

(5)、task2_task任务函数(任务2),和 task1_task 差不多。


简单的总结分析一下此例程的流程,因为这是我们使用FreeRTOS写的第一个程序,很多习惯是我们后面要用到的。比如使用任务宏定义任务优先级,堆栈大小等,一般有关一个任务的东西我们的放到一起,比如任务堆栈、任务句柄、任务函数声明等,这样方便修改。这些东西可以放到一个.h头文件里面去,只是例程里面任务数比较少,所以就直接放到main.c文件里面了,要是工程比较大的话最好做一个专用的头文件来管理。
在main函数中一开始肯定是初始化各种硬件外设,初始化完外设以后调用函数xTaskCreate()创建一个开始任务,注意创建开始任务是在调用函数 vTaskStartScheduler()开启任务调度器之前,这样当后面开启任务调度器以后就会直接运行开始任务了。其他任务的创建就放到开始任务的任务函数中,由于开始任务的职责就是创建其他应用任务和信号量、队列等这些内核对象的,所以它只需要执行一次,当这些东西创建完成以后就可以删除掉开始任务了。


二、FreeRTOS静态创建和删除任务 

 1、静态创建任务红外删除任务实例分析

实验目的:
上一小节我们讲了使用函数xTaskCreate()来创建任务,本节在上一小节的基础上做简单的修改,使用函数xTaskCreateStatic()来创建任务,
也就是静态方法,任务的堆栈、任务控制块就需要由用户来指定了。

2、 程序与分析

程序请看上面的动态创建任务工程!

(1)、系统配置 

使用静态方法创建任务的时候需要将宏configSUPPORT_STATIC_ALLOCATION设置为1,在文件FreeRTOSConfig.h中设置,如下所示:

宏configSUPPORT_STATIC_ALLOCATION定义为1以后编译一次,会提示我们有两个函数未定义,如图所示:

这个在我们讲FreeRTOS的配置文件FreeRTOSConfig.h 的时候就说过了,如果使用静态方法的话需要用户实现两个函数vApplicationGetldleTaskMemory()和vApplicationGetTimerTaskMemory()。通过这两个函数来给空闲任务和定时器服务任务的任务堆栈和任务控制块分配内存,这两个函数我们在main.c 中定义,定义如下:

可以看出这两个函数很简单,用户定义静态的任务堆栈和任务控制块内存,然后将这些内存传递给函数参数。最后创建空闲任务和定时器服务任务的API函数会调用vApplicationGetldleTaskMemory()和 vApplicationGetTimerTaskMemory()来获取这些内存。

(2)、任务设置 

(1)、静态创建任务需要用户提供任务堆栈,这里定义一个数组作为任务堆栈,堆栈数组为StackType_t类型。
(2)、定义任务控制块,注意任务控制块类型要用StaticTask_t,而不是TCB_t或tskTCB !这里已经要切记!

(3)、main()函数

(1)、调用函数xTaskCreateStatic()创建任务。

(2)、将定义的任务堆栈数组传递给函数。

(3)、将定义的任务控制块传递给函数。


可以看出在用法上xTaskCreateStatic()和xTaskCreate()没有太大的区别,大多数的参数都相同。学习过 UCOS的同学应该会对函数xTaskCreateStatic()感到熟悉,因为UCOS中创建任务的函数和xTaskCreateStatic()类似,也需要用户来指定任务堆栈和任务控制块的内存的,然后将其作为参数传递给任务创建函数。不过我们后面所有的例程不管是创建任务、信号量还是队列都使用动态方法。

(4)、任务函数

(1)、使用静态任务创建函数xTaskCreateStatic()来创建任务task1_task。

(2)、使用静态任务创建函数xTaskCreateStatic()来创建任务task2_task。

三、结语 

关于FreeRTOS动态/静态创建/删除任务的知识就分享至此了,相信我的分享一定能给你带来不一样的收获和感悟。愿我们一起努力,不负韶华!

关于以上代码涉及的完整工程,请从下方链接(免费)获取: 

https://download.csdn.net/download/m0_73931287/88805980

https://download.csdn.net/download/m0_73931287/88805983

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

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

相关文章

离线数仓-数据治理

目录 一、前言 1.1 数据治理概念 1.2 数据治理目标 1.3 数据治理要解决的问题 1.3.1 合规性 元数据合规性 数据质量合规性 数据安全合规性 1.3.2 成本 存储资源成本 计算资源成本 二、数据仓库发展阶段 2.1 初始期 2.2 扩张期 2.3 缓慢发展期 2.4 变革期 三、…

前后端数据校验

前端校验内容 前端开发中的必要校验,可以保证用户输入的数据的准确性、合法性和安全性。同时,这些校验也有助于提供良好的用户体验和防止不必要的错误提交到后端。 1、必填字段校验: 对于必填的字段,需确保用户输入了有效的数据…

Node.js版本管理工具之_Volta

Node.js包管理工具之_Volta 文章目录 Node.js包管理工具之_Volta1. 官网1. 官网介绍2. 特点1. 快( Fast)2. 可靠(Reliable)3. 普遍( Universal) 2. 下载与安装1. 下载2. 安装3. 查看 3. 使用1. 查看已安装的工具包2. 安装指定的node版本3.切换项目中使用的版本 1. 官网 1. 官网…

02-Java抽象工厂模式 ( Abstract Factory Pattern )

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂 该超级工厂又称为其他工厂的工厂 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类 每个生成的工厂都能按照工厂模式提供对象 …

Redis核心技术与实战【学习笔记】 - 19.Pika:基于SSD实现大容量“Redis”

前言 随着业务数据的增加(比如电商业务中,随着用户规模和商品数量的增加),就需要 Redis 能保存更多的数据。你可能会想到使用 Redis 切片集群,把数据分散保存到不同的实例上。但是这样做的话,如果要保存的…

Docker存储空间清理

不知不觉服务器存储空间被Docker掏空了… 查看Docker空间占用情况 使用docker system df命令,可以加 -v 查看详情 清理Docker不需要的内容 使用docker system prune -a命令清理Docker 所有停止的容器所有没有被使用的networks所有没容器的镜像所有build cache …

深度学习实战 | 卷积神经网络LeNet手写数字识别(带手写板GUI界面)

引言 在深度学习领域,卷积神经网络(Convolutional Neural Network, CNN)是一种广泛应用于图像识别任务的神经网络结构。LeNet是一种经典的CNN结构,被广泛应用于基础的图像分类任务。本文将介绍如何使用LeNet卷积神经网络实现手写…

企业级IT应用运维监控:层次架构设计与实践指南

前言 企业基本都有自己的IT系统,而每个IT系统都有自己的监控系统。企业级的IT应用监控架构是一种综合性的解决方案,涉及到很多层级和相应的工具。随着企业IT系统的规模和复杂程度的不断增加,监控和管理系统也面临着越来越大的挑战。大家有时…

Python实现PDF到HTML的转换

PDF文件是共享和分发文档的常用选择,但提取和再利用PDF文件中的内容可能会非常麻烦。而利用Python将PDF文件转换为HTML是解决此问题的理想方案之一,这样做可以增强文档可访问性,使文档可搜索,同时增强文档在不同场景中的实用性。此…

windows下安装go

下载golang Go 官网下载地址: https://golang.org/dl/ Go 官方镜像站(推荐): https://golang.google.cn/dl/ 选择安装包 验证有没有安装成功 查看 go 环境 说明 : Go1.11 版本之后无需手动配置环境变量&#xff0c…

Docker 安装篇(CentOS)

Docker社区版 Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE。 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施、容器、插件等。 1、Docker 要求 C…

2023年全球软件开发大会(QCon上海站2023):核心内容与学习收获(附大会核心PPT下载)

在信息化和全球化日益加速的今天,软件开发技术日新月异,对全球各行各业产生了深远影响。2023年全球软件开发大会(QCon上海站2023)无疑成为行业内外瞩目的焦点。本次大会汇集了全球顶级的软件开发专家、企业领袖、研究者&#xff0…