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

FreeRTOS实时操作系统

1.认识实施操作系统

1.1 裸机和实时操作系统

裸机:

        早期嵌入式开发没有嵌入式操作系统的概念,直接操作裸机,在裸机上写程序,比如用51单片机基本就没有操作系统的概念。

        通常把程序设计为前后台系统,主要分为两部分:前台系统和后台系统。这样的程序包括一个死循环和若干个中断服务程序(应用程序是一个无限循环,循环中调用API函数完成所需的操作,这个大循环就叫做后台系统;中断服务程序用于处理系统的异步事件,也就是前台系统),前台是中断级,后台是任务级。

RTOS:

        RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。在实时操作系统中,我们可以把要实现的功能划分为多个任务,每个任务负责实现其中的一部分,每个任务都是一个很简单的程序,通常是一个死循环。 RTOS操作系统:FreeRTOS,UCOS,RTX,RT-Thread,DJYOS等。 RTOS操作系统的核心内容在于:实时内核。

1.2 嵌入式操作系统的作用

        操作系统是个软件(管理底层硬件,并且上层应用提供接口)

   

        嵌入式(实时)操作系统特点:用于嵌入式设备的操作系统,具有通用操作系统的基本特点,又具有系统实时性、硬件的相关依赖性、软件固态化以及应用的专用性等特点;

        评判嵌入式(实时)操作系统的重要指标:实时性(中断响应时间、任务切换时间等)、尺寸(可裁剪性 )、可扩展性(内核、中间件);

2 FreeRTOS

2.1 FreeRTOS介绍

  • Free 即免费的,RTOS 全称是 Real Time Operating System,中文就是实时操作系统。注意,RTOS 不是指某一个确定的系统,而是指一类系统。比如 uC/OS,FreeRTOS,RTX,RT-Thread 等这些都是 RTOS 类操作系统。
  • 操作系统允许多个任务同时运行,这个叫做多任务。实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务。任务调度在各个任务之间的切换非常快,就给人们造成了同一时刻有多个任务同时运行的错觉。
  • FreeRTOS 是 RTOS 系统的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,当然,FreeRTOS 不仅局限于在微控制器中使用。但从文件数量上来看 FreeRTOS 要比uC/OSII 和 uC/OSIII 小的多。
  • 选择FreeRTOS:

FreeRTOS是免费的,学习RTOS操作系统的话 uC/OS是首选,但要做产品的话,免费的FreeRTOS操作系统就是个不错的选择。

许多半导体厂商产品的 SDK(Software Development Kit—软件开发工具包) 包就使用 FreeRTOS 作为其操作系统,尤其是 WIFI、蓝牙这些带协议栈的芯片或模块。

简单,因为FreeRTOS 的文件数量很少。

  • FreeRTOS操作系统特点:

FreeRTOS 的内核支持抢占式,合作式和时间片调度。

抢占式:高优先级任务抢占低优先级的任务

时间片调度:如果两个任务优先级一样,每个任务各执行1ms,在各个任务之间快速切换--具体时间是由时间片决定的

合作式:用的比较少

2.2 FreeRTOS 移植

原文件的获取:FreeRTOS官方下载

其中的相应内容查看相关的移植文档,这里就不过多介绍。

2.3 任务创建

任务创建功能分为两种:动态创建和静态创建。

动态创建函数:xTaskCreate()

静态创建函数:xTaskCreateStatic()

其中一般使用最广的就是动态创建任务,创建流程以及先关过程为:

第一步先创建对应的任务句柄:

第二步为创建任务函数,其中的任务函数都是不退出的循环。任务中必须要加入相对应的延时函数vTaskDelay();这个函数等到时间延时到了之后就会释放CPU资源。

