FreeRTOS学习 -- 任务相关API函数

一、任务创建和删除API函数

FreeRTOS 最基本的功能就是任务管理,而任务管理最基本的操作就是创建和删除任务。

FreeRTOS的任务创建和删除API函数如下:
在这里插入图片描述

1、函数 xTaskCreate()

此函数用来创建一个任务,任务需要 RAM 来保存于任务有关的状态信息(任务控制块),任务也需要一定的 RAM 来作为任务堆栈。如果使用函数 xTaskCreate() 来创建任务的话,那么这些所需的 RAM 就会自动的从 FreeRTOS 的堆栈中分配,因此必须提供内存管理文件,默认我们使用的 heap_4.c 这个内存管理文件,而且宏 configSUPPORT_DYNAMIC_ALLOCATION 必须为 1。

如果使用函数 xTaskCreateStatic()创建的话这些 RAM 就需要用户来提供了。新创建的任务默认就是就绪态的,如果当前没有比它更高优先级的任务运行那么此任务就会立即进入运行态开始运行,不管在任务调度器启动前还是启动后,都可以创建任务。
在这里插入图片描述

参数:

  • pxTaskCode 任务函数
  • pcName 任务名字,一般用于追踪和调试,任务名字长度不能超过 configMAX_TASK_NAME_LEN。
  • usStackDepth 任务堆栈大小,需要注意实际申请到的堆栈是 usStackDepth 的 4倍。其中空闲任务的任务堆栈大小为 configMINIMAL_STACK_SIZE。
  • pvParameters 传递给任务函数的参数。
  • uxPriority 任务优先级,范围 0~ configMAX_PRIORITIES-1。其中 0 是最低优先级,configMAX_PRIORITIES-1 是最高优先级。注意和 uC/OS 的区别,uC/OS 中 0 是最高优先级!宏 configMAX_PRIORITIES 不能超过 32 ! 也就是优先级不能超过 32 级。
  • pxCreatedTask 任务句柄,任务创建成功以后会返回任务的任务句柄。这个句柄其实就是任务的任务堆栈。此参数就用来保存这个任务句柄。

返回值:

  • pdPASS: 任务创建成功。
  • errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY: 任务创建失败,因为堆内存不足!

示例:
在这里插入图片描述

2、函数 xTaskCreateStatic()

此函数和 xTaskCreate() 的功能相同,噎死用来创建任务的。但是使用此函数创建的任务的 RAM 需要用户来提供。如果使用此函数的话需要将宏
configSUPPORT_STATIC_ALLOCATION 定义为 1。
在这里插入图片描述

参数:

  • pxTaskCode 任务函数
  • pcName 任务名字,一般用于追踪和调试,任务名字长度不能超过 configMAX_TASK_NAME_LEN。
  • usStackDepth 任务堆栈大小,需要注意实际申请到的堆栈是 usStackDepth 的 4倍。其中空闲任务的任务堆栈大小为 configMINIMAL_STACK_SIZE。
  • pvParameters 传递给任务函数的参数。
  • uxPriority 任务优先级,范围 0~ configMAX_PRIORITIES-1。其中 0 是最低优先级,configMAX_PRIORITIES-1 是最高优先级。注意和 uC/OS 的区别,uC/OS 中 0 是最高优先级!宏 configMAX_PRIORITIES 不能超过 32 ! 也就是优先级不能超过 32 级。
  • puxStackBuffer: 任务堆栈,一般为数组,数组类型要为 StackType_t 类型。
  • pxTaskBuffer: 任务控制块。

返回值:

  • NULL: 任务创建失败,puxStackBuffer 或 pxTaskBuffer 为 NULL 的时候会导致这个错误的发生。
  • 其他值: 任务创建成功,返回任务的任务句柄。

示例:
在这里插入图片描述

3、函数 xTaskCreateRestricted()

此函数也是用来创建任务的,只不过此函数要求所使用的 MCU 有 MPU(内存保护单元),用此函数创建的任务会受到 MPU 的保护。其他的功能和函数 xTaskCreate() 一样。
在这里插入图片描述

参数:

  • pxTaskDefinition: 指向一个结构体 TaskParameters_t,这个结构体描述了任务的任务函数、堆栈大小、优先级等。此结构体在文件 task.h 中有定义。
  • pxCreatedTask: 任务句柄。

返回值:

  • pdPASS: 任务创建成功。
  • 其他值: 任务未创建成功,很有可能是因为 FreeRTOS 的堆太小了。

4、函数 vTaskDelete()

