ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

FreeRTOS多任务操作系统简单理解

2021-07-10 18:33:24  阅读:287  来源: 互联网

标签:优先级 操作系统 FreeRTOS 中断 任务 按键 多任务 运行


声明:博主是刚开始进行FreeRTOS的学习,对于很多地方都只是自己的理解,或许有很多没有意识到的错误,如果您发现有什么问题,劳烦指出笔者必及时修改,也希望可以给更多看到这篇博文的人传递正确的信息。

实时多任务系统理解

FreeRTOS是一个抢占式的实时多任务系统,多任务系统是将一个大问题分成很多个小任务,任务就可以理解为裸机开发中的每一个功能的函数,但是和函数不一样的是,裸机开发在进入到某个函数中,在结束当前函数前,其他的任何事项都会被搁置,也就是意味着同一时间只能有一个任务运行,但是操作系统却允许多任务同时运行,类比我们的电脑,如果一次只能运行一个任务,那么移动鼠标的时候音乐就会被停止,打开网页的时候,鼠标就动不了了,只能等待网页打开结束才能移动鼠标,因为一次只能进行一个任务,而实际生活中,我们可以一边听着音乐一边浏览网页,顺便还能和同学聊聊天,这就归于操作系统的任务调度器,决定了在某一时刻究竟运行哪个任务。

实际上,一个处理器核心在某一时刻确实是只能运行一个任务的,为什么说操作系统可以同时运行多个任务呢,刚才提到的任务调度器,在各个任务之间快速的切换,这就给我们一种好像同一时刻有很多个任务同时在运行的感觉,为方便理解,就称作同一时刻运行多个任务,刚才提到的在任务中快速切换,很形象的一点就是,我们买电脑一定会看的一个参数——CPU 的主频,主频越快,速度越快,实际上指的就是任务切换的非常快,而主频慢的CPU正是由于在任务切换中过慢,导致我们感觉电脑卡顿。

另外操作系统的特点,还是由一个例子来引出:我们需求写一个让两个led灯每秒闪烁一次的代码,接着引入第一个按键,按下该按键,保留第一个led1灯的状态,但是不影响led2的闪烁,按下第二个按键,将保留led2的状态,但是不影响led1的闪烁,再次按下按键则恢复对应的led状态,需求每次保留灯的状态的时候,也必须保留led灯亮灭的时间,比如亮了0.3s,按键使它保留,松开按键的话,它只能再亮0.7s,然后继续保持每秒闪烁。

如果裸机开发的话,想要实现这样的场景,该怎么做?

用中断可以实现吗,配置定时器函数,主函数进行led闪烁,中断判断按键是否按下,按下就暂停计时器计数,松开则恢复计数器,计时器每溢出一次就改变一次led的状态,如果一个led灯这样做是可行的,但这里是两个led灯,那就得设置两个不同的定时器,分别进行计数和暂停,想想就感觉十分复杂,如果还想加入按下一个按键就向串口返回当前两个led状态呢,这才只是点亮了个led灯,明明只是这么简单的任务,结果已经占用了这些中断资源和等待时间,这些资源对于32来说,确实都有,那么我要继续将这些安装到一个遥控车上,遥控车受到控制信号灵敏响应需要中断,车辆轮子转速控制需要实时速度用编码器需要中断,车辆避障为确保灵敏也需要中断,再加上不可避免的要使用delay()来延时,笔者曾深刻感到中断不够用,而且反应十分缓慢,一度更改代码框架也难以有很好的提升,一方面是笔者写代码写的很差劲,另一方面也体现出前后台系统的上限,实时性不足,对于简单的任务(不需要大量的实时性的任务)来说前后台系统很好用,而对于某些需求来说,即使只是点个led灯,都无法正常运作。

那么使用FreeRTOS又如何实现上述问题呢?

FreeRTOS中实时应用作为一个独立的任务,就像裸机开发中的函数一样,每个任务执行自己对应的功能,并且每个任务都有自己的运行环境,不依赖于系统中的其他任务或者RTOS调度器,虽然任何时间都只有一个任务在运行,但具体运行哪一个任务是由RTOS调度器决定的,任务不需要了解RTOS调度器的具体行为,每个任务都有自己的堆栈,RTOS调度器的职责就是在每个任务切换的时候,确保其堆栈和寄存器内容不变,随时可以恢复之前的状态继续运行。

