FreeRTOS实时操作系统

news2024/11/18 1:34:04

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.coloradmin.cn/o/1858579.html

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

相关文章

路由(urls)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Django的URL路由流程: l Django查找全局urlpatterns变量(urls.py)。 l 按照先后顺序,对URL逐一匹…

我做个人站长 7 年的经验,最痛的莫过于。。

大家好,我是程序员鱼皮,从大学期间上线个人博客网站开始,我做个人站长已经有 7 年多了。在这个过程中,我收获了很多,除了技术成长带来的快乐外,个人站长最开心的莫过于有用户使用、并且留下好评&#xff0c…

数据库精选题(七)(综合模拟题二)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀数据库 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 一、名词解释 1、事务 2、弱实体集 3、正…

顶尖项目经理都在用的SOP

接受任务SOP 了解任务背景了解任务目标(包含deadline)拆解任务,确认负责人执行方案审批确认跟进执行并定期汇报验收结果,进行反馈相关文档存档,形成闭环 推进任务SOP - PDCA循环 制定计划 Plan。依据目标&#xff0c…

【面试题】面试小技巧:如果有人问你 xxx 技术是什么?_面试问你对什么技术特别了解

前端工程越来越大,前面几种方案不能很好的支持单元测试。 在这样的背景下,React 诞生了。React 带来了新的思维模式,UI fn(props),React 中一个组件就是一个函数或者一个类,一个函数或者一个类就是一个基础单位&…

OpenFeign 的请求处理流程

流程 1. 定义 Feign 客户端接口 首先,开发者需要定义一个 Feign 客户端接口,并使用 FeignClient 注解进行配置。例如: FeignClient(name "aService", url "http://localhost:8080") public interface ServiceProvid…

数据库 复习题

有一个关系模式:工程关系(工程号,工程名称,职工号,姓名,聘期,职务,小时工资率,工时),公司按照工时和小时工资率支付工资,小时工资率由…

【面试题】马上金九银十了,简历该准备起来了,面试题你准备好了吗 ?浅谈 JS 浅拷贝和深拷贝

代码展示 let obj_old {name: Tom,age: 15,favorite: {food: bread,drink: milk} } let obj_new {...obj_old} console.log(obj_old obj_new) // false console.log(obj_old.name obj_new.name) // true console.log(obj_old.favorite obj_new.favorite) // true3. Ar…

什么是档案业务建设评价

档案业务建设评价是对档案管理机构或部门在档案业务建设方面进行的评估和考核。评价主要根据一定的评价标准和指标,对档案业务的各个方面进行综合评估,包括档案收集、整理、保管、利用等环节,以及档案管理机构的组织管理、技术能力等方面。 评…

OnlyOffice:现代办公的最佳选择

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

【ONLYOFFICE震撼8.1】ONLYOFFICE8.1版本桌面编辑器测评

随着远程工作的普及和数字化办公的发展,越来越多的人开始寻找一款具有强大功能和便捷使用的办公软件。在这个时候,ONLYOFFICE 8.1应运而生,成为了许多用户的新选择。ONLYOFFICE 8.1是一种办公套件软件,它提供了文档处理、电子表格…

19、删除链表的倒数第

1、题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 …

数字图像处理实验报告小论文(Matlab语言)

1.课题分析 在当今信息化社会,图像处理技术已成为众多领域不可或缺的一部分,从医学影像分析到安防监控,再到日常生活中的图片美化,图像处理技术都发挥着至关重要的作用。本次课题主要聚焦于图像灰度处理、图像小波变换和图像分割这…

数字货币与区块链生态

前言:区块链技术与数字货币这一文详细介绍了区块链技术,感兴趣的可以先看看这篇文章 1.比特币之后的数字货币与区块链发展 2.区块链形态 • 无许可区块链(permissionless blockchain) 用户无需许可即可加入区块链网络 • 许…

【简单讲解下C++max函数的使用】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

PSL400PC10P80、PSL410PC10P100、PSL420PC10P60比例换向阀放大器

PSL100PC10P60、PSL110PC10P80、PSL120PC10P100、PSL200PC10P80、PSL210PC10P60、PSL220PC10P100、PSL400PC10P80、PSL410PC10P100、PSL420PC10P60、PSL500PC10P100、PSL510PC10P80、PSL520PC10P100、PSL600PC10P60、PSL610PC10P100、PSL620PC10P60、PSL700PC10P80、PSL710PC10…

【面试题】面试官:判断图是否有环?_数据结构复试问题 有向图是否有环

type: NODE;name: string;[x: string]: any; }; [x: string]: any;}; export type Data Node | Edge; 复制代码 * 测试数据如下const data: Data[] [ { id: ‘1’, data: { type: ‘NODE’, name: ‘节点1’ } }, { id: ‘2’, data: { type: ‘NODE’, name: ‘节点2’ } },…

位置轴轴控功能块封装(CODESYS ST源代码)

博途PLC轴控功能块封装请参考下面文章链接: 1、S7-1200PLC位置控制功能块优化 S7-1200PLC脉冲轴位置控制功能块优化(完整SCL源代码)_s71200 脉冲轴-CSDN博客文章浏览阅读251次。博途PLC 位置控制功能块常用应用,可以参考下面文章链接:1、博…

电脑打印文件怎么操作?

有打印机用户的打印操作 对于已经拥有打印机的用户来说,打印文件通常是一个简单的步骤。首先,你需要将你的文件(如Word、PDF、PPT等)在电脑上打开。然后,点击菜单栏中的“打印”选项,或者快捷键CtrlP&…

ubuntu22.04安装onlyoffice社区版

安装unbuntu22.04 https://blog.csdn.net/qq_36437991/article/details/135915360 安装onlyoffice sudo apt-get update sudo apt-get upgradepostgresql sudo apt-get install postgresql创建用户和数据库 sudo -i -u postgres psql -c "CREATE USER onlyoffice WIT…