FreeRTOS 任务创建与删除实验

news2024/12/26 9:24:55

本实验主要实现 FreeRTOS 使用动态方法创建和删除任务,本实验设计了四个任务,这四 个任务的功能如下表所示:

软件设计

1. 程序流程图  

本实验的程序流程图,如下图所示:

 

2. FreeRTOS 函数解析

(1) 函数 xTaskCreate()

此函数用于使用动态方法创建任务

(2) 函数 vTaskDelete()

此函数用于删除任务

3. 程序解析

(1) FreeRTOS 配置

由于本实验需要使用动态方法创建任务,因此需要配置 FreeRTOS 以支持动态内存管理, 并向工程添加动态内存管理算法文件。

首先,在 FreeRTOSConfig.h 文件中开启支持动态内存管理,如下所示:

#define configSUPPORT_DYNAMIC_ALLOCATION 1

接着向工程添加动态内存管理算法文件,本实验使用的是 heap_4.c 文件。  

(2) start_task 任务

start_task 任务的入口函数代码如下所示:

void start_task(void *pvParameters) 

{ 
     taskENTER_CRITICAL(); /* 进入临界区 */
 
     /* 创建任务 1 */ 
     xTaskCreate( 
         (TaskFunction_t )task1, /* 任务函数 */ 
         (const char* )"task1", /* 任务名称 */ 
         (uint16_t )TASK1_STK_SIZE, /* 任务堆栈大小 */ 
         (void* )NULL, /* 传入给任务函数的参数 */ 
         (UBaseType_t )TASK1_PRIO, /* 任务优先级 */ 
         (TaskHandle_t* )&Task1Task_Handler
       ); /* 任务句柄 */ 


     /* 创建任务 2 */ 
     xTaskCreate(
         (TaskFunction_t )task2, /* 任务函数 */ 
         (const char* )"task2", /* 任务名称 */ 
         (uint16_t )TASK2_STK_SIZE, /* 任务堆栈大小 */ 
         (void* )NULL, /* 传入给任务函数的参数 */ 
         (UBaseType_t )TASK2_PRIO, /* 任务优先级 */ 
         (TaskHandle_t* )&Task2Task_Handler
     ); /* 任务句柄 */ 


     /* 创建任务 3 */ 
     xTaskCreate( 
        (TaskFunction_t )task3, /* 任务函数 */ 
         (const char* )"task3", /* 任务名称 */ 
         (uint16_t )TASK3_STK_SIZE, /* 任务堆栈大小 */ 
         (void* )NULL, /* 传入给任务函数的参数 */ 
         (UBaseType_t )TASK3_PRIO, /* 任务优先级 */ 
         (TaskHandle_t* )&Task3Task_Handler); /* 任务句柄 */ 



     vTaskDelete(StartTask_Handler); /* 删除开始任务 */ 
     taskEXIT_CRITICAL(); /* 退出临界区 */ 

} 

从上面的代码中可以看到,start_task 任务使用了函数 xTaskCreate(),动态地创建了 task1、

task2 和 task3 任务。

(3) task1 和 task2 任务

void task1(void *pvParameters) 

{ 
     uint32_t task1_num = 0; 
 
     while (1) 
     { 
         lcd_fill(6, 131, 114, 313, lcd_discolor[++task1_num % 11]); 
         lcd_show_xnum(71, 111, task1_num, 3, 16, 0x80, BLUE); 
 
         vTaskDelay(500); 
     } 

} 
 

/** 
 * @brief task2 
 * @param pvParameters : 传入参数(未用到) 
 * @retval 无 
 */ 

void task2(void *pvParameters) 

{ 
     uint32_t task2_num = 0; 
 
     while (1) 
     { 
         lcd_fill(126, 131, 233, 313, lcd_discolor[11 - (++task2_num % 11)]); 
         lcd_show_xnum(191, 111, task2_num, 3, 16, 0x80, BLUE); 
 
         vTaskDelay(500); 
     } 

} 

从以上代码中可以看到,task1 和 task2 任务分别每间隔 500ticks 就区域刷新一次屏幕,task1和 task2 任务主要是用于测试任务的创建与删除,当 task1 和 task2 任务被创建后,就能够看到 屏幕上每间隔 500ticks 进行一次区域刷新;而当 task1 和 task2 任务被删除后,屏幕上显示的内 容就不再变化。

