FreeRTOS学习(五)

news2024/11/24 5:36:52

延时函数

  • vTaskDelay():相对延时,指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间结束。
  • vTaskDelayUntil():绝对延时,整个任务的运行周期看成一个整体,适用于需要按照一定频率运行的任务。
    在这里插入图片描述
    (1)为任务主体,也就是任务真正要做的工作。
    (2)是任务函数中调用vTaskDelayUntil()对任务进行延时。
    (3)其他任务在运行(高优先级)

#if ( INCLUDE_vTaskDelay == 1 )

	void vTaskDelay( const TickType_t xTicksToDelay )
	{
	BaseType_t xAlreadyYielded = pdFALSE;

		/* A delay time of zero just forces a reschedule. */
		if( xTicksToDelay > ( TickType_t ) 0U )//入口参数大于0
		{
			configASSERT( uxSchedulerSuspended == 0 );
			vTaskSuspendAll();//挂起任务调度器
			{
				traceTASK_DELAY();

				/* A task that is removed from the event list while the
				scheduler is suspended will not get placed in the ready
				list or removed from the blocked list until the scheduler
				is resumed.

				This task cannot be in an event list as it is the currently
				executing task. */
				prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );//任务添加到阻塞列表中
			}
			xAlreadyYielded = xTaskResumeAll();//恢复任务调度器
		}
		else
		{
			mtCOVERAGE_TEST_MARKER();
		}

		/* Force a reschedule if xTaskResumeAll has not already done so, we may
		have put ourselves to sleep. */
		if( xAlreadyYielded == pdFALSE )
		{
			portYIELD_WITHIN_API();
		}
		else
		{
			mtCOVERAGE_TEST_MARKER();
		}
	}

#endif /* INCLUDE_vTaskDelay */
/*-----------------------------------------------------------*/

消息队列

队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递)。
全局变量的弊端:数据无保护,导致数据不安全,当多个任务同时对该变量操作时,数据易受损。
在这里插入图片描述

/*写队列*/
xQueueSend()
{
	//进入临界区(关中断)
	写队列实际操作
	//退出临界区(开中断)
}

/*读队列*/
xQueueReceive()
{
	//进入临界区(关中断)
	读队列实际操作
	//退出临界区(开中断)
}

FreeRTOS基于队列,实现了多种功能,包括队列集、互斥信号量、计数型信号量、二值信号量、递归互斥信号量。

队列中可以存储数量有限、大小固定的数据。队列中的每一个数据叫做“队列项目”,队列能够存储队列项目的最大数量称为队列的长度。

在这里插入图片描述
创建队列时,就要指定队列长度以及队列项目的大小。

队列通常采用“先进先出”(FIFO)的数据缓冲机制,先入队的数据会先从队列中被读取,FreeRTOS中也可以配置“后进先出”LIFO。

FreeRTOS采用实际值传递(ucos采用地址传递),即将数据拷贝到队列中进行传递,也可以传递指针,传递较大的数据的时候采用指针传递。

队列不属于某个任务,任何任务和中断都可以向队列发送/读取消息。

当任务向一个队列发送消息时,可以指定一个阻塞时间,当队列已满无法入队。

  • 若阻塞时间为0:直接返回不会等待;
  • 若阻塞时间为0~port_MAX_DELAY :等待设定的阻塞时间,若在该时间内还无法入队,超时后直接返回不再等待;
  • 若阻塞时间为port_MAX_DELAY :死等,一直等到可以入队为止。出队阻塞与入队阻塞类似;

入队阻塞
在这里插入图片描述
队列满了,此时写不进去数据。
将该任务的状态列表项挂载在pxDelayedTaskList阻塞列表上。
将该任务的事件列表项挂载在xTasksWaitingToSend等待发送列表。

出队阻塞
在这里插入图片描述
队列为空,此时读取不了数据。
将该任务的状态列表项挂载在pxDelayedTaskList阻塞列表
将该任务的事件列表项挂载在xTasksWaitingToReceive等待接收列表

问题:当多个任务写入消息给一个“满队列”时,这些任务都会进入阻塞状态,也就是说有多个任务 在等待同一 个队列的空间。那当队列中有空间时,哪个任务会进入就绪态?

  • 优先级最高
  • 如果大家的优先级相同,那么等待时间最久的任务就会进入就绪态

队列操作基本过程

  1. 创建队列
  2. 往队列写入第一个消息
  3. 往队列写入第二个消息
  4. 从队列读取第一个消息

在这里插入图片描述

队列结构体

在这里插入图片描述
当用于队列使用时:
在这里插入图片描述

在这里插入图片描述

  • 队列结构体存储区
  • 队列项存储区(消息)

队列相关API函数