删除一个用函数 xTaskCreate()和xTaskCreateStatic() 创建的任务,被删除了的任务不再存在,也就是说再也不会进入运行态。任务被删除以后就不能再使用此任务的句柄。如果此任务是使用动态方法( xTaskCreate())创建的,那么此任务被删除以后此任务之前申请的堆栈和控制块内存会再空闲任务重被释放掉,因此当调佣函数 vTaskDelete() 删除任务以后必须给空闲任务一定的运行时间。

只有那些由内核分配给任务的内存才会在任务被删除以后自动的释放掉,用户分配给任务的内存需要用户自行释放掉。比如某个任务中用户调用函数 pvPortMalloc()分配了 500 字节的内存,那么在此任务被删除以后用户也必须调用函数 vPortFree()将这 500 字节的内存释放掉,否则会导致内存泄露。

在这里插入图片描述
参数:

  • xTaskToDelete 要删除的任务的句柄。

二、任务挂起和恢复 API 函数

当某个任务要停止运行一段时间的话就将这个任务挂起,当要重新运行这个任务的话就恢复这个任务的运行。
FreeRTOS 的任务挂起和恢复 API 函数如下:
在这里插入图片描述

1、函数 vTaskSuspend()

此函数用于将某个任务设置为挂起态,进入挂起态的任务永远都不会进入运行态。退出挂起态的唯一方法就是调用任务恢复函数 vTaskResume() 或 xTaskResumeFromISR()。
在这里插入图片描述
参数:

  • xTaskToSuspend 要挂起的任务的任务句柄,创建任务的时候会为每个任务分配一个任务句柄。
    如果使用函数 xTaskCreate() 创建任务的话那么函数的参数 pxCreatedTask 就是此任务的任务句柄,如果使用函数 xTaskCreateStatic()创建任务的话那么函数的返回值就是此任务的任务句柄。也可以通过函数 xTaskGetHandle()来根据任务名字来获取某个任务的任务句柄。注意!如果参数为 NULL 的话表示挂起任务自己。

2、函数 vTaskResume()

将一个任务从挂起态恢复到就绪态,只有通过函数 vTaskSuspend() 设置为挂起态的任务才可以使用 vTaskResume() 恢复。
在这里插入图片描述

参数:

  • xTaskToResume: 要恢复的任务的任务句柄。

3、函数 xTaskResumeFromISR()

此函数是 vTaskResume()的中断版本,用于在中断服务函数中恢复一个任务。

在这里插入图片描述

参数:

  • xTaskToResume: 要恢复的任务的任务句柄。

返回值:

  • pdTRUE: 恢复运行的任务的任务优先级等于或者高于正在运行的任务(被中断打 断的任务),这意味着在退出中断服务函数以后必须进行一次上下文切换。
  • pdFALSE: 恢复运行的任务的任务优先级低于当前正在运行的任务(被中断打断的任务),这意味着在退出中断服务函数的以后不需要进行上下文切换。

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

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

相关文章

子查询之二(不相关子查询与相关子查询)

1. 相关子查询 如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行的条件关联,因此每一次执行一次外部查询,子查询都会重新计算一次,这样的子查询称为关联子查询. 相关子查询按照…

VS配置三方依赖

1.配置include 1.1.打开属性 1.2.打开“配置属性”-"C/C"-"常规" 2.配置lib 2.1.配置lib目录 打开"配置属性"-“链接器”-“常规”。 2.2.配置具体的lib 打开"配置属性"-"链接器"-“输入”。 也可以通过代码方式加入&…

【挑战30天首通《谷粒商城》】-【第一天】【10 番外篇】 解决docker 仓库无法访问 + MobaXterm连接VirtualBox虚拟机

