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.mzph.cn/news/666337.shtml

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

相关文章

“超越摩尔定律”,存内计算走在爆发的边缘

目录 ​编辑 前言 在后摩尔时代提高计算机性能 六类存内计算技术 1)XYZ-CIM 2)XZ-CIM 3)Z-CIM 4)XY-CIM 5)X-CIM 6)O-CIM 各种CIM技术的原理 1)XYZ-CIM:NVM有状态逻辑 2…

ES6-数组的解构赋值

一、数组的解构赋值的规律 - 只要等号两边的模式相同,左边的变量就会被赋予对应的值二、数组的解构赋值的例子讲解 1)简单的示例(完整的解构赋值) 示例 //基本的模式匹配 // a,b,c依次和1,2&#xff0c…

libevent源码解析--event,event_callback,event_base

1.概述 实现一个基础tcp网络库,以基于tcp网络库构建服务端应用,客户端应用为起点,我们的核心诉求有: a. tcp网络库管理工作线程。 b. tcp网络库产生服务端对象,通过启动接口,开启服务端监听。进一步&…

解决gitee文件大小超过100MB——分片上传(每片<100MB)

Gitee 上传文件大小限制为 100MB。如果需要上传大于 100MB 的文件,可以按照以下步骤操作: 1. 将大文件分割成多个小于 100MB 的子文件。 2. 使用 Gitee 的命令行工具 git 分别将这些子文件添加到仓库中。 3. 在仓库中创建一个新文件(例如&am…

记录学习--java abstract与interface使用区别

1.abstract使用场景 abstract提供了一套功能代码,这套功能代码可以直接用,也可以细微的改变,但是abstract不希望这套功能都改变了,这可能是一套标准功能。 2.interface使用场景 interface不提供任何功能,提供协议解…

【C生万物】初始C语言

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…

【微服务】skywalking自定义链路追踪与日志采集

目录 一、前言 二、自定义链路追踪简介 2.1 自定义链路追踪应用场景 2.2 链路追踪几个关键概念 三、skywalking 自定义链路追踪实现 3.1 环境准备 3.2 集成过程 3.2.1 导入核心依赖 3.2.2 几个常用注解 3.2.3 方法集成 3.2.4 上报追踪信息 四、skywalking 自定义日志…

【国产MCU】-CH32V307-通用同步/异步收发器(USART)

通用同步/异步收发器(USART) 文章目录 通用同步/异步收发器(USART)1、USART介绍2、USART驱动API介绍3、USART使用示例3.1 轮询方式数据发送与接收3.2 中断方式数据发送与接收3.3 DMA方式数据发送与接收CH32V307提供了3组通用同步/异步收发器(USART1、USART2、USART3),以…

如何从 iPhone 上恢复永久删除的照片

您的 iPhone 上缺少照片吗?讽刺的是,iPhone 的许多高级功能可能正是这个问题如此普遍的原因。幸运的是,还有很多方法可以从 iPhone 恢复已删除的照片,具体取决于您设备的设置方式。 本文涵盖了所有这些内容。该过程根据您的具体情…

微信公众号迁移公证书怎么办?

公众号迁移有什么作用?只能变更主体吗?公众号迁移的作用可不止是变更主体哦!还可以把原公众号的粉丝、文章素材、违规记录、留言功能、名称等迁移到新的公众号上。这样一来,你就可以实现公众号的公司主体变更、粉丝转移、开通留言…

MySQL数据库备份方法

一、数据库备份的分类 1.按不同维度分类 从物理与逻辑的角度,备份可分为 物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份 物理备份方法 冷备份(脱机备份):是在关闭数…

使用maven对springboot项目进行瘦身分离jar的多种处理方案

文章目录 前言一、方案一(修改自带的spring-boot-maven-plugin插件)二、方案二(使用spring-boot-thin-maven-plugin插件)总结 前言 springboot项目打包一般我们都使用它自带的spring-boot-maven-plugin插件,这个插件默…

编程笔记 html5cssjs 075 Javascript 常量和变量

编程笔记 html5&css&js 075 Javascript 常量和变量 一、JavaScript 变量二、JavaScript 常量三、示例:小结: 在JavaScript中,变量和常量是用来存储数据的占位符。它们的主要区别在于可变性:变量的值可以改变,而…

大数据本地环境搭建03-Spark搭建

需要提前部署好 Zookeeper/Hadoop/Hive 环境 1 Local模式 1.1 上传压缩包 下载链接 链接:https://pan.baidu.com/s/1rLq39ddxh7np7JKiuRAhDA?pwde20h 提取码:e20h 将spark-3.1.2-bin-hadoop3.2.tar.gz压缩包到node1下的/export/server目录 1.2 解压压…

MySQL索引解析与B-tree工作原理

在数据库领域,索引是提高数据检索效率的关键。而在MySQL中,默认的索引方法是B-tree(Balanced Tree),一种常见而高效的索引结构。在这篇文章中,我们将深入探讨MySQL的默认索引方法,特别关注B-tre…

关于 Rust程序设计语言-构建多线程 Web服务器 一章的一些问题

前言 最近在跟着《Rust 程序设计语言》一书学习Rust,在学习最后一章构建多线程 Web 服务器的最后两节时,我遇到了一些问题,并尝试进行解释,接下来分享给大家。 将单线程服务器变为多线程服务器 按照20.2.将单线程服务器变为多线…

Oracle常用命令

创建用户: create user 用户名 identified by 密码 default tablespace zhijie; grant dba,resource,connect to 用户名; CREATE OR REPLACE TYPE DOMAIN_NAMES_COLTYPE AS TABLE OF varchar2(255); CREATE OR REPLACE TYPE TYPE_SPLIT is table of varchar2(40…

刷题11 双指针

一、同向双指针 209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回…

面试 JavaScript 框架八股文十问十答第二期

面试 JavaScript 框架八股文十问十答第二期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)其他值到字符串的…