Freertos:

news2024/12/24 20:23:11

裸机编程通过中断实现不同任务的切换,实际上RTOS中通过不断更换CPU的使用权达到多任务运行的目的。FreeRTOS 中任务存在四种任务状态,分别为运行态、就绪态、阻塞态和挂起态。任务一般通过函数 vTaskSuspend()和函数 vTaskResums()进入和退出挂起态,处于挂起态的任务无法被运行;一般通过函数 vTaskDelay(),进行一段时间的延时,那么在延时超时之前,这个任务就处理阻塞态。任务也可以处于阻塞态以等待队列、信号量、事件组、通知或信号量等外部事件,但阻塞状态一定有延时时间。

FreeRTOS 的任务优先级高低与其对应的优先级数值,是成正比的,也就是说任务优先级数

值为 0 的任务优先级是最低的任务优先级,FreeRTOS 的任务优先级高低与其对应数值的逻辑关系正好与STM32 的中断优先级高低与其对应数值的逻辑关系相反。

FreeRTOS 的官方强烈建议 STM32 在使用 FreeRTOS 的时候,使用中断优先级分组 4(NVIC_PriorityGroup_4)即0-15级抢占优先级,0级子优先级。HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

 FreeRTOS 进出临界区:临界区是指那些必须完整运行的区域,在临界区中的代码必须完整运行,不能被打断。FreeRTOS 在进出临界区的时候,通过关闭和打开受 FreeRTOS 管理的中断但只是管理RTOS管理的优先级5之后的中断,以保护临界区中的代码。taskENTER_CRITICAL() 、 taskENTER_CRITICAL_FROM_ISR() 、 taskEXIT_CRITICAL() 、taskEXIT_CRITICAL_FROM_ISR(x),这四个宏定义分别用于在中断和非中断中进出临界区。在初始化任务时候使用。

FreeRTOS 任务调度方式为抢占式调度和时间片调度相结合。抢占式调度主要时针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可

以抢占优先级低的任务,只有当优先级高的任务发生阻塞或者被挂起,低优先级的任务才可以运行。时间片调度主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到的时候切换任务,也就是说 CPU 轮流运行优先级相同的任务,每个任务运行的时间就是一个系统时钟节拍。

静态创建任务需要自己设定栈等参数,一般都直接选着动态创建。

列表是 FreeRTOS 中最基本的一种数据结构,其在物理存储单元上是非连续、非顺序的。FreeRTOS 中的列表是一个双向链表,在list.h 文件中。列表项是列表中用于存放数据的地方,也在 list.h 文件中。

列表的意义:

跟踪任务: 列表被用来跟踪FreeRTOS中的任务。通过使用列表,FreeRTOS能够有效地管理任务的执行和调度。

数据结构: 列表是FreeRTOS中的一个数据结构,与链表类似。它提供了一种组织和管理任务的方式,使得任务的添加、删除和调度变得高效。

双向环形链表: FreeRTOS中的列表是一个双向环形链表,意味着列表的头和尾可以相互连接,形成一个闭环。这种设计有助于简化某些操作的实现,如任务的插入和删除。

列表项的意义:

任务信息存储: 列表项是存放在列表中的项目,它们包含了任务的相关信息。这些信息可能包括任务的优先级、状态、挂起条件等,对于FreeRTOS的任务管理和调度至关重要。

节点概念: 在数据结构中,列表项相当于链表中的节点。每个节点都包含有关任务的信息,并且可以通过指针与其他节点(任务)相互连接。

灵活性: 列表项的使用提供了灵活性,允许用户根据需要自定义任务的信息和属性。通过修改列表项的内容,用户可以实现对任务的精细控制和定制化操作。

函数 vTaskStartScheduler()用于启动任务调度器,任务调度器启动后,FreeRTOS 便会开始

进行任务调度,除非调用函数 xTaskEndScheduler()停止任务调度器,否则不会再返回。

调用函数 vTaskGetRunTimeStats()获取并通过串口打印系统任务运行时间信息,以此来合理进行每个任务资源的分配。

FreeRTOS 的系统时钟节拍计数器为全局变量 xTickCount,那么 FreeRTOS 又是何时操作这

