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基本概念----(猫和老鼠)相关推荐

  1. 从零入门 FreeRTOS 操作系统之任务的概念

    从零入门 FreeRTOS 操作系统之任务的概念 从系统的角度看,任务是竞争系统资源的最小运行单元.FreeRTOS 是一个支持多任务的操作系统.在 FreeRTOS 中,任务可以使用或等待 CPU. ...

  2. 《树莓派Python编程指南》——2.2 一个Python游戏:猫和老鼠

    本节书摘来自华章计算机<树莓派Python编程指南>一书中的第2章,第2.2节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区"华章 ...

  3. FreeRTOS 任务优先级分配方案

    任务优先级说明 下面对 FreeRTOS 优先级相关的几个重要知识点进行下说明,这些知识点在以后的使用中务必要掌握牢固.  FreeRTOS 中任务的最高优先级是通过 FreeRTOSConfig. ...

  4. FreeRTOS临界区应用与总结

    https://blog.csdn.net/chipsea_mltsum/article/details/85612939 项目背景: 做一个测量阻抗脉搏波的设备,设备功能其中之一是采集阻抗信号,通过 ...

  5. FreeRTOS — 消息队列

    以下内容转载自安富莱电子:http://forum.armfly.com/forum.php FreeRTOS 的一个重要的通信机制----消息队列,消息队列在实际项目中应用较多. 1.消息队列 1. ...

  6. FreeRtos 那点事

    FreeRTOS(读作"free-arr-toss")是一个嵌入式系统使用的开源实时操作系统.FreeRTOS被设计为"小巧,简单,和易用",能支持许多不同硬件 ...

  7. freertos 定时器 不启动_FreeRTOS 从入门到精通8--软件定时器应用

    在上一讲 奔腾的心:FreeRTOS 从入门到精通7--队列管理​zhuanlan.zhihu.com 我们介绍了队列管理的相关知识,在这一章中我们将探讨FreeRTOS的另一个特性--软件定时器(S ...

  8. FreeRTOS 事件标志组 ——提高篇

    假设你已经看过FreeRTOS 事件标志组这篇随笔了. 之前的基础篇,真的就只是简单了解一下,相当于大学实验室的实验,但是,我们实际公司项目中,需要更多地思考,就算我们之前只是学习了基础概念以及基础语 ...

  9. 从零入门 FreeRTOS操作系统之信号量

    从零入门 FreeRTOS操作系统之信号量 1 信号量的基本概念 信号量 (Semaphore) 是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问,常用于协助一组相互竞争的任务来访 ...

最新文章

  1. linux c 链接详解4-共享库
  2. Android6.0------权限申请管理(单个权限和多个权限申请)
  3. 让书写的Matlab代码运行更快 Recipes for Faster Matlab Code
  4. 详解DNS正向解析实验(有图有实验)
  5. 【链表+启发式合并】Bzoj1483 [HNOI2009] 梦幻布丁
  6. 信息学奥赛一本通(2065:【例2.2】整数的和)
  7. Python基础8—常用模块
  8. 澳大利亚计算机领域的科学家,澳科学家首创硅基元件 突破量子计算机制造瓶颈...
  9. 去哪网实习总结:JavaWeb配置404页面(JavaWeb)
  10. java web 路径 .html,java web 路径(java web 路径).doc
  11. Android底层开发
  12. 以MQL5 编写的EA 交易程序的测试与优化指南
  13. java 生成的excel 用editplus 打开是乱码_「excel打开是乱码」excel出现中文乱码的解决教程 - seo实验室...
  14. 考研复试(控制工程专硕)及大学本科(物联网工程)知识点回顾(三)——模拟电子技术
  15. Transformer Decoder
  16. Windows8.1环境如何删除FlashHelperService.exe文件
  17. 重庆大学非全日制计算机专业,2018年重庆大学非全日制研究生招生专业目录
  18. 使用sklearn库学习线性回归(二)
  19. InfiniteScroll 无限滚动遇到的坑
  20. PDF转换器如何使用?原来如此简单

热门文章

  1. 在职研究生读计算机专业,读计算机专业在职研究生让我择业自如高升有望
  2. 数据库-Elasticsearch进阶学习笔记(分片、映射、分词器、即时搜索、全文搜索等)
  3. P1567 统计天数(洛谷)
  4. Practical Machine Learning with H2O.2016.12
  5. 【Linux C】进程、线程和进程间通信
  6. iOS各种被拒的原因汇总
  7. matlab 创建批量文件夹_如何在Mac上为照片加水印?水印照片怎样批量处理?
  8. 大华摄像头抓拍图像实时下载
  9. 7.4 用学习工具提高学习的效率——《逆袭大学》连载
  10. SpringMvc思维导图