【RTOS】快速体验FreeRTOS所有常用API(2)任务管理

目录

    • 二、任务管理
      • 2.1 任务创建(三种方式)
        • 1)动态内存分配方式创建任务
        • 2)静态内存分配方式创建任务
        • 3)带有任务参数方式创建任务
      • 2.2 任务删除
      • 2.3 两种delay

二、任务管理

该部分在上份代码基础上修改得来,代码下载链接:

https://wwzr.lanzout.com/iPEbq1l75bri 密码:1ffe

该代码尽量做到最简,不添加多余的、不规范的代码。

内容主要包括三个部分:任务创建任务删除两种delay函数

最终实现效果:通过三种任务创建方式,创建三个任务task1、task2、task3,每个任务在OLED上显示各自的字符串,运行几秒后删除任务。

img

2.1 任务创建(三种方式)

动态内存分配方式创建任务、静态内存分配方式创建任务、带有任务参数方式创建任务。

1)动态内存分配方式创建任务

函数说明:

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数const char * const pcName, // 任务的名字const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节void * const pvParameters, // 调用任务函数时传入的参数UBaseType_t uxPriority,    // 优先级TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用它来操作这个任务

示例:

// 定义任务句柄
static TaskHandle_t g_xTask1Handle;/* 动态内存分配方式创建任务 */
xTaskCreate(vTask1, "Task1", 128, NULL, osPriorityNormal, &g_xTask1Handle);// 任务函数声明
void vTask1(void *pvParameters);// 任务函数定义
void vTask1(void *pvParameters)
{for(;;){vTaskDelay(500);}
}
2)静态内存分配方式创建任务

函数说明:

TaskHandle_t xTaskCreateStatic ( TaskFunction_t pxTaskCode,   // 函数指针, 任务函数const char * const pcName,   // 任务的名字const uint32_t ulStackDepth, // 栈大小,单位为word,10表示40字节void * const pvParameters,   // 调用任务函数时传入的参数UBaseType_t uxPriority,      // 优先级StackType_t * const puxStackBuffer, // 静态分配的栈,就是一个bufferStaticTask_t * const pxTaskBuffer // 静态分配的任务结构体的指针,用它来操作这个任务);

示例:

// 定义任务句柄
static TaskHandle_t g_xTask2Handle;// 静态内存分配,定义任务栈和任务控制块(TCB)
static StackType_t g_xTask2Stack[128];
static StaticTask_t g_xTask2TCB;/* 静态内存分配方式创建任务 */
g_xTask2Handle = xTaskCreateStatic(vTask2, "Task2", 128, NULL, osPriorityNormal, g_xTask2Stack, &g_xTask2TCB);// 任务函数声明
void vTask2(void *pvParameters);// 任务函数定义
void vTask2(void *pvParameters)
{for(;;){vTaskDelay(500);}
}
3)带有任务参数方式创建任务

示例:

// 定义任务句柄
static TaskHandle_t g_xTask3Handle;// 定义任务3的输入参数
static char g_Task3Param = 'A'; /* 带有任务参数方式创建任务 */
xTaskCreate(vTask3, "Task3", 128, &g_Task3Param, osPriorityNormal, &g_xTask3Handle);// 任务函数声明
void vTask3(void *pvParameters);// 任务函数定义
void vTask3(void *pvParameters)
{// 将输入参数转换为正确的类型char *param = (char *)pvParameters; for(;;){vTaskDelay(500);}
}

实例:

img

在三个任务中添加用户代码,让OLED分别显示各任务的cnt++。由于三个任务共用了OLED,此处先用全局变量来实现一个简陋的互斥操作,这种操作是不安全的,后续会进行改进。

img

2.2 任务删除

运行数秒后删除任务。

函数说明:

void vTaskDelete( TaskHandle_t xTaskToDelete );

示例:

// 杀自己
vTaskDelete(NULL)
// 杀别人
vTaskDelete(任务句柄)

实例:

在默认任务中,每隔3秒删除一个任务,最终OLED数值全部静止。

img

2.3 两种delay

有两个Delay函数:

  • vTaskDelay 函数是一种相对延时函数,用于让任务在当前位置暂停执行一段时间。
  • vTaskDelayUntil:函数是一种周期性延时函数,用于让任务按照指定的时间间隔执行