个系统时钟节拍计数器的呢?本教程的配套例程而言,是在 SysTick 的中断服务函数中,一般也推荐使用 SysTick 作为 RTOS 的时钟节拍。

vTaskDelay() 任务延时函数,延时单位:系统时钟节拍。函数 vTaskDelay()传入的参数 xTicksToDelay 是任务被延时的具体延时时间,时间的单位为系统时钟节拍,这里要特别注意,很多 FreeRTOS 的初学者可能会一会此函数延时的时间单位为微妙、毫秒、秒等物理时间单位,当时 FreeRTOS 是以系统时钟节拍作为计量的时间单位 的 , 而 系 统 时 钟 节 拍 对 应 的 物 理 时 间 长 短 于 FreeRTOSConfig.h 文 件 中 的 配 置 项。

配置项 configTICK_RATE_HZ 是用于配置系统时钟节拍的频率的,本教程的所有配套例程,将此配置项配置成了 1000,即系统时钟节拍的频率为 1000,换算过来,一个系统时钟节拍就是 1 毫秒。

队列是一种任务到任务、任务到中断、中断到任务数据交流的一种机制。在队列中可以存

储数量有限、大小固定的多个数据,队列中的每一个数据叫做队列项目,队列能够存储队列项目的最大数量称为队列的长度,在创建队列的时候,就需要指定所创建队列的长度及队列项目的大小。因为队列是用来在任务与任务或任务于中断之间传递消息的一种机制,因此队列也叫做消息队列。队列通常采用 FIFO(先进先出)的存储缓冲机制,当有新的数据被写入队列中时,永远都是写入到队列的尾部,而从队列中读取数据时,永远都是读取队列的头部数据

队列不属于某个特定的任务,可以在任何的任务或中断中往队列中写入消息,或者从队列

中读取消息。

队列的结构体为 Queue_t,在 queue.c 文件中有定义

在使用队列进行任务之间的“沟通交流”时,一个队列只允许任务间传递的消息为同一种

数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集。FreeRTOS

提供的队列集功能可以对多个队列进行“监听”,只要被监听的队列中有一个队列有有效的消息,那么队列集的读取任务都可以读取到消息,如果读取任务因读取队列集而被阻塞,那么队列集将解除读取任务的阻塞。

创建队列、队列集和其他任务,并添加队列到队列集中.

 /* 创建队列集 */

 xQueueSet = xQueueCreateSet(QUEUESET_LENGTH);

 /* 创建队列 */

 xQueue1 = xQueueCreate(QUEUE_LENGTH, QUEUE_ITEM_SIZE);

 xQueue2 = xQueueCreate(QUEUE_LENGTH, QUEUE_ITEM_SIZE);

 /* 创建二值信号量 */

 xSemaphore = xSemaphoreCreateBinary();

 /* 将队列和二值信号量添加到队列集 */

 xQueueAddToSet(xQueue1, xQueueSet);

 xQueueAddToSet(xQueue2, xQueueSet);

 xQueueAddToSet(xSemaphore, xQueueSet);

xQueueSend(xQueue1, &key, portMAX_DELAY);/* 队列 1 发送消息 */

xSemaphoreGive(xSemaphore);/* 释放二值信号量 */

activate_member = xQueueSelectFromSet(xQueueSet, portMAX_DELAY);

xQueueReceive(activate_member, &queue_recv, portMAX_DELAY);

 printf("接收到来自 xQueue1 的消息: %d\r\n", queue_recv);

xSemaphoreTake(activate_member, portMAX_DELAY);

 printf("获取到二值信号量: xSemaphore\r\n");

基于队列和队列集实现了不同任务之间的信息交流。

信号量可以用在多任务访问同一资源时的资源管理FreeRTOS 提供了多种信号量,按信号量的功能可分为二值信号量、计数型信号量、互斥信号量和递归互斥信号量。

解决同步问题的机制,可以实现对共享资源的有序访问。其中,“同步”指的是任务间的同步,即信号量可以使得一个任务等待另一个任务完成某件事情后,才继续执行;而“有序访问”指的是对被多任务或中断访问的共享资源(如全局变量)的管理,当一个任务在访问(读取或写入)一个共享资源时,信号量可以防止其他任务或中断在这期间访问(读取或写入)这个共享资源。