(4) task3 任务

void task3(void *pvParameters) 

{ 
     uint8_t key = 0; 
 
     while (1) 
     { 
         key = key_scan(0); 
 
         switch (key) 
     { 
         case KEY0_PRES: /* 删除任务 1 */ 
     { 
         vTaskDelete(Task1Task_Handler); 
         break; 
     } 
         case KEY1_PRES: /* 删除任务 2 */ 
     { 
         vTaskDelete(Task2Task_Handler); 
         break; 
     } 
         default: 
     { 
         break; 
     } 
 } 
 
 vTaskDelay(10); 
 } 

}

从上面的代码中可以看到,task3 任务负责扫描按键,当检测到 KEY0 按键被按下时候,调 用函数 vTaskDelaete()删除 task1 任务;当检测到 KEY1 按键被按下时,调用函数 vTaskDelete()

删除 task2 任务。

下载验证

编译并下载代码,复位后可以看到 LCD 屏幕上显示了本次实验的相关信息,如下图所示:

 

其中,每间隔 500ticks,Task1 和 Task2 的屏幕区域就刷新一次,并且 Task1 和 Task2 后方 数字也随之加一,此时表示 task1 和 task2 任务均被创建,并且正在运行中。

当按下 KEY0 按键后,task1 任务被删除,此时,Task1 的屏幕区域不再刷新,并且 Task1

后方的数字也不再改变,表明 task1 任务已被删除,不再运行。当按下 KEY1 按键后,task2 任 务被删除,此时,Task2 的屏幕区域不再刷新,并且 Task2 后方的数字也不再改变,表明 task2

任务已经被删除,不再运行。

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

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

相关文章

spring框架基础知识和基于XML的Bean对象的管理回顾

什么是spring框架? spring基本功能所必须的jar包就是这些 如何获取bean? IOC原理 上面耦合度太高了 改进使用工厂模式 上面并没有把耦合度降低到最低,使用反射 spring实现IOC的两种方式 BeanFactory和ApplicationContext IOC如何管理Bea…

5个方法,帮助你快速提高团队管理效率

团队中,大家看起来都很忙,但最终交付的结果却总是差强人意。会议那么多,但有效的却很少越管理,但偏偏有时候越管理越乱......相信以上这些问题,很多管理者都有遇到过,团队管理是一个项目中最关键的一环。好…

如何打造全流程数字化零工场景,实现零工管理一体化?

近年来,零工市场发展迅速,不仅为企业提供更低成本、更便捷的用工方式,也为劳动者就业提供更低门槛更灵活形式,发挥了就业「蓄水池」的重要作用。但由于零工经济模式下的用工形式非常灵活,企业想要管好零工并不容易。 …

短视频平台-小说推文(知乎)推广任务详情

知乎会员 知乎日结内测中,可能暂只对部分优质会员开放! 2023/03/29通知: 知乎拉新项目,由于内部测试转化较低,暂时下线,原有关键词出单不受影响。 1、关键词 1.1 选择会员文 在知乎【首页】或者【会员】里面选取,需…

PEIS体检系统全套源代码,C# 源码

医院体检信息系统PEIS源码,C# 源码,PEIS源码源码 文末获取联系! 系统概述 医院体检信息系统是专门针对医院体检中心的日常业务运作的特点和流程,结合数字化医院建设要求进行设计研发的一套应用系统。该系统覆盖体检中心的所有业务&#xff0…

使用nvm替换nvmw作为nodejs的版本切换(亲测)

之前的文章:同时使用vue2.0和vue3.0版本的采坑记录 安装的nvmw,今天想要用nvmw切换时,居然给我报错了: 然后我就走上了使用nvm替换nvmw之路。。 1.安装 nvm-windows下载 下载release版 中Assets中的包,window10&…

APIs -- DOM正则表达式

1. 介绍 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在JavaScript中,正则表达式也是对象通常用来查找、替换那些符合正则表达式的文本,许多语言都支持正则表达式。正则表达式在JavaScript中的使用场景: 例如验证表单:用户名表单…

