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()

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

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

相关文章

Redis(超详细)

Redis Redis概念: Redis是开源的,遵循BSD的,基于内存数据存储,被用于作为数据库、缓存机制、消息中间件; Redis的特点: 1.高性能key/valu内存xing数据库; 2.支持丰富的数据类型 3.支持持久化&am…

信息系统分析与设计:重点内容|UML在线绘制|数据库技术

目录 UML在线绘图工具信息系统分析与设计第1章 系统思想第2章 信息、管理与信息系统第3章 信息系统建设概论🌟第4章 系统规划🌟第5章 系统分析概述第6章 流程建模🌟业务流程图DFD数据流图🌟数据字典 第7章 用例建模(用例图)&#…

Docker搭建yolov8并训练、验证、推理化学仪器数据集

目录 1、安装docker 2、创建yolov8镜像 3、下载代码包 4、下载模型预训练权重 5、制作数据集 6、训练、验证及推理 (1)训练 (2)验证 (3)推理 中文标签显示问题 本文通过docker的方式搭建yolov8运…

OnlyOffice:现代办公的最佳选择

目录 安装 使用 评价 对比(与WPS) 总结 在当今的数字化办公时代,选择一款功能全面且易于使用的办公软件至关重要。OnlyOffice作为一款现代化的办公软件,凭借其强大的功能和友好的用户体验,逐渐成为了众多企业和个…

无线麦克风哪个品牌音质最好,一文告诉你无线领夹麦克风怎么挑选

随着直播带货和个人视频日志(Vlog)文化的兴起,以及自媒体内容创作的蓬勃发展,我们见证了麦克风行业的迅猛发展。在这一浪潮中,无线领夹麦克风以其无与伦比的便携性和操作效率,迅速赢得了广大视频制作者的喜…

前端HTML/CSS知识点系列

1. 什么是块级格式化上下文?【BFC(Block formatting context)】 BFC(Block FormattingContext,块级格式化上下文)是一个独立的渲染区域,其中的元素的布局不会受到外部元素的影响,反之亦然。BFC的创建有助于…

docker环境部署ruoyi系统前后端分离项目

创建局域网 docker network create net-ry 安装Redis 1 安装 创建两个目录 mkdir -p /data/redis/{conf,data} 上传redis.conf文件到/data/redis/conf文件夹中 cd /data/redis/conf 3.2 配置redis.conf文件 配置redis.conf文件: redis.conf文件配置注意&…

轻松两步,借助向量数据库 VectorDB 与千帆 Appbuilder 构建个性化本地问答知识库

在我们日常的工作和生活中,经常会遇到需要快速获取和管理大量信息的情况。无论是解答客户的问题,还是整理公司内部的资料,一个高效的知识库系统都能帮我们省下大量时间和精力。 为了帮助大家快速构建 RAG 应用,我们之前发布了一个…

虚拟机中VSCode+gcc环境配置

一、安装VSCode 1、在官网下载软件包: 地址:Documentation for Visual Studio Code 2、下载后在放置deb包的文件夹直接打开终端,然后输入sudo dpkg -i code_1.90.2-1718751586_amd64.deb 3、安装成功提示,并显示该图标 二、配…

nginx+keepalived+tomcat集群实验

如遇星河 | nginx+keepalived高可用集群实验 木子87 | Keepalived+Nginx+Tomcat 实现高可用Web集群 环境 192.168.40.204 tomcat-1 192.168.40.138 tomcat-2 安装tomcat [root@bogon local]# vim /etc/profile 添加环境变量 JAVA_HOME=/usr/local/java PATH=$J…

mac 常用工具命令集合

一、vim 快捷键 1、移动光标 h j k l 左 下 上 右 箭头上 上移一行 箭头下 下移一行 0 跳至行首,不管有无缩进,就是跳到第0个字符 ^ 跳至行首的第一个字符 $ 跳至行尾 gg 跳至文首 G 调至文尾 5gg/5G 调至第5行w 跳到下一个字首,按标点或…

微信小程序学习(十):生命周期

1、应用生命周期 生命周期说明onLaunch监听小程序初始化,全局只会执行 1 次onShow监听小程序启动或切前台onHide监听小程序切后台 🔗应用生命周期官方文档 App({/*** 当小程序初始化完成时,会触发 onLaunch(全局只触发一次&…

固特超声波清洗机怎么样?三大超声波清洗机美的、固特、希亦谁更好?

眼镜是我们日常生活中不可或缺的用具,但随着使用时间的增长,眼镜上的灰尘和污垢也会逐渐积累,传统的清洗方法往往难以彻底清洁。为了解决这一难题,超声波清洗机出现了!它利用超声波振动原理,可以轻松、快速…

加载资源文件失败

背景 自己以前装了一个海康的深度学习算法平台,试用期是一个月,过了一个月之后,因为没有有效注册码或者加密狗的支持了导致无法使用,于是打算卸载掉,在卸载一个软件的时候,无论是使用控制面板还是软件自带的…

AI写文章生成器,这些工具都可以一键智能生成文章

在AI技术快速发展的今天,AI写作生成器成为我们创作内容的重要工具,它可以提高我们的写作效率,节省时间和精力。下面小编就来和大家分享几款优秀的AI写作生成器,帮助你快速生成高质量的文章。 1.专业AI写作工具-文章在线生成器 专…

计算机网络 访问控制列表以及NAT

一、理论知识 1. 单臂路由 单臂路由是一种在路由器上配置多个子接口的方法,每个子接口代表不同的 VLAN,用于在一个物理接口上支持多 VLAN 通信。此方法使得不同 VLAN 之间可以通过路由器进行通信。 2. NAT (网络地址转换) NAT 是一种在私有网络和公共…

步步精科技诚邀您参加2024慕尼黑上海电子展

尊敬的客户: 我们诚挚地邀请您参加即将于2024年7月8日至7月10日在上海新国际博览中心举办的2024慕尼黑上海电子展(electronica China)。此次展会汇聚了国内外优秀企业,展示从元器件到系统集成方案的完整产品链,为各行…

linux 下配置docker mirrors

一、配置mirrors vi /etc/docker/daemon.json {"registry-mirrors": ["https://docker.blfrp.cn"],"log-opts": {"max-size": "10m","max-file": "3"} }#完成配置后重启docker systemctl restart dock…

自学指南:必备书籍清单--近100本R语言及生物信息相关书籍

R语言是一种功能丰富的编程语言,数据处理、统计分析是大家所熟知的基本功能。开源免费、活跃的全球社区、灵活可扩展等优点促使R语言飞速发展。目前,CRAN 软件包存储库包含 20446 个可用软件包,涵盖了从生物信息到金融分析等广泛的应用领域。…

【uniapp】uniapp开发微信小程序入门教程

HBuilderx中uniapp开发微信小程序入门教程 一、 环境搭建 1. HBuilderx下载安装 HBuilderx下载安装地址 2. 微信开发者工具下载安装 微信开发者工地址具下载安装 二、创建uniapp项目 选择:文件>新建>项目>uni-app 输入项目名称>选择默认模板>…