文章目录 课程介绍 1、解决docker 仓库无法访问 2、 MobaXterm连接VirtualBox虚拟机 Stage 1:下载MobaXterm选择适合你的版本 Stage 2:vagrant ssh 连接,开启ssh访问 Stage 2-1:su获取root账号权限,输入密码(默认vagra…

Visual Studio生成C++的DLL文件(最简单版)

前言 当你在使用C编写一些可重用的代码时,将其打包成一个动态链接库(DLL)可以使其更容易地被其他项目或者程序调用和使用。Visual Studio提供了一种简单的方式来生成C的DLL文件。下面是一个关于如何在Visual Studio中生成C的DLL文件的简单教…

力扣HOT100 - 215. 数组中第K个最大元素

解题思路: 快速选择,目标是找出数组中第 k 小(或第 k 大)的元素,而不是对整个数组进行排序。 (需要和快排进行区分,快排的目的是排序) 注意: i l - 1, j r 1; 为什…

羊大师:羊奶助力宝宝成长无忧

羊大师:羊奶助力宝宝成长无忧 在宝宝的成长过程中,营养是至关重要的。随着人们对健康和营养的日益关注,越来越多的家长开始寻找更优质的食品来喂养宝宝。羊奶作为一种营养丰富、易于消化的天然食品,逐渐成为了家长们的首选。 羊奶…

现场工程师出手--虚拟化软件预留内存过大导致其他程序崩溃问题

项目场景: 一位学生有一台笔记本电脑,安装了Android,Kafka虚拟机很多软件。笔记本配置了20GB内存,固态硬盘,但最近很卡,Android Stuido经常闪退,一些游戏也无法运行。 问题描述 由于Android S…

2024最新洗地机选购攻略!分享四款热门洗地机推荐

洗地机可以说是现代家庭生活中一大利器,它能帮我们快速搞定家里的地板清洁工作,省去了自己清洗滚刷的麻烦。不过,当下市面上洗地机品牌种类繁多,价格区间也相差悬殊,要选择一款性价比较高、使用体验较好的洗地机产品&a…

Vision Mamba:高效视觉表示学习双向状态空间模型,超越Vision Transformer!

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享,与你一起了解前沿深度学习信息! Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 引言:探索视觉领域的新方向 在计算机视觉领域&…

beyondCompare工具

目录 一 资源地址 二 过期处理 一 资源地址 链接:https://pan.baidu.com/s/10TxNj0ZvLh2qusYZCPaGRA?pwduq26 提取码:uq26 二 过期处理 过期后删除对应路径下所有文件,重启软件即可

教你解决PUBG绝地求生游戏中闪退掉线无法重连回去的问题

《绝地求生》(PUBG),作为一款在全球范围内掀起热潮的战术竞技游戏,以其栩栩如生的战场环境和令人心跳加速的生存冒险博得了广大玩家的青睐。然而,一些玩家在经历了一场惊心动魄的对局后,却面临了一个不大不…

error C2039: “NotifySeverity“: 不是 “osg“ 的成员 问题分析

程序从osg3.6.5Qt5.9osgearth2.10环境中移植到osg3.7.0Qt5.15.2osgearth3.3环境中,出现了无尽的错误。 有些错误很莫名奇妙,比如下述错误: D:\OsgEarth3.3\include\osgEarth\Notify(34,53): error C2039: "NotifySeverity": 不是 &…

耳朵嗡嗡响,睡不好?张朝晖主任:近几年越来越多年轻人出现耳鸣

王先生,由于工作压力大、应酬多,经常熬夜,心情郁闷情绪差,前不久他发觉自己左耳朵嗡嗡响,还有真正耳鸣,他以为是没休息好,睡两天就好了。 在休假期间好好休息后,耳鸣依然没有改变。…

大模型微调之 在亚马逊AWS上实战LlaMA案例(七)

大模型微调之 在亚马逊AWS上实战LlaMA案例(七) 微调SageMaker JumpStart上的LLaMA 2模型 这是在us-west-2的测试结果。 展示了如何使用SageMaker Python SDK部署预训练的Llama 2模型,并将其微调到你的数据集,用于领域适应或指令…

【半夜学习MySQL】表结构的操作(含表的创建、修改、删除操作,及如何查看表结构)

🏠关于专栏:半夜学习MySQL专栏用于记录MySQL数据相关内容。 🎯每天努力一点点,技术变化看得见 文章目录 创建表查看表结构修改表删除表 创建表 语法: create table table_name(field1 datatype,field2 datatype,fiel…

Docker学习二(Centos):Docker安装并运行redis(成功运行)

文章目录 前言一、下载并挂载1. 拉取镜像2. 创建挂载目录3. 下载redis.conf文件4. 赋予权限5. 修改redis.conf 默认配置 二、docker运行redis三、检查redis运行状态四、navicat链接redis 前言 一、下载并挂载 1. 拉取镜像 docker pull redis2. 创建挂载目录 fengfanli是我自…

vscode 实现本地服务器部署小结

在查阅 MDN 网站的时候,偶然发现的原来 vscode 也可以实现本地化服务器部署,来模拟服务器的运行。 安装插件 在VSCode的插件市场搜索并安装以下插件: – Live Server(用于开启本地服务器) – Debugger for Chrome&a…

IQOO Neo7/7SE/PAD2解BL+完美root权限+LSPosed框架-可虚拟定位

QOO Neo7/Neo7SE/Pad/Pad2搭配的是天玑8200系列芯片,继810/920以后再次支持解锁BL,这给我们的玩机带来了很多可能。解锁BL有什么用途呢?最常见的就是获取root权限,刷入各种各种的magisk模块,使用自己喜欢的插件等&…

性能监测--jemeter

过年时相亲,遇到了一个很好的女生,生活的中心重心有所改变,好久没上线了。今天有时间, 公司让做性能,用到jemeter,所以简单记录一下 部署环境: 安装java 设置环境变量: 找到jdk…