前面说过,信号量是基于队列实现的,二值信号量也不例外,二值信号量实际上就是一个

队列长度为 1 的队列,在这种情况下,队列就只有空和满两种情况,这不就是二值情况吗?二值信号量通常用于互斥访问或任务同步。

计数型信号量与二值信号量类似,二值信号量相当于队列长度为 1 的队列,因此二值信号

量只能容纳一个资源,这也是为什么命名为二值信号量,而计数型信号量相当于队列长度大于0 的队列,因此计数型信号量能够容纳多个资源,这是在计数型信号量被创建的时候确定的。

/* 创建计数型信号量 */

 CountSemaphore =

 xSemaphoreCreateCounting( (UBaseType_t)255, /* 计数型信号量最大值 */

 (UBaseType_t)0); /* 计数型信号量初始值 */

/* 释放计数型信号量 */

 xSemaphoreGive(CountSemaphore);

 /* 获取计数型信号量资源数 */

 semaphore_val = uxSemaphoreGetCount(CountSemaphore);

互斥信号量其实就是一个拥有优先级继承的二值信号量,在同步的应用中(任务与任务或

中断与任务之间的同步)二值信号量最适合。互斥信号量适合用于那些需要互斥访问的应用中。在互斥访问中互斥信号量相当于一把钥匙,当任务想要访问共享资源的时候就必须先获得这把钥匙,当访问完共享资源以后就必须归还这把钥匙,这样其他的任务就可以拿着这把钥匙去访问资源。

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

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

相关文章

2024.1.8 关于 Redis 数据类型 Zset 集合命令、编码方式、应用场景

目录 引言 Zset 集合命令 ZINTERSTORE ZUNIONSTORE Zset 编码方式 Zset 应用场景 排行榜系统 引言 在 Redis 中集合间操作无非就是 交集、并集、差集 Set 类型与之相对应的操作命令为 sinter、sunion、sdiff 注意: 从 Redis 6.2 版本开始,Zset 命…

书生·浦语大模型实战2

轻松玩转书生浦语大模型趣味 Demo 大模型及 InternLM 模型简介 什么是大模型 大模型通常指的是机器学习或人工智能领域中参数数量巨大、拥有庞大计算能力和参数规模的模型。这些模型利用大量数据进行训练,并且拥有数十亿甚至数千亿个参数。大模型的出现和发展得益…

IP定位应对恶意IP攻击:保护网络安全的新策略

随着网络攻击的日益猖獗,恶意IP攻击成为网络安全领域的一大挑战。传统的安全防护手段在应对此类攻击时显得力不从心。近年来,通过IP定位这一新技术,为应对恶意IP攻击提供了新的解决思路。 IP定位技术通过分析网络流量中的IP地址,能…

YOLOv8改进 | 主干篇 | 12月份最新成果TransNeXt特征提取网络(全网首发)

一、本文介绍 本文给大家带来的改进机制是TransNeXt特征提取网络,其发表于2023年的12月份是一个最新最前沿的网络模型,将其应用在我们的特征提取网络来提取特征,同时本文给大家解决其自带的一个报错,通过结合聚合的像素聚焦注意力和卷积GLU,模拟生物视觉系统,特别是对于中…

003集Class类应用实例—python基础入门实例

面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。 类就是一个模板,模板里可以包含多个函数,函数里实现一些功能 对象则是根…

Uncaught (in promise) ReferenceError: require is not defined

在 Vue3 中加载项目路径下的资源图片,起初按照之前 vue 的写法 require 但浏览器却抛出了异常 Uncaught (in promise) ReferenceError: require is not defined 因为 require 采用的 webpack 加载方式,而 vue3 中通过 vite 的方式,两者存在差异,所以才产生了刚开始的一目; vu…

无线信号强度测试板/射频产品量产测试神器

目录 一、测试板特点 二、应用场景 三、芯片特点 四、测试板接口图 …

linux查找文件中的指定字符,并批量替换文件中指定字符

