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…

【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 自定义日志…

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

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

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

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

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

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

大数据本地环境搭建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 解压压…

两个重要极限【高数笔记】

【第一个:lim (sinx / x) 1, x -- > 0】 1.本质: lim (sin‘?’ / ‘?’) 1, ‘?’ -- > 0;保证‘?’ -- > 0,与趋向无关 2.例题&#x…

【ELK】logstash快速入门

1.概述 1.1.什么是logstash? 之前我们聊了es,并且用docker搭建了一个eskibana的环境。es目前最普遍的用法是用来存储日志的,然后结合kibana对日志做一些可视化的工作。既然要收集日志,就面临着一个问题: 各个系统的…

口味多样的碱水贝果面包,香气饱满松松软软

这两天在吃一款碱趣贝果面包,感觉味道很不错,它是一种加热一下就可以吃的手工面包,口感十分独特。这款面包有着清香有韧性的表皮,里面松软可口,加热后更是香气四溢。 除了标准的原味全麦之外,碱趣贝果面包还…

SpringBoot数据访问复习

SpringBoot数据访问复习 数据访问准备 引入jdbc所需要的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency> 原理分析 导入的启动器引入了两个…

【年度盛会征稿】第二届全国精准营养与生命健康创新大会(PNHIC 2024)

第二届全国精准营养与生命健康创新大会&#xff08;PNHIC 2024&#xff09; 【高层次专家齐聚交流&#xff0c;年度盛会&#xff01;】 近年来&#xff0c;人们对营养与健康愈加关注&#xff0c;精准营养学研究也成为一个快速发展的热点领域。“精准营养”研究借助多组学、可…

MySQL进阶45讲【13】为什么表数据删掉一半,表文件大小不变?

1 前言 有些小伙伴在删数据库数据时&#xff0c;会产生一个疑问&#xff0c;我的数据库占用空间大&#xff0c;我把一个最大的表删掉了一半的数据&#xff0c;怎么表文件的大小还是没变&#xff1f; 那么这篇文章&#xff0c;就介绍一下数据库表的空间回收&#xff0c;看看如…

如何把vue项目打包成桌面程序 electron-builder

引入 我们想要把我们写的vue项目,打包成桌面程序&#xff0c;我们需要使用electron-builder这个库 如何使用 首先添加打包工具 vue add electron-builder 选择最新版本 下载完毕 我们可以看到我们的package.json中多了几行 electron:build&#xff1a;打包我们的可执行程序 e…

在 iOS 上安装自定企业级应用

了解如何安装您的组织创建的自定应用并为其建立信任。 本文适用于学校、企业或其他组织的系统管理员。 您的组织可以使用 Apple Developer Enterprise Program 创建和分发企业专用的 iOS 应用&#xff0c;以供内部使用。您必须先针对这些应用建立信任后&#xff0c;才能将其打…

服装品牌如何利用数字化工具提升商品管理效率

随着科技的快速发展&#xff0c;数字化工具在商品管理中的应用越来越广泛。数字化工具不仅可以提高商品管理的效率&#xff0c;还可以帮助企业更好地满足客户需求&#xff0c;提升市场竞争力。本文将探讨如何利用数字化工具提升商品管理效率。 一、建立数字化管理系统 数字化…

备战蓝桥杯---搜索(应用基础1)

话不多说&#xff0c;直接看题&#xff1a; 显然&#xff0c;我们直接用深搜&#xff0c;我们可以先把空位用结构体存&#xff0c;然后打表存小方块&#xff0c;再用数组存行列。 下面是AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int a[12][12];…

linux中的gdb调试

gdb是在程序运行的结果与预期不符合时&#xff0c;可以使用gdb进行调试 注意&#xff1a;使用gdb调试时要在编译上加-g参数 gcc -g -c hello.c 启动gdb调试&#xff1a; gdb file 对gdb进行调试 设置运行参数&#xff1a; set args 可指定运行参数 show args 可以查…