第三部为使用动态创建函数:xTaskCreate(),创建任务其中的参数以及返回值为:

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,const char * const pcName,const uint16_t usStackDepth,void * const pvParameters,UBaseType_t uxPriority,TaskHandle_t * const pxCreatedTask ){
//参数1  任务的入口函数地址   
//参数2  任务函数名字   没有啥具体意义
//参数3  任务堆栈的大小   如果堆栈的宽度为 32 位,实际大小为128*4字节  任务越复杂,需要的空间越大
//如何确定任务栈空间需要的大小  先给大一点,通过接口函数查询,再留够余量,缩小回去   https://www.freertos.org/zh-cn-cmn-s/FAQMem.html#StackSize
//参数4  传递给任务的参数  不需要填NULL
//参数5  任务优先级  数字越大,优先级越高  优先级低于 configMAX_priority。 如果未定义 configASSERT,则优先级会被静默限制为 ( configMAX_priority - 1)。
//参数6  任务句柄
//返回值 创建成功  pdPASS  失败返回 xReturn

2.4 任务删除

任务删除函数:vTaskDelete();

删除的任务将从所有就绪,阻塞,挂起和事件列表中删除。

函数参数为:对应任务的句柄。

2.5 任务之间的4种运行状态

就绪态:新创建的任务处于就绪态,可以有多个任务处于就绪态,调度器会调度优先级最高的处于就绪态的任务去执行

挂起态:任务挂起,暂时不执行  只能等待解除挂起 -- 接触挂起任务的状态是就绪态

运行态:有且只有一个任务处于运行态  --  单核处理器

阻塞态:运行的任务遇到系统的延时(vTaskDelay包括相对和绝对延时),信号量的阻塞,运行的任务进入阻塞态 

2.6 临界区保护

如果有一部分代码,在执行的过程中,不希望被打断,就放入临界区

  1. DHT11   SPI   IIC 时序类的一般不能被打断  放入临界区中
  2. 临界资源的保护   比如:printf 
  3. 进入临界区  和 退出临界区 要成对使用

taskENTER_CRITICAL(); 进入临界区

taskEXIT_CRITICAL(); 退出临界区

注意:临界区函数必须是成对使用的

2.7 挂起函数和解除挂起函数

vTaskSuspend()   挂起某个任务
vTaskSuspendAll()   挂起所有任务
vTaskResume()   解挂某个任务
xTaskResumeFromISR() 在中断中解挂任务
xTaskResumeAll()  解挂所有任务

2.8 二值信号量

任务间的通信和同步方式:二值信号量,计数信号量,互斥信号量,消息队列,事件

通信:消息队列

同步:二值信号量  计数信号量  互斥信号量  事件

使用信号量的好处:

实现任务和任务同步或者中断和任务的同步,响应比较及时,比较节省CPU。

二值信号量的使用函数:

创建二值信号量 xSemaphoreCreateBinary() 
信号量删除函数 vSemaphoreDelete() 
任务中释放信号量 xSemaphoreGive()(任务) 
中断中释放信号量 xSemaphoreGiveFromISR()(中断) 
任务中获取信号量 xSemaphoreTake()(任务) 
中断中获取信号量 xSemaphoreTakeFromISR()(中断)

2.9 计数信号量

创建计数信号量 xSemaphoreCreateCounting() 
信号量删除函数 vSemaphoreDelete() 
任务中释放信号量 xSemaphoreGive()(任务) 
中断中释放信号量 xSemaphoreGiveFromISR()(中断) 
任务中获取信号量 xSemaphoreTake()(任务) 
中断中获取信号量 xSemaphoreTakeFromISR()(中断)

2.10 互斥信号量

前提条件:高优先级和低优先级的任务,要申请相同的二值信号量;中优先级的任务和信号量没有关系

  1. 低优先级的任务运行,成功申请信号量
  2. 低优先级任务运行过程中,被高优先级任务打断,但是高优先级任务也需要用这个信号量,但是高优先级申请不成功,被阻塞
  3. 低优先级运行
  4. 低优先级运行过程中,被中优先级打断,地优先级无法快速执行,释放信号量
  5. 中优先级执行完毕,继续执行低优先级
  6. 低优先级执行完毕,释放信号量,高优先级申请成功,继续执行

所谓优先级翻转:高优先级虽然优先级高,但是也没有办法快速获取信号量,优先级的优势没有体现出来。

        当低优先级的任务执行的时候,高优先级暂时把自己的优先级继承给低优先级,那么中优先级就无法打断低优先级,能够让低优先级尽快执行完毕,释放信号量,让高优先级任务使用,这叫做优先级的继承。

互斥量创建函数 xSemaphoreCreateMutex() 
互斥量删除函数 vSemaphoreDelete() 
互斥量获取函数 xSemaphoreTake() 
互斥量释放函数 xSemaphoreGive()

2.11 队列

FreeRTOS 中使用队列数据结构实现任务异步通信工作,具有如下特性:
 消息支持先进先出方式排队,支持异步读写工作方式。
 读写队列均支持超时机制。
 消息支持后进先出方式排队, 往队首发送消息( LIFO) 。
 可以允许不同长度(不超过队列节点最大值)的任意类型消息。
 一个任务能够从任意一个消息队列接收和发送消息。
 多个任务能够从同一个消息队列接收和发送消息。
 当队列使用结束后,可以通过删除队列函数进行删除。

消息队列创建函数 xQueueCreate() 
消息队列静态创建函数 xQueueCreateStatic() 
消息队列删除函数 vQueueDelete() 
消息队列发送函数 xQueueSend()  
消息队列发送函数 xQueueSendToBack()    和上面一个一样,在不同的版本里面
消息队列发送函数 xQueueSendFromISR() 中断中使用
消息队列发送函数 xQueueSendToBackFromISR()  中断中使用
消息队列接收函数 xQueueReceive()与 xQueuePeek() 
xQueueReceive接收消息之后 删除
xQueuePeek  接收消息之后不删除
消息队列接收函数xQueueReceiveFromISR()与 xQueuePeekFromISR()

2.12 事件

将KQM6600&SU03T功能做到一个任务中,使用事件同步做处理

信号量:能够实现任务和任务或者任务和中断的同步,大部分发生在两者之间

事件:可以发生在多对一

KQM6600  是一个任务

DHT11 烟雾  光照  是一个任务

往屏幕上更新数据,希望两个任务都采集到数据,再把数据更新到屏幕上,使用事件可以实现多个任务之间的同步

本质上就是全局变量

事件创建函数 xEventGroupCreate()事件删除函数 vEventGroupDelete()事件组任务中置位函数 xEventGroupSetBits()(任务)事件组中断置位函数 xEventGroupSetBitsFromISR()(中断)等待事件函数 xEventGroupWaitBits()事件组清除函数xEventGroupClearBits()事件组在中断中清除函数xEventGroupClearBitsFromISR()

相关文章:

FreeRTOS实时操作系统

1.认识实施操作系统 1.1 裸机和实时操作系统 裸机: 早期嵌入式开发没有嵌入式操作系统的概念,直接操作裸机,在裸机上写程序,比如用51单片机基本就没有操作系统的概念。 通常把程序设计为前后台系统,主要分为两部分&a…...

C/S、B/S架构(详解)

一、CS、BS架构定义 CS架构(Client-Server Architecture)是一种分布式计算模型,其中客户端和服务器之间通过网络进行通信。在这种架构中,客户端负责向服务器发送请求,并接收服务器返回的响应。服务器则负责处理客户端的…...

代码随想录算法训练营第六十五天|KM99. 岛屿数量——深搜、KM99. 岛屿数量——广搜、KM100. 岛屿的最大面积

代码随想录算法训练营第六十五天 KM99. 岛屿数量——深搜 题目链接:KM99. 岛屿数量 使用递归深度搜索,将每次遇到的岛屿上下左右记录为已经到过,如果遇到没到过的说明它上下左右不是之间遍历过的岛屿,结果计数1。最后统计计数即…...

Lua 面向对象编程

Lua 面向对象编程 Lua 是一种轻量级的编程语言,通常用于嵌入应用程序中,提供灵活的扩展和定制功能。尽管 Lua 本身是一种过程式语言,但它提供了强大的元机制,允许开发者实现面向对象的编程范式。本文将探讨 Lua 中的面向对象编程(OOP)概念、实现方式以及最佳实践。 面向…...

AI赋能前端:你的Chrome 控制台需要AI(爱)

像会永生那样去学习,像明天就要死亡那样去生活。——圣雄甘地 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder 此篇文章所涉及到的技术有 AI(Gemini)ChromeDevTool🪜魔法接码平台因为,行文字数所限,有些概念可能会一带而过亦或者提供对应的学习…...

代码随想录-Day38

509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 …...

CSS阴影优化气泡框样式

<body> <div class"pop">气泡框</div> </body>body{display: flex;justify-content: center;align-items: center;height: 100% } .pop{display: flex;justify-content: center;align-items: center;background: #409eff;width: 150px;heigh…...

强化安全新篇章:韶关石油化工可燃气体报警器年检解析

韶关&#xff0c;这座位于广东省北部的城市&#xff0c;近年来在石油化工行业取得了显著的发展。 随着一批批大型石化企业的进驻和投产&#xff0c;韶关不仅成为了区域性的石化产业基地&#xff0c;也为地方经济带来了强劲的增长动力。 然而&#xff0c;随着石化产业的快速发…...

Centos7 Docker部署PgSQL

拉取镜像 docker pull postgres:14.7运行容器 docker run --restartalways --nethost --shm-size"2g" --name pgsql -v /home/postgresql/data/pgdata:/var/lib/postgresql/data -v /etc/localtime:/etc/localtime -e POSTGRES_PASSWORDtest2023 -d postgres:14…...

LeetCode:经典题之21、24 题解及延伸

系列目录 88.合并两个有序数组 52.螺旋数组 567.字符串的排列 643.子数组最大平均数 150.逆波兰表达式 61.旋转链表 160.相交链表 83.删除排序链表中的重复元素 389.找不同 1491.去掉最低工资和最高工资后的工资平均值 896.单调序列 206.反转链表 92.反转链表II 141.环形链表 …...

【C++11】initializer_list详解!

一、什么是initializer_list? nitializer_list 是一种C11新的类型特性&#xff0c;它允许我们以统一的方式初始化对象。它是一个代表数组的轻量级包装器&#xff0c;通常用于构造函数和函数参数中&#xff0c;以允许传递一个初始化元素列表。 initializer_list也是一种模板类…...

如何在Java中处理UnsupportedOperationException异常?

如何在Java中处理UnsupportedOperationException异常&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;我们经常会遇到各…...

WPS没保存关闭了怎么恢复数据?4个方法(更新版)

想象一下&#xff0c;你正在用WPS奋笔疾书&#xff0c;灵感如泉水般涌出&#xff0c;突然间&#xff0c;电脑却跟你开了个玩笑——啪地一下&#xff0c;文档未保存就关闭了&#xff01;是不是感觉像是被泼了一盆冷水&#xff0c;所有的热情瞬间熄灭&#xff1f;别急&#xff0c…...

elementplus el-table(行列互换)转置

Element Plus v2.4.0, repl v3.4.0 <template> <div><el-table :data"tableData" style"width: 100%"><el-table-column prop"name" label"名字" width"180" /><el-table-column prop"wei…...

Gradle 核心之 Task

一、前言 只有 Task 才可以在 Gradle 的执行阶段去执行&#xff08;其实质是执行的 Task 中的一系列 Action&#xff09;&#xff0c;所以 Task 的重要性不言而喻。 二、Task 2.1 Task 定义与配置 Task 的定义方式有如下两种&#xff1a; Task 的配置方式也有如下两种&#xf…...

【React 】折叠面板,点击展开时再请求数据

需求背景&#xff1a;使用折叠面板的形式展示数据&#xff0c;面板内部数据需要在打开时请求接口获取。 遇到问题&#xff1a;最开始使用Antd 的折叠面板组件&#xff0c;它对于数据直接渲染是没问题的&#xff0c;但是不好满足打开面板时再动态加载数据的需求&#xff0c;于是…...

c++学习 文件操作,模板

文件操作 #include<iostream> #include<string> #include<fstream> using namespace std; //文本操作 //程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会被释放 //通过文件可以数据持久化 //c中对文件操作包含头文件<fstream> /…...

开源与在线 M3U8 Downloader 项目介绍及使用指南

M3U8 是一种用于播放列表格式的文件类型&#xff0c;广泛应用于流媒体服务中&#xff0c;特别是 HLS&#xff08;HTTP Live Streaming&#xff09;协议。它包含了一系列的 TS&#xff08;Transport Stream&#xff09;视频片段地址&#xff0c;使得视频能够分段加载&#xff0c…...

正则表达式与文本处理器

正则表达式 基础正大表达式 查看特定字符 grep grep-n the test.txt grep-in the test.txt-n 显示行号 -i 不区分大小写 -v 反转查找 [] &#xff1a;中括号里可以写元素&#xff0c;内容符合任意元素&#xff0c;就会过滤出来 ^ :写在中括号里&#xff0c;代表取反。以^开头&…...

RedisTemplate方法一览表

数据类型RedisTemplate 方法Redis命令解释应用场景stringopsForValue().set(key, value)SET设置存储在指定 key 下的值存储简单数据&#xff0c;如用户的设置、配置项opsForValue().get(key)GET获取存储在指定 key 下的值读取存储的数据&#xff0c;如用户信息、配置参数opsFor…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...