1、grep -rl “jquery-1.8.0.min.js” /opt 查找/opt 目录下存在jquery-1.8.0.min.js的文件 [rootlocalhost file1]# grep -rl "jquery-1.8.0.min.js" /opt /opt/file1/index.xhtml /opt/file2/index.xhtml /opt/shell.sh扩展:使用该命令可以查找文件中…

多链混沌:Layer2 格局演变与跨链流动性的新探索

点击查看原文:多链混沌:Layer2 格局演变与跨链流动性的新探索 如今的 Crypto 是一个由多链构成的混沌世界。曾经,以太坊聚集了加密世界绝大多数的流动性与 DeFi 应用,但现在其 TVL 占比已经降到 60% 以下,并仍处于下降…

Unity文字转语音(使用RT-Voice PRO [2023.1.0])

参考文章Unity插件——文字转朗读语音RtVioce插件功能/用法/下载_rtvoice-CSDN博客 一、使用步骤 1.导入进Unity(插件形式为 .unitypackage) https://download.csdn.net/download/luckydog1120446388/88717512 2.添加所需Prefab 1).右键可…

众和策略:四部门联合印发!这一板块大爆发!

沪指盘中一度重回2900点,游览工业链股票再度大涨 今天上午A股商场整体表现依旧相对低迷,首要指数有不同程度上涨,但涨幅遍及较小,上证指数盘中一度重回2900点整数关口之上,后又跌回2900点关口之下,到上午收…

Qt QWidget窗口基类

文章目录 1 QWidget介绍2 如何显示 QWidget窗口2.1 新建基于QWidget的窗口类2.2 再添加一个QWidget窗口类2.3 显示新添加的 QWidget窗口 3 常用的属性和方法3.1 窗口位置3.2 窗口大小3.3 窗口标题3.4 窗口图标3.5 资源文件 4 实例 1 QWidget介绍 Qt 中的常用控件,比…

设计模式的艺术P1基础—2.2 类与类的UML图示

设计模式的艺术P1基础—2.2 类与类的UML图示 在UML 2.0的13种图形中,类图是使用频率最高的两种UML图之一(另一种是用于需求建模的用例图),它用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解…

Mac重置NVRAM

Mac重置NVRAM Mac重置NVRAM如何重置 NVRAM搭载 Apple 芯片的 Mac基于 Intel 的 Mac Mac重置NVRAM NVRAM(非易失性随机访问存储器)是一小部分内存,Mac 使用这些内存来储存某些设置并对其进行快速访问。PRAM(参数 RAM)储…

二叉树的层序遍历经典问题(算法村第六关白银挑战)

基本的层序遍历与变换 二叉树的层序遍历 102. 二叉树的层序遍历 - 力扣(LeetCode) 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入…

kubernetes 审计与日志 详解

开头语 写在前面:如有问题,以你为准, 目前24年应届生,各位大佬轻喷,部分资料与图片来自网络 内容较长,页面右上角目录方便跳转 基本 介绍 在Kubernetes集群中,API Server的审计日志记录了…

golang实现加密解密文档

golang实现加密解密文档 package mainimport ("bytes""crypto/aes""crypto/cipher""crypto/rand""encoding/base64""flag""fmt""io""io/ioutil" )func main() {encodePtr : flag.…

过去半年信竞基础学习总结

当Richard同学从去年7月份,开始从YY班学习C和信息学竞赛时,他对C还一无所知,但对计算机和编程的兴趣让他一直都乐在其中。在过去的半年中,通过参加各个平台的月赛,让他更加热爱编程,也让Richard更加了解自己…

linux项目部署(jdk,tomcat,mysql,nginx,redis)

打开虚拟机,与连接工具连接好,创建一个文件夹 cd /tools 把jdk,tomcat安装包放入这个文件夹里面 #解压 tar -zxvf apache-tomcat-8.5.20.tar.gz #解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 编辑jdk文件以及测试jdk安装 第一行代码路径记得改成我…

服务器里面打开浏览器访问不了会是什么原因

我们在日常使用服务器的过程中,时常会有遇到各类情况,近日就有遇到用户联系到德迅云安全,反馈自己在服务器里面打不开浏览器,服务器里面没有网络无法访问的情况。那我们今天就来讲下服务器里面打不开网站可能是由哪些原因导致。 …