这两个延时函数的选择取决于任务的具体需求。

  • vTaskDelay 适用于相对延时
  • vTaskDelayUntil 更适用于周期性执行的任务

函数说明:

/* xTicksToDelay: 需要延时的时钟节拍数。 */
void vTaskDelay( const TickType_t xTicksToDelay ); /* pxPreviousWakeTime:任务上次唤醒的时间,需要用指针传递。xTimeIncrement:任务的执行周期,以时钟节拍为单位。
*/
BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,const TickType_t xTimeIncrement );

示例:

// 延时500毫秒
vTaskDelay(500);
// 定义变量记录上次唤醒的时间
TickType_t xLastWakeTime;// 记录上次唤醒的时间
xLastWakeTime = xTaskGetTickCount();while (1) {// 任务的实际工作// ...// 等待下一个周期vTaskDelayUntil(&xLastWakeTime, 500);//500个tick中断、500ms
}

实例:

两种函数的使用感受是很明显的,OLED显示有明显区别。

举个例子,下面代码使用vTaskDelay 时,len = OLED_PrintString(0, 0, "Task1:");这行代码,每次执行的时间间隔是**不确定的,总会有个10ms左右的波动。**无法真正做到让 cnt 500ms 自加一次。

使用vTaskDelayUntil时,len = OLED_PrintString(0, 0, "Task1:");这行代码,每次执行的时间间隔是**确定的,这行代码在周期执行,每500ms执行一次。**是真正做到了让 cnt 500ms 自加一次。

img

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

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

相关文章

​HDD回暖于2024,与SSD决战于2028--part2

东芝和西部数据在2023年的硬盘产品中都没有采用类似希捷的HAMR技术产品,而是采用了其他的技术方案用于提升存储容量。 东芝采用了MAMR技术,通过微波磁通控制现象来提高高密度区域的写入信号质量。根据厂商的测试数据发现,MAMR的磁头可靠性比H…

Flink-容错机制

Flink中的容错机制 流式数据连续不断地到来,无休无止;所以流处理程序也是持续运行的,并没有一个明确的结束退出时间。机器运行程序,996 起来当然比人要容易得多,不过希望“永远运行”也是不切实际的。因为各种硬件软件…

HCIP ISIS实验

拓扑图&IP划分如下图: 第一步,配置IP地址&环回地址 以R1为例,R2~R8同理 interface GigabitEthernet 0/0/0 ip address 18.1.1.1 24 interface GigabitEthernet 0/0/1 ip address 12.1.1.1 24 interface LoopBack 0 ip address 1.1.…

第07章_面向对象编程(进阶)拓展练习(关键字:this,继承性和方法重写,关键字:super,多态性,Object类)

文章目录 第07章_面向对象编程(进阶)拓展练习01-关键字:this1、Circle类2、MyDate类3、Card类 02-继承性和方法重写4、Person、Student、Teacher类5、DepositCard、CreditCard类6、Employee、Programmer、Designer、Architect类7、判断输出结…

统计学-R语言-4.6

文章目录 前言列联表条形图及其变种---单式条形图条形图及其变种---帕累托图条形图及其变种---复式条形图条形图及其变种---脊形图条形图及其变种---马赛克图饼图及其变种---饼图饼图及其变种---扇形图直方图茎叶图箱线图小提琴图气泡图总结 前言 本篇文章是对数据可视化的补充…

Pandas实战100例 | 案例 1: 读取不同类型的数据文件

案例 1: 读取不同类型的数据文件 知识点讲解 Pandas 支持多种数据文件格式的读取,包括 CSV、Excel (XLS/XLSX) 和文本文件 (TXT)。了解如何从这些不同的数据源中读取数据是数据分析的基础。 示例代码 读取 CSV 文件 # 读取 CSV 文件 df_csv pd.read_csv(examp…

Vsearch安装

wget https://github.com/torognes/vsearch/releases/download/v2.26.1/vsearch-2.26.1-linux-x86_64.tar.gz tar xzf vsearch-2.26.1-linux-x86_64.tar.gz (完整路径)/bin/vsearch 去冗余 ${software_path}/Vsearch/vsearch-2.26.1-linux-x86_64/bin/vsearch --derep_prefix…

Centos7.9忘记Root密码找回

