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

freertos学习之路1-裸机和rtos的区别

写在最前

由于工作需要,需要开始学习freertos的相关知识,本专题主要记录freertos的相关内容

参考:

https://www.bilibili.com/video/BV19g411p7UT 正点原子视频

1. 裸机和rtos的多任务处理

试想一种场景,我们正在打游戏,但女朋友在你打游戏的过程中给你发送消息,你需要回复消息

image-20230203173902379

1.1 裸机处理方式

while(1) 
{ 
	打游戏();
	回复信息(); 
}

玩过51或者stm32的裸机编程的人都知道,我们往往会在应用程序写一个大循环,如果你一把游戏30min,那么你就得30min后才能执行回复信息的任务,那么你女朋友就会找你麻烦了😆打完游戏才能发送信息,回完信息才能继续打游戏,如下图
在这里插入图片描述

1.2 RTOS行为

void main(void) 
{ 
	/* 创建打游戏任务 */
	xTaskCreate(打游戏)
	/* 创建回复信息任务 */ 
	xTaskCreate(回复信息)
}
void 游戏(void) 
{ 
   while(1) 
   { 
	 打游戏();
   }
}
void 信息(void) 
{ 
   while(1) 
   { 
	 回复信息();
   }
}

而rtos不和裸机相同,它会让打游戏运行一个时间片,回复信息运行一个时间片,一个时间片的时间是可以我们自己设置的,就是滴答定时器的一个节拍,例如我们可以设置1ms来运行,这有点类似于一个伪多线程,在微观来看我们实际是两个任务交替运行,但是宏观上我们却感觉两个任务在同时运行,妥妥的游戏得意,情场得意6️⃣,如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6MXiN2pO-1675423742794)(C:\Users\zh006\Desktop\images\image-20230203175210812.png)]

2. 裸机和rtos的优先级处理

同样的场景,假设此时小明肚子疼了,要去医院,此时裸机与RTOS又会怎么做呢?

在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.1 裸机处理

这时我们可能就知道,这个时候用中断阿,并把它设为一个比较高的优先级,毕竟生命安全第一位,我们可以定义一个中断服务程序,一肚子痛就触发中断去医院,但我们注意,中断是一瞬间的事情,我们不能在中断服务函数做太多的事,比如我们在终端服务函数做一个delay个10ms,程序可能就会出现问题例如:

  • 中断处理时间太长或导致正常的应用程序不能按时被执行;
  • 执行中断时不能响应其他中断,中断执行时间太长容易丢其他中断;
  • 某个中断服务程序执行时间太长,可能导致中断嵌套非常深,容易导致栈溢出,也容易出现逻辑问题。

去医院就是一个长任务,需要坐车挂号看医生,很显然,我们不能把去医院放在中断中

但是呢,玩过单片机的我们都知道,对中断的处理我们一般都是设置一个全局的标志位,我们只需要在中断函数中设置标志位,然后再大循环中去判断这个标志位就可以了,代码如下:

while(1) 
{ 
	打游戏();
	回复信息(); 
	if(FLAG == 1)
	{
	   去医院();
	   FLAG = 0;
	}
}

但是假如我们此时再打游戏中,打游戏这个任务需要运行30min,即使此时FLAG这个标志位已经在中断中被置为1了也无济于事,仍然要等运行完上面两个任务才能进行下面的判断,实时性非常差

2.2 rtos处理

而rtos的处理方式就相当的优雅了,我们可以创建三个任务,并把去医院设为高优先级,让rtos系统自己去进行调度,并且我们注意一种情况,当去医院这个任务在运行没有占有cpu资源时,例如挂号要等待,此时cpu又可以分配给低优先级的任务,例如打游戏回信息,这样我们就很好的使用了cpu的资源

void main(void) 
{ 
	/* 创建打游戏任务 */
	xTaskCreate(打游戏)
	/* 创建回复信息任务 */ 
	xTaskCreate(回复信息)
	/* 创建去医院任务 */ 
	xTaskCreate(去医院)
}
void 游戏(void) 
{ 
   while(1) 
   { 
	 打游戏();
   }
}
void 信息(void) 
{ 
   while(1) 
   { 
	 回复信息();
   }
}
void 去医院(void) 
{ 
   while(1) 
   { 
	 去医院();
   }
}

3. 裸机和rtos的区别

3.1 裸机

裸机:裸机又称为前后台系统,前台系统指的中断服务函数,后台系统指的大循环,即应用程序

  • 实时性差:(应用程序) 轮流执行
  • delay:空等待,CPU不执行其他代码
  • 结构臃肿:实现功能都放在无限循环

在这里插入图片描述

3.2 rtos

RTOS特点:RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性

  • 分而治之:实现功能划分为多个任务
  • 延时函数:任务调度
  • 抢占式:高优先级任务抢占低优先级任务,更高优先级也可以先运行
  • 任务堆栈:每个任务都有自己的栈空间,我们低优先级任务被抢占后,cpu重新回到自己手里,是从之前那个位置继续执行,因此这个栈空间需要有相关的信息,例如:寄存器的值局部变量…,这和c语言的linux多线程编程有点类似

在这里插入图片描述

值得注意的是,rtos也有中断,我们前面的任务调度其实是软件层面上的说法,而中断的优先级是最高的

相关文章:

  • 瞧不上alert 老古董?使用alert实现一个精美的弹窗
  • 2023华数杯B题社会稳定预警研究的材料支撑以及解题思路【全网独家社会稳定预警研究材料支撑】
  • 【内网安全-隧道搭建】内网穿透_Ngrok上线(美版、国版二开)
  • 最全面的SpringBoot教程(二)——SpringBoot配置文件
  • 早已有所耳闻的堆排序,你知道如何用C语言实现吗? 【堆排序|C语言版】
  • 某书x-s和web_session
  • C语言--模拟实现库函数strcpy
  • Python爬虫以及数据可视化分析之某站热搜排行榜信息爬取分析
  • stream操作常用API 示例详解
  • GitHub2022年十大热门编程语言榜单
  • 利用STC15输出两路互补SPWM波形
  • 我发现买不起自己出版的书了,这到底是咋回事?
  • 「自定义类型」C语言中的构造数据类型如结构,联合,枚举
  • 【C++修炼之路】C++入门(下)
  • 【C++】C++11语法 ~ 可变参数模板
  • 分享一款快速APP功能测试工具
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 4. 路由到控制器 - Laravel从零开始教程
  • Android单元测试 - 几个重要问题
  • classpath对获取配置文件的影响
  • css布局,左右固定中间自适应实现
  •  D - 粉碎叛乱F - 其他起义
  • Java 多线程编程之:notify 和 wait 用法
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript设计模式与开发实践系列之策略模式
  • jquery cookie
  • MaxCompute访问TableStore(OTS) 数据
  • Python语法速览与机器学习开发环境搭建
  • TCP拥塞控制
  • Vultr 教程目录
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 高程读书笔记 第六章 面向对象程序设计
  • 工作中总结前端开发流程--vue项目
  • 聊聊sentinel的DegradeSlot
  • 数据可视化之 Sankey 桑基图的实现
  • 说说动画卡顿的解决方案
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 为视图添加丝滑的水波纹
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 携程小程序初体验
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • Java总结 - String - 这篇请使劲喷我
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​Spring Boot 分片上传文件
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​虚拟化系列介绍(十)
  • # 透过事物看本质的能力怎么培养?
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #Z2294. 打印树的直径
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (26)4.7 字符函数和字符串函数
  • (简单) HDU 2612 Find a way,BFS。
  • (转载)CentOS查看系统信息|CentOS查看命令