在这里插入图片描述
动态和静态创建队列之间的区别:队列所需的内存空间由FreeRTOS从FreeRTOS管理的堆中分配,而静态创建需要用户自行分配内存。

#define xQueueCreate ( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), (queueQUEUE_TYPE_BASE ))

  • 形参uxQueueLength:队列长度
  • 形参uxItemSize :队列项大小
  • 返回值NULL:创建失败,其他值:创建成功,返回句柄。

FreeRTOS基于队列实现了多种功能,每一种功能对应一种队列类型,队列类型的queue.h文件中有定义
在这里插入图片描述

往队列写入消息

在这里插入图片描述

在这里插入图片描述
以上写入函数调用的都是同一个函数xQueueGenericSend(),只是指定了不同的写入位置。
覆写没有阻塞时间
在这里插入图片描述
覆写方式写入队列,只有在队列的队列长度为1时,才能够使用。
在这里插入图片描述
在这里插入图片描述

  1. xQueueReceive():从队列头部读取消息,并删除消息。
  2. xQueuePeek():从队列头部读取消息。
    在这里插入图片描述

信号量的简介

信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。

  1. 判断信号量是否有资源
  2. 信号量有资源,获取信号量成功
  3. 信号量没有资源,获取信号量失败,可以选择等待(任务阻塞)释放信号量

信号量资源数:计数值
释放信号量:计数值++
获取信号量:计数值–
当计数值>0,代表有信号量资源
信号量,用于传递状态

如果信号量最大值限定为1,就是二值信号量。
如果信号量最大值>1,就是计数型信号量。

队列与信号量区别

  • 队列可以容纳多个数据;信号量仅存放数值,无法存放其它数据。
  • 创建队列时有两部分内存:队列结构体+队列项存储空间;创建信号量,只需分配信号量结构体。
  • 写入队列:队列满时,可阻塞;释放信号量:不可阻塞,计数值++,当计数值为最大时,反悔失败。
  • 读取队列:当队列为空时,可阻塞;获取信号量:计数值–,当没有资源时,可阻塞。

二值信号量

二值信号量的本质是一个队列长度为1的队列,该队列就只有空和满两种情况。
在这里插入图片描述

  1. 创建二值信号量
  2. 释放二值信号量
  3. 获取二值信号量
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

卡尔曼滤波与组合导航原理笔记(一)第二部分 卡尔曼滤波方程的推导

文章目录 三、卡尔曼滤波1、随机系统状态空间模型2、状态预测3、状态量测4、增益矩阵K与状态估计5、Kalman滤波公式汇总6、Kalman滤波流程图1.划分为左右两部分(一阶矩和二阶矩)2.划分为上下两部分(时间更新、量测更新) 7、Kalman…

Windows11安装kohya_ss详细步骤(报错、踩坑)

文章目录 笔者环境所需环境安装kohya_ss方式一:带有GUI的kohya_ss仓库方式二:kohya_ss核心仓库 笔者环境 OS:windows11Python:3.10.6CUDA11.6 所需环境 Python3.10.6GitCUDA11.6 安装kohya_ss 方式一:带有GUI的ko…

mybatis执行流程分析