Centos7.9忘记Root密码找回 1. 背景2. 目的3. 具体操作3.1 重启系统3.2 增加代码3.3 单用户模式3.4 单用户模式3.5 修改密码3.6 创建文件3.7 重启验证 1. 背景 由于物理主机上安装了多个虚拟机,部分虚拟机忘记了root密码,前段时间刚好要用这个虚拟机&…

智慧康养项目:智能技术与产品提升老年人生活品质

智慧康养项目需要集成的一些独特的技术和产品,其中包括: 智能健康监测设备:我们开发了一款能够实时监测老年人身体状况的智能健康监测设备,包括血压、血糖、心率等指标。该设备通过数据分析处理,能够提供个性化的健康…

【Verilog】期末复习——简要说明仿真时阻塞赋值和非阻塞赋值的区别。always语句和initial语句的关键区别是什么?能否相互嵌套?

系列文章 数值(整数,实数,字符串)与数据类型(wire、reg、mem、parameter) 运算符 数据流建模 行为级建模 结构化建模 组合电路的设计和时序电路的设计 有限状态机的定义和分类 期末复习——数字逻辑电路分…

内存泄漏问题

内存泄漏是一种常见的问题,它可能导致系统内存不断增加,最终耗尽可用内存。解决内存泄漏问题通常需要进行调试和分析。下面是一些可能有助于解决内存泄漏问题的步骤: 1. 监控内存使用情况: a. 使用 malloc 记录日志:…

【Dart】=> [05] Dart初体验-函数

文章目录 函数函数特点可选和默认参数函数对象箭头函数匿名函数综合案例 能够定义并使用Dart函数 学习内容: 函数定义可选和默认参数函数对象箭头函数匿名函数 函数 函数定义 Dart函数的结构: 调用函数: 案例:定义计算任意…

短视频账号矩阵剪辑分发系统无人直播技术开发源头

一、全行业独家源头最全面的核心技术 短视频矩阵新玩法是指利用批量自动混剪系统来处理大量短视频,通过智能算法自动进行视频剪辑、场景切换、特效添加等操作,最终生成高质量、精彩纷呈的混剪视频作品的方法和技术。这一方法的出现使得大规模短视频制作…

牛客周赛 Round 3 解题报告 | 珂学家 | 贪心思维场

前言 寒之不寒无水也,热之不热无火也。 整体评价 感觉比较简单,更加侧重于思维吧。和前几场的Round系列,风格不太一样。 A. 游游的7的倍数 因为连续7个数,比如有一个数是7的倍数 因此从个位数中着手添加,是最好的选…

Android所有版本的存储权限适配

第一步&#xff1a;在Manifest文件添加如下权限 <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion"28" tools:ignore"ScopedStorage"/> <uses-permission andr…

java自定义排序Comparator

&#x1f4d1;前言 本文主要是【java】——java自定义排序Comparator的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每…

2024年AMC8历年真题练一练和答案详解(8),以及全真模拟题

今天是1月15日&#xff0c;距离本周五的AMC8正式比赛还有四天时间&#xff0c;已经放寒假了的孩子可以多点时间复习备考&#xff0c;还在准备期末考试的孩子可以先以期末考试为重&#xff0c;忙里偷闲刷一下AMC8的题目保持感觉——系统的知识学习可能时间不够了&#xff0c;可以…

响应式编程初探-自定义实现Reactive Streams规范

最近在学响应式编程&#xff0c;这里先记录下&#xff0c;响应式编程的一些基础内容 1.名词解释 Reactive Streams、Reactor、WebFlux以及响应式编程之间存在密切的关系&#xff0c;它们共同构成了在Java生态系统中处理异步和响应式编程的一系列工具和框架。 Reactive Streams…

论生逢其时

我们无法选择生时&#xff0c;所以都是生逢此时。而你采取什么样的态度去面对&#xff0c;决定着你时随波逐流还是顺势而为&#xff0c;更有甚者创造一个时代&#xff0c;度过精彩人生。 首先&#xff0c;即使我们能够生在自认为的“伟大时代”也不一定能够成就一番伟业。我…

参与直播领取龙年大礼盒!23年Coremail社区年终福利大放送

2023年终福利大放送 Coremail 管理员社区是由 Coremail 邮件安全团队、服务团队及多条产品线共同维护&#xff0c;集 7*24h 在线自助查询、技术问答交流、大咖互动分享、资料下载等功能于一体&#xff0c;专属于 Coremail 邮件管理员、安全员成长互动的知识库社区。 转眼间&am…