当前位置: 首页 > news >正文

FreeRTOS任务相关的API函数

本篇文章记录我学习FreeRTOS的任务相关的API函数。主要涉及FreeRTOS的任务创建和删除函数、任务挂起和恢复函数。希望我的分享对你有所帮助。

读者如果需要实战FreeRTOS动态/静态任务创建和删除,可以参考以下文章:

FreeRTOS动态 / 静态创建和删除任务-CSDN博客

目录

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

1、函数xTaxkCreate()

 2、函数xTaskCreateStatic()

3、函数xTaskCreateRestricted()

4、函数vTaskDelete()

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

1、函数vTaskSuspend()

2、函数vTaskResume()

3、函数xTaskResumeFromISR()

三、结语 



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

FreeRTOS最基本的功能就是任务管理,而任务管理最基本的操作就是创建和删除任务,FreeRTOS的任务创建和删除API函数如表所示:

1、函数xTaxkCreate()

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

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

 2、函数xTaskCreateStatic()

此函数和 xTaskCreate()的功能相同,也是用来创建任务的,但是使用此函数创建的任务所需的RAM需要用用户来提供。如果要使用此函数的话需要将宏configSUPPORT_STATIC_ALLOCATION定义为1。函数原型如下:

3、函数xTaskCreateRestricted()

此函数也是用来创建任务的,只不过此函数要求所使用的MCU有MPU(内存保护单元)用此函数创建的任务会受到MPU的保护。其他的功能和函数xTaxkCreate()一样。

4、函数vTaskDelete()

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


只有那些由内核分配给任务的内存才会在任务被删除以后自动的释放掉,用户分配给任务的内存需要用户自行释放掉.

比如某个任务中用户调用函数pvPortMalloc()分配了500字节的内存,那么在此任务被删除以后用户也必须调用函数 vPortFree()将这500字节的内存释放掉,否则会导致内存泄露。此函数原型如下:

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

有时候我们需要暂停某个任务的运行,过一段时间以后在重新运行。这个时候要是使用任务删除和重建的方法的话那么任务中变量保存的值肯定丢失了!FreeRTOS给我们提供了解决这种问题的方法,那就是任务挂起和恢复,当某个任务要停止运行一段时间的话就将这个任务挂起,当要重新运行这个任务的话就恢复这个任务的运行。FreeRTOS的任务挂起和恢复API函数如表所示:

1、函数vTaskSuspend()

此函数用于将某个任务设置为挂起态,进入挂起态的任务永远都不会进入运行态。退出挂起态的唯一方法就是调用任务恢复函数vTaskResume()或xTaskResumeFromISR()。,函数原型如下:

2、函数vTaskResume()

将一个任务从挂起态恢复到就绪态,只有通过函数vTaskSuspend()设置为挂起态的任务才可以使用vTaskRexume()恢复!函数原型如下:

3、函数xTaskResumeFromISR()

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

三、结语 

关于FreeRTOS任务API函数的学习分享就至此结束了。希望我的分享能给你带来不一样的收获和喜悦。

愿与诸君共努力,不负韶华赴前程!

相关文章:

  • 爬虫(二)使用urllib爬取百度贴吧的数据
  • IDEA中的Run Dashboard
  • .net core 6 集成 elasticsearch 并 使用分词器
  • 学习方法分享
  • 关于C++的system()函数安全隐患问题
  • 虹科技术丨一文详解IO-Link Wireless技术如何影响工业无线自动化
  • 定义HarmonyOS IDL接口
  • 【MybatisPlus篇】查询条件设置(范围匹配 | 模糊匹配 | 空判定 | 包含性判定 | 分组 | 排序)
  • stack_queue:三个关键注意事项解析
  • Mac M1使用PD虚拟机运行win10弹出“内部版本已过期立即安装新的windows内部版本”
  • 手机云控制发电机组 有网络随时随地操控监控运行
  • 【劳德巴赫 Trace32 高阶系列 3 -- trace32 svf 文件操作命令】
  • 场效应管学习笔记
  • 基于SpringBoot Vue学生成绩管理系统
  • 【Kafka】服务器Broker与Controller详解
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 77. Combinations
  • AngularJS指令开发(1)——参数详解
  • es6--symbol
  • Flannel解读
  • GitUp, 你不可错过的秀外慧中的git工具
  • JAVA 学习IO流
  • Linux快速复制或删除大量小文件
  • Next.js之基础概念(二)
  • Python 反序列化安全问题(二)
  • React系列之 Redux 架构模式
  • spring boot 整合mybatis 无法输出sql的问题
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 关于使用markdown的方法(引自CSDN教程)
  • 排序(1):冒泡排序
  • 前端临床手札——文件上传
  • 使用权重正则化较少模型过拟合
  • 怎么把视频里的音乐提取出来
  • 阿里云ACE认证之理解CDN技术
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​ArcGIS Pro 如何批量删除字段
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (0)Nginx 功能特性
  • (12)目标检测_SSD基于pytorch搭建代码
  • (20050108)又读《平凡的世界》
  • (3)选择元素——(17)练习(Exercises)
  • (C++20) consteval立即函数
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (独孤九剑)--文件系统
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (算法)Game
  • (一)基于IDEA的JAVA基础1
  • (转)c++ std::pair 与 std::make
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .Net面试题4
  • /bin/rm: 参数列表过长"的解决办法
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...