mybatis全局配置文件 mybatis全局配置文件中涉及的标签如下图所示 配置文件解析 public static void main(String[] args) throws IOException {// 读取配置文件InputStream is Resources.getResourceAsStream("org/apache/ibatis/builder/MapperConfig1.xml");//…

chatgpt赋能python:Python多种颜色——提升SEO排名的技巧

Python多种颜色——提升SEO排名的技巧 在网站设计中,使用多种颜色可以提高用户体验和页面美观度。但你是否知道使用多种颜色还可以提高SEO排名呢?本文将介绍如何在Python代码中使用多种颜色来提高你的SEO排名。 什么是SEO? SEO的全称为“S…

chatgpt赋能python:Python备份文件夹:保障数据安全的最佳方法

Python备份文件夹:保障数据安全的最佳方法 数据备份是确保所有重要信息安全的关键部分。对于IT专业人士和计算机爱好者而言,文件夹备份是一项必不可少的任务。而Python是备份文件夹最流行的语言之一,因为它易于学习和使用。 在这篇文章中&am…

stable-diffusion基础问题记录

一、windows安装 1、启动 如果自己是anaconda,python版本不是3.10.6 conda create -n python_3_10_6 python3.10.6,创建一个这样的环境 修改webui-user.bat set PYTHOND:/software/Anaconda3/envs/python_3_10_6/python,把python换成这个…

【走进Linux的世界】Linux---基本指令(3)

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【Linux专栏】🎈 本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌 目录 date指令cal指…

12代CPU启用SR-IOV vGPU,实现一台电脑当七台用

背景 虚拟桌面基础设施(VDI)技术一般部署在服务器,可以实现多个用户连接到服务器上的虚拟桌面。随着桌面计算机性能的日益提升,桌面计算机在性能在很多场景下已经非常富余,足够同时满足多个用户同时使用的需求。实际项…

Redis的持久化详解

目录 一、Redis的持久化二、RDB(Redis DataBase)1、RDB快照原理2、RDB配置3、redis.conf 其他一些配置4、RDB的备份恢复5、RDB优缺点 三、AOF(Append Of File)1、AOF原理2、AOF配置3、AOF的备份恢复4、重写流程5、AOF优缺点 四、A…

MySQL | Windows服务器部署ZIP免安装版MySQL8.0+数据库笔记

Windows服务器部署ZIP免安装版MySQL8.0数据库笔记 文章目录 Windows服务器部署ZIP免安装版MySQL8.0数据库笔记下载MySQL压缩包编写配置文件环境变量初始化数据库安装MySQL服务安装错误:VCRUNTIME140_1.dll 登录 MySQL 下载MySQL压缩包 打开官网的下载页面&#xff…

POI报表的入门

POI报表的入门 理解员工管理的的业务逻辑 能够说出Eureka和Feign的作用 理解报表的两种形式和POI的基本操作熟练使用POI完成Excel的导入导出操作 员工管理 需求分析 企业员工管理是人事资源管理系统中最重要的一个环节,分为对员工入职,转正,离…

chatgpt赋能python:Python如何处理AI文件

Python如何处理AI文件 什么是AI文件? AI文件是Adobe Illustrator的标准文件格式。它包含了图形设计师所创建的矢量图形,这些矢量图形可以根据需要进行缩放和文件大小的调整。AI文件是专业印刷和设计领域中最常用的格式之一。 为什么要处理AI文件&…

深入ReentrantReadWriteLock

ReentrantReadWriteLock出现的原因 首先synchronized和ReentrantLock都是互斥锁,一个线程在获取锁资源之后另一个线程只能等待假设有一种情况是读多写少,并且确保线程安全。可以使用ReentrantReadWriteLock实现ReentrantReadWriteLock的特点是读读不互斥…

基于随身wifi的Tiny linux debian搭建教程

基于随身wifi的Tiny linux debian搭建教程 基于随身wifi的Tiny linux debian搭建教程基本信息进9008miko备份Qualcomm Premium Tool全分区备份 开adb刷debianssh连接扩展应用原版镜像测速ServerBox自动登录校园网 bug 基于随身wifi的Tiny linux debian搭建教程 基本信息 12芯…

Java8环境安装及配置

Java8环境安装及配置 一、下载JDK8二、安装三、环境变量配置四、验证 一、下载JDK8 本教程使用的是8u202版本,若需要其他版本可点击下方链接跳转下载。 Oracle下载,点击跳转选择版本 如下图所示,选择自己需要的版本下载 点击8u202版本 下载…

JavaSE进阶(day14,复习自用)

XML、XML解析、设计模式等 XMLXML概述XML的创建、语法规则XML文档约束方式一-DTD约束[了解]XML文档约束方式二-schema约束[了解] XML解析技术XML解析技术概述Dom4J解析XML文件Dom4J解析XML文件-案例实战 XML检索技术:Xpath设计模式:工厂模式设计模式&am…

C++算法:排序之一(插入、冒泡、快速排序)

C算法:排序 排序之一(插入、冒泡、快速排序) 文章目录 C算法:排序前言一、十大排序法性能二、各算法实现1、插入排序2、冒泡排序3、快速排序 原创文章,未经许可,严禁转载 前言 排序算法很多,一…

chatgpt赋能python:Python备份一个列表:最简单的方式和最佳实践

Python备份一个列表:最简单的方式和最佳实践 在Python编程中,经常需要将数据存储在列表中。但是,由于数据的重要性,我们需要确保数据不会丢失或损坏。因此,备份列表是我们需要考虑的一件事情。在这篇文章中&#xff0…

chatgpt赋能python:Python实现文件夹备份:让你的数据永不丢失

Python实现文件夹备份:让你的数据永不丢失 数据备份对于每个人都非常重要。如果你有很多个人或工作文件保存在计算机上,那么定期备份可以保证你的数据不会因为计算机出现故障而丢失。Python作为一种强大的编程语言,可以帮助你轻松地实现文件…

Linux开发工具gcc/g++篇

文章目录 🍇0. 前言🍈1. 背景知识🍉2. gcc/g使用🍊2.1 预处理操作🍋去注释🍋头文件展开🍋条件编译 & 宏展开 🍊2.2 编译操作🍊2.3 汇编操作🍊2.4 链接 &a…