Freertos基本概念----(猫和老鼠)
1.实时操作系统与非实时操作系统的区别
FreeRTOS中优先级的数值越小,代表该任务的优先级越低,最低优先级为0
解释:哈皮狗的优先级最高 次之是汤姆猫 最后是杰瑞鼠 之后依然用这个例子
现在有一块大肥肉,哈皮狗 汤姆猫 杰瑞鼠都想吃 那么谁先吃呢?
杰瑞鼠看到了一块大肥肉(CPU),迫不及待的就去吃,刚吃一口,汤姆猫来了,杰瑞鼠立刻溜之大吉。汤姆猫开始享受美味,汤姆猫吃饱了离开了/汤姆猫被主人叫走离开了,杰瑞鼠才能继续吃这块肉,你要是问我?汤姆猫要是把肉吃完了,,,,,,你走!
在实时操作系统中,低优先级任务1正在执行,高优先级任务2来了,立刻执行高优先级任务2,只有高优先级任务2执行完或者主动挂起了,任务一才能执行。
杰瑞鼠正在吃肉,汤姆猫还被主人抱着,只有杰瑞鼠吃饱了或者去睡觉了,这块肉才能让汤姆猫吃,同理,最后才轮到哈皮狗来吃 。
在非实时操作系统中,CPU不能被抢占,就算高优先级任务就绪了,也要等着低优先级任务挂起/执行完才能够得到CPU的使用权。
你自己想想实时操作系统重要不?比如:你正在开车,正在打开窗户,突然间前面是红灯/一辆车,你想踩刹车,但是窗户正在打开,不让执行刹车命令,后果是啥?
2.FreeRTOS操作系统功能
优先级调度算法
:哈皮狗吃完 汤姆猫吃 汤姆猫吃完 杰瑞鼠吃,总是让优先级高的先吃
轮换调度算法
:汤姆猫跟杰瑞鼠成为了好朋友,处于同一优先级了。那么肉就可以一起吃
3.任务调度机制的实现
任务调度机制是嵌入式实时操作系统的一个重要概念,也是其核心技术。对于可剥夺型内核,优先级高的任务一旦就绪就能剥夺优先级较低任务的 CPU使用权,提高了系统的实时响应能力。
解释:哈皮狗来了,汤姆猫你就立刻给我gun。
4.FreeRTOS 支持的调度方式
抢占式调度,时间片调度和合作式调度。 实际应用主要是抢占式调度和时间片调度,合作式调度用到的很少。
抢占式调度:每个任务都有不同的优先级,任务会一直运行直到被高优先级任务抢占或遇到阻塞式的 API 函数,比如 vTaskDelay
时间片调度:每个任务都有相同的优先级,任务会运行固定的时间片个数或者遇到阻塞式的 API 函数,比如vTaskDelay,才会执行同优先级任务之间的任务切换。
解释:三个都是朋友了,哈皮狗吃3分钟后,汤姆猫吃2分钟,杰瑞鼠吃1分钟。
5.什么是调度器?
调度器就是使用相关的调度算法来决定当前需要执行的任务。所有的调度器有一个共同的特性:
1.调度器可以区分就绪态任务和挂起任务(由于延迟,信号量等待,邮箱等待,事件组等待等原因而使得任务被挂起)。
2.调度器可以选择就绪态中的一个任务,然后激活它(通过执行这个任务)。 当前正在执行的任务是运行态的任务
3.不同调度器之间最大的区别就是如何分配就绪态任务间的完成时间。嵌入式实时操作系统的核心就是调度器和任务切换,调度器的核心就是调度算法。任务切换的实现在不同的嵌入式实时操作系统中区别不大,基本相同的硬件内核架构,任务切换也是相似的。调度算法就有些区别了。
解释:调度器就相当于猫和老鼠中的主人,我让你吃你就吃,让你睡你就睡,就算你正在吃也可以让你离开。
6.抢占式调度器基本概念
抢占式调度才是Freertos的重中之重。
你想,在抢占式调度的情况下,最高优先级到来了,就立刻执行最高的优先级,总是把最重要的放到第一位。
使用抢占式调度器,使得最高优先级的任务什么时候可以得到 CPU 的控制权并运行是可知的,同时使得任务级响应时间得以最优化。
总结:
每个任务都被分配了不同的优先级,抢占式调度器会获得就绪列表中优先级最高的任务,并运行这个任务。
7.FreeRTOS 抢占式调度器的实现
如果用户在 FreeRTOS 的配置文件 FreeRTOSConfig.h 中禁止使用时间片调度, 那么每个任务必须配置不同的优先级。
杰瑞鼠开始吃,汤姆猫来了。
杰瑞鼠跑,汤姆猫吃。
汤姆猫吃了一会,糟糕,哈皮狗来了,赶快溜。
哈皮狗吃着,主人叫了一声离开了。
汤姆猫见状,立马飞奔去吃,杰瑞鼠打不过只好看着。
汤姆猫吃着一看哈皮狗来了,跑呀,,,
哈皮狗继续吃。
官话: 创建 3 个任务 Task1(杰瑞鼠),Task2(汤姆猫) 和 Task3(哈皮狗)。
1 .任务 Task1 在运行中,运行过程中由于 Task2 就绪,在抢占式调度器的作用下任务 Task2 抢占 Task1 的执行。 Task2 进入到运行态,Task1由运行态进入到就绪态。
2 .任务 Task2 在运行中,运行过程中由于 Task3 就绪,在抢占式调度器的作用下任务 Task3 抢占 Task2 的执行。 Task3 进入到运行态,Task2 由运行态进入到就绪态。
3 .任务 Task3 运行过程中调用了阻塞式 API函数,比如 vTaskDelay,任务 Task3 被挂起,在抢占式调度器的作用下查找到下一个要执行的最高优先级任务是 Task2,任务 Task2 由就绪态进入到运行态。
4 . 任务 Task2 在运行中,运行过程中由于 Task3 再次就绪,在抢占式调度器的作用下任务 Task3 抢占 Task2 的执行。 Task3 进入到运行态,Task2 由运行态进入到就绪态。
8.时间片调度器基本概念
时间片调度适合用于不要求任务实时响应的情况,Round-robin 调度算法需要给同优先级的任务分配一个专门的列表,用于记录当前就绪的任务,并为每个任务分配一个时间片(也就是需要运行的时间长度,时间片用完了就进行任务切换)。
在 FreeRTOS 操作系统中只有同优先级任务才会使用时间片调度,另外还需要用户在 FreeRTOSConfig.h 文件中使能宏定义:
#define configUSE_TIME_SLICING 1 默认情况下,此宏定义已经在 FreeRTOS.h 文件里面使能了,用户可以不用在 FreeRTOSConfig.h 文件中再单独使能。
规定狗猫鼠都只能吃10s
杰瑞鼠吃10s,汤姆猫吃。
汤姆猫吃7s时,主人叫走了。还少吃3s,没办法。
立刻,哈皮狗吃10s。
接着再从杰瑞鼠开始吃。
注意:下一轮吃的时候,汤姆猫没被叫走的话,也是吃10s。
官话:创建 3 个任务 Task1(杰瑞鼠),Task2(汤姆猫) 和 Task3(哈皮狗)。
每个任务分配的时间片大小是 10个系统时钟节拍。
1.先运行任务 Task1,运行够 10 个系统时钟节拍后,通过时间片调度切换到任务 Task2。
2. 任务 Task2 运行够 7个系统时钟节拍后,调用了阻塞式 API 函数,调用函数时,虽然 10 个系统时钟节拍的时间片大小还没有用完,此时依然会通过时间片调度切换到下一个任务 Task3。(注意,没有用完的时间片不会再使用,下次任务 Task3 得到执行还是按照 10个系统时钟节拍运行)
3. 任务 Task3 运行够 10个系统时钟节拍后,通过时间片调度切换到任务 Task1。
总结:时间片调度和抢占式调度我们一般都是开启了的,这样优先级相同时,使用时间片调度,优先级不同时,使用抢占式调度。默认情况下,在 freertos.h 中使能了时间片调度。而抢占式调度需要我们用户自己开启,一般在 freertosconfig.h 中使能
9. 时间管理的实现
汤姆猫吃到xTickCount=7s时,被叫走了。
汤姆猫离开了xTicksToDelay s,回来了,
此时是xTimeToWake 。
把这个时间记录下来
如果再从新开始吃,
没有溢出:xTimeToWake >xTickCount
发生溢出:xTimeToWake <xTickCount
官话:FreeRTOS 提供的典型时间管理函数是 vTaskDelay(),调用此函数可以实现将任务延时一段特定时间的功能。
FreeRT0S 中,若一个任务要延时 xTicksToDelay 个时钟节拍,系统内核会把当前系统已运行的时钟节拍总数(定义为 xTickCount,32 位长度)加上 xTicksToDelay 得到任务下次唤醒时的时钟节拍数
xTimeToWake。然后,内核把此任务的任务控制块从就绪链表中删除,把 xTimeToWake 作为结点值赋予任务的xItemValue,再根据 xTimeToWake 的值把任务控制块按照顺序插入不同的链表。
若 xTimeToWake >xTickCount,即计算中没有出现溢出,内核把任务控制块插入到 pxDelayedTaskList 链表;
若 xTimeToWak e<xTickCount,即在计算过程中出现溢出,内核把任务控制块插入到 pxOverflowDelayed-Taskust 链表。
10.内存分配策略
每当任务、队列和信号量创建的时候,FreeRTOS 要求分配一定的 RAM。虽然采用 malloc()和 free()函数可以实现申请和释放内存的功能,但这两个函数存在以下缺点:
并不是在所有的嵌入式系统中都可用,要占用不定的程序空间,可有着人性欠缺以及执行时间具有不可确定性等缺点。为此,除了可采用
malloc()和 free()函数外,FreeRTOS 还提供了另外两种内存分配的策略,用户可以根据实际需要选择不同的内存分配策略。
第 1 种方法是,按照需求内存的大小简单地把一大块内存分割为若干小块,每个小块的大小对应于所需求内存的大小。这样做的好处是比较简单,执行时间可严格确定,适用于任务和队列全部创建完毕后再进行内核调度的系统;这样做的缺点是,由于内存不能有效释放,系统运行时应用程序并不能实现删除任务或队列。
哈皮狗吃的多分的多,汤姆猫中等就次之,杰瑞鼠吃的少就分的少,正好对应各自的需求。
第 2 种方法是,采用链表分配内存,可实现动态的创建、删除任务或队列。系统根据空闲内存块的大小按从小到大的顺序组织空闲内存链表。当应用程序申请一块内存时,系统根据申请内存的大小按顺序搜索空闲内存链表,找到满足申请内存要求的最小空闲内存块。为了提高内存的使用效率,在空闲内存块比申请内存大的情况下,系统会把此空闲内存块一分为二。一块用于满足申请内存的要求,一块作为新的空闲内存块插入到链表中。
比如:一块肉30斤,分了3份。5斤,10斤,15斤
汤姆猫的饭量是8斤。所以分给汤姆猫的是10斤肉,
但是还有两斤吃不完,那就当作了空闲的肉。
总结:
参考:微信公众号 “硬件十万个为什么”
欢迎指正!
Freertos基本概念----(猫和老鼠)相关推荐
- 从零入门 FreeRTOS 操作系统之任务的概念
从零入门 FreeRTOS 操作系统之任务的概念 从系统的角度看,任务是竞争系统资源的最小运行单元.FreeRTOS 是一个支持多任务的操作系统.在 FreeRTOS 中,任务可以使用或等待 CPU. ...
- 《树莓派Python编程指南》——2.2 一个Python游戏:猫和老鼠
本节书摘来自华章计算机<树莓派Python编程指南>一书中的第2章,第2.2节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区"华章 ...
- FreeRTOS 任务优先级分配方案
任务优先级说明 下面对 FreeRTOS 优先级相关的几个重要知识点进行下说明,这些知识点在以后的使用中务必要掌握牢固. FreeRTOS 中任务的最高优先级是通过 FreeRTOSConfig. ...
- FreeRTOS临界区应用与总结
https://blog.csdn.net/chipsea_mltsum/article/details/85612939 项目背景: 做一个测量阻抗脉搏波的设备,设备功能其中之一是采集阻抗信号,通过 ...
- FreeRTOS — 消息队列
以下内容转载自安富莱电子:http://forum.armfly.com/forum.php FreeRTOS 的一个重要的通信机制----消息队列,消息队列在实际项目中应用较多. 1.消息队列 1. ...
- FreeRtos 那点事
FreeRTOS(读作"free-arr-toss")是一个嵌入式系统使用的开源实时操作系统.FreeRTOS被设计为"小巧,简单,和易用",能支持许多不同硬件 ...
- freertos 定时器 不启动_FreeRTOS 从入门到精通8--软件定时器应用
在上一讲 奔腾的心:FreeRTOS 从入门到精通7--队列管理zhuanlan.zhihu.com 我们介绍了队列管理的相关知识,在这一章中我们将探讨FreeRTOS的另一个特性--软件定时器(S ...
- FreeRTOS 事件标志组 ——提高篇
假设你已经看过FreeRTOS 事件标志组这篇随笔了. 之前的基础篇,真的就只是简单了解一下,相当于大学实验室的实验,但是,我们实际公司项目中,需要更多地思考,就算我们之前只是学习了基础概念以及基础语 ...
- 从零入门 FreeRTOS操作系统之信号量
从零入门 FreeRTOS操作系统之信号量 1 信号量的基本概念 信号量 (Semaphore) 是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问,常用于协助一组相互竞争的任务来访 ...
最新文章
- linux c 链接详解4-共享库
- Android6.0------权限申请管理(单个权限和多个权限申请)
- 让书写的Matlab代码运行更快 Recipes for Faster Matlab Code
- 详解DNS正向解析实验(有图有实验)
- 【链表+启发式合并】Bzoj1483 [HNOI2009] 梦幻布丁
- 信息学奥赛一本通(2065:【例2.2】整数的和)
- Python基础8—常用模块
- 澳大利亚计算机领域的科学家,澳科学家首创硅基元件 突破量子计算机制造瓶颈...
- 去哪网实习总结:JavaWeb配置404页面(JavaWeb)
- java web 路径 .html,java web 路径(java web 路径).doc
- Android底层开发
- 以MQL5 编写的EA 交易程序的测试与优化指南
- java 生成的excel 用editplus 打开是乱码_「excel打开是乱码」excel出现中文乱码的解决教程 - seo实验室...
- 考研复试(控制工程专硕)及大学本科(物联网工程)知识点回顾(三)——模拟电子技术
- Transformer Decoder
- Windows8.1环境如何删除FlashHelperService.exe文件
- 重庆大学非全日制计算机专业,2018年重庆大学非全日制研究生招生专业目录
- 使用sklearn库学习线性回归(二)
- InfiniteScroll 无限滚动遇到的坑
- PDF转换器如何使用?原来如此简单
热门文章
- 在职研究生读计算机专业,读计算机专业在职研究生让我择业自如高升有望
- 数据库-Elasticsearch进阶学习笔记(分片、映射、分词器、即时搜索、全文搜索等)
- P1567 统计天数(洛谷)
- Practical Machine Learning with H2O.2016.12
- 【Linux C】进程、线程和进程间通信
- iOS各种被拒的原因汇总
- matlab 创建批量文件夹_如何在Mac上为照片加水印?水印照片怎样批量处理?
- 大华摄像头抓拍图像实时下载
- 7.4 用学习工具提高学习的效率——《逆袭大学》连载
- SpringMvc思维导图