FreeRTOS是一个抢占式的实时多任务系统,抢占就意味着任务之间有优先级,高优先级的任务可以打断低优先级的任务,就像是裸机开发中的中断,但又不是中断,RTOS的运行过程如下图:

任务状态:

 每个任务都会处于如下几个状态:

运行态:就是正在运行任务的状态,这个没什么解释的。

阻塞态:就像外部中断一样,阻塞态的任务在等待着某个信号,上述说到的 vTaskDelay() 函数就像是 delay() 延时函数,而阻塞态就是在等待着延时结束这个信号,所以说某个任务调用了 vTaskDelay() 就会进入阻塞态:这个任务在等待延时结束这个信号!!!千万不要误解为只有调用vTaskDelay()函数就进入阻塞态,实际上不只是等待延时结束,处于阻塞态的任务也可以是等待某个传感器发来的信号,某个串口传来的信息等。就像我们把串口通信写进定时器中断一样,每进入一次中断判断一次,没有就退出,阻塞态也是一样,没有等到信号量,达到了超市时间,任务就会推出阻塞态。

挂起态:任务挂起的意思是什么呢,就是暂时脱离了整个内核调用,它不在运行了,内核也不调用它了,但是进入挂起前的所有状态都被保存着,等待着退出挂起。

就绪态:先了解上面的三种状态了,来说明就绪态,阻塞态超时了之后会怎么样呢,有新的任务将会去执行,而这个等待某个信号的任务已经不处于阻塞态了,但是也并没有被挂起,而且也没有运行,这时它就处于就绪态,已经准备好了,但是现在还在执行别的任务,就这这边等待,可以随时运行,这就是就绪态。

这下再看这幅图,是否对这几种状态有所了解。

 上图中箭头的函数正是接着要使用和学习的函数,先不继续,回想一开始的点灯任务,如果用FreeRTOS如何实现呢:

分别创建led1和led2闪烁的任务,接着创建按键一和按键二的任务,当按下按键一的时候挂起led1闪烁,再按下按键一的时候,取消led1任务的挂起,同理led2和按键二也如此,挂起保存了当前运行的所有状态,所以不需要在意时间保留的问题,那些数值都被保存,而且没有使用中断,并且FreeRTOS的任务可以分配0~(configMAX_PRIORITIES-1)的优先级,并且当宏 configUSE_TIME_SLICING 定义为1 的时候还允许多个任务共用一个优先级,FreeRTOS调度器确保处于就绪态或者运行态的高优先级任务获得处理器使用权,其他处于就绪态的同优先级的任务会使用时间片转调度器获取运行时间,那么任务优先级和中断优先级有什么关系吗?答案是没有。

FreeRTOS任务优先级和中断优先级

中断优先级和任务优先级这两个之间没有任何关系,不管中断的优先级是多少,中断的优先级永远高于任何任务的优先级,即任务在执行的过程中,中断来了就开始执行中断服务程序,这样的话我们同时拥有了任务优先级,和中断优先级,实时性是不是就上来了。

这里转载一个任务优先级分配方案(出自STM32用FreeRTOS时任务优先级和中断优先级说明 - 骑单车去旅行 - 博客园 (cnblogs.com)

IRQ 任务:IRQ 任务是指通过中断服务程序进行触发的任务,此类任务应该设置为所有任务里面优先级最高的。

高优先级后台任务:比如按键检测,触摸检测,USB 消息处理,串口消息处理等,都可以归为这一类任务。

低优先级的时间片调度任务:比如 emWin 的界面显示,LED 数码管的显示等不需要实时执行的都可以归为这一类任务。 实际应用中用户不必拘泥于将这些任务都设置为优先级 1 的同优先级任务,可以设置多个优先级,只需注意这类任务不需要高实时性。

空闲任务:空闲任务是系统任务。

 

标签:优先级,操作系统,FreeRTOS,中断,任务,按键,多任务,运行
来源: https://www.cnblogs.com/rezhu-enable/p/14992967.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有