【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

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

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密码,前段时间刚好要用这个虚拟机&…

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

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

内存泄漏问题

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

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

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

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

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

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

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

java自定义排序Comparator

📑前言 本文主要是【java】——java自定义排序Comparator的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每…

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

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

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

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

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

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

数据库|数据库范式(待完成)

文章目录 数据库的范式数据库的基本操作什么是数据库的范式产生的背景(没有规范化的坏处/带来的问题)规范化表格设计的要求五大范式的作用——树立标准打个比方——桥的承载能力1NF(1范式)如何转换成合适的一范式 2NF(…

迈向高效LLM微调:低秩适应(LoRA)技术的原理与实践

在快速发展的人工智能领域中,以高效和有效的方式使用大型语言模型(LLM)变得越来越重要。在本文中,您将学习如何以计算高效的方式使用低秩适应(LoRA)对LLM进行调整! 为什么需要微调?…

吼!原来教师这样发布学生期末成绩,轻松没烦恼

​随着科技的进步和教育的不断创新,教师发布学生期末成绩的方式也在逐渐发生变化。传统的方式,如纸质成绩单和口头通知,已经不能满足现代教育的需求。那么,教师应该如何更有效地发布学生期末成绩呢? 一、电子成绩单 电…

2024年【北京市安全员-C3证】复审考试及北京市安全员-C3证证考试

题库来源:安全生产模拟考试一点通公众号小程序 北京市安全员-C3证复审考试考前必练!安全生产模拟考试一点通每个月更新北京市安全员-C3证证考试题目及答案!多做几遍,其实通过北京市安全员-C3证模拟考试题很简单。 1、【多选题】《…

使用scipy处理图片——任意比例缩放

大纲 缩小放大代码地址 在《使用numpy处理图片——缩放图片》一文中,我们每2个取1个像素来达到图像缩小的效果。这就要求缩小的比例只能是整数倍,而不能支持缩小到0.3倍或者放大到1.5倍这样的效果。 为了支持任意倍数的缩放功能,我们需要使用…