数据库的实际操作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、关系模型二、数据库的操作 创建数据库查看数据库选择数据库删除数据库三、MySQL 数据库命名规范总结 一、关系模型 关系数据库是建立在关系模型上的。而关系模…

flutter学习之旅(一)

初学Flutter flutter官网和中文开发手册 安装flutter - windows 官方文档-windows flutter_windows_3.7.9-stable.zip 编辑环境变量 在 用户变量 一栏中,检查是否有 Path 这个条目: 如果存在这个条目,以 ; 分隔已有的内容,加入 f…

物联网能源能耗之场景控制原理

物联网能源能耗系统利用物联网技术,可帮助企业构建能耗分布,帮助操作人员实时监控各类关键参数,计算关键环节的能耗指标,和既定的能耗基线进行对比,得出能耗差距。 对于制造企业而言,物联网能源能耗不仅能…

商业策划的基本功:竞品分析

商业策划的基本功:竞品分析 商业的三个视角:用户,竞争,自己 有方法会更有效 趣讲大白话:磨刀不误砍柴工 【趣讲信息科技138期】 **************************** 世界上如果只有一种矿泉水 就不会竞争 就不会有农夫山泉这…

由世纪互联运营的Microsoft Teams携创新功能正式发布,夯实“企业数字中枢”

2023年4月18日,北京——今日,微软宣布由世纪互联运营的Microsoft Teams推出一系列创新功能,围绕企业数字核心能力,赋能数字化协作空间、智能化协作体验、整合生产力工具和工作流、安全合规、构建团队文化等五大落地场景&#xff0…

基于重要抽样技术的非序贯蒙特卡洛法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

前端学习:HTML响应式设计、计算机代码、语义元素

目录 HTML响应Web设计 一、什么是响应式Web设计? 1.流体网格 2.媒体查询 3.响应媒体 4.视口元标记 二、使用Bootstrap HTML计算机代码元素 HTML 语义元素 一、什么是语义元素 二、HTML5中的新的语义元素 HTML响应Web设计 一、什么是响应式Web设计&…

现在学习Java,还有出路吗?

当然有出路,Java一直都是市场占有率最高的编程语言,我们生活涉及到的方方面面都有Java的身影,Java基本也覆盖了所有的行业。同时Java自身也是不断在升级更新,平均一年半左右进行一次,而未来的发展还会更加的强势。 随…

Mysql安装步骤

1、解压服务端Mysql安装包 解压之后的目录就是以上这样的。 2.复制改变my.ini文件 把my.ini文件添加到目录中去 [mysql] # 设置mysql客户端默认字符集 default-character-setutf8 [mysqld] #设置3306端口 port 3306 # 设置mysql的安装目录 basedirE:/mysql/mysql-8.0.18-wi…

Spring AOP核心概念与操作示例

AOP 核心概念 还记得我们Spring有两个核心的概念嘛?一个是IOC/DI,另一个是AOP咯。 先来认识两个概念: AOP(Aspect Oriented Programming)面向切面编程;作用:在不惊动原始设计的基础上为其进行功能增强,类…

Linux命令行操作/选项介绍,文件分类/内容与属性/绝对相对路径,隐藏文件与整个目录结构

Linux的命令行操作介绍 Linux操作的特点:纯命令行,当然Linux它也有图形化界面或桌面版。Windows也有命令行,也有图形化界面。不过它是面向普通客户的操作系统,所以必须得是好用好玩的,所以图形化界面那是必然。无论是…

PCL点云库(2) - IO模块

目录 2.1 IO模块接口 2.2 PCD数据读写 (1) PCD数据解析 (2)PCD文件读写示例 2.3 PLY数据读写 (1)PLY数据解析 (2)PLY文件读写示例 2.4 OBJ数据读写 (1&#xff…

网易云信 RTC 音频 QoS 综述

RTC、QoS、WebRTC 的定义 RTC 实时通信,泛指各种数据的实时传输技术,包括音频,视频,文本,图片等媒体和非媒体数据的实时传输。 QoS 服务质量,指一个网络能够利用各种基础技术,为指定的网络通信…