FreeRTOS学习(1)---为什么使用RTOS

长期以来,我个人都在使用裸机系统进行学习和开发,今天开启一个新的学习篇章,FreeRTOS系统的学习。

接下来对几种常用系统进行介绍和分析

1、轮询系统

·系统模式:

先初始化相关硬件,让主程序在一个死循环里面不断循环,因此只能顺序地处理各种事件。

·例子:

假设有两个任务需要执行,一个是任务一(task1),一个是任务二(task2)。由于轮询系统中任务只能顺序执行,因此在task1的时间中(假设为30min),我们不可以进行task2,这样就会导致task2被搁置。如果task2是紧急事件的话,这是不可接受的。

·伪代码:

在这里插入图片描述

2、前后台系统

·系统模式:

相比轮询系统,前后台系统在轮询系统的基础上加入了中断的概念,外部事件的响应在中断里面完成,事件的处理还是回到轮询系统中完成,中断我们称之为前台,main()函数中的无限循环称为后台。

·例子:

仍然是上面那两个例子,我们将task2设置为中断,信息来临的时候,可以打断正在执行的task1,执行task2。保证了task2的实时性。

· 伪代码:

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

·问题

由我们的伪代码可以看出,如果我们task2在中断里面执行,是可以起到很好的实时性的。但是一旦我们只在中断里面进行标志位置位,仍然把中断执行的程序放在while(1)里面执行,如果task1仍在执行中,这不是还是没起到实时响应的作用吗?

是的,如果中断的任务过多,要放到前台处理的话,并没有良好的实时性。

先回答一个问题:我们为什么不能在中断中放太多的东西?
(1)中断延时:在一个多优先级的系统中,如果一个高优先级中断一直在执行,就会导致一系列低优先级中断的得不到响应,系统实时性大打折扣。
(2)堆栈问题:如果是长时间的低优先级中断的话,其他高优先级尽管可以打断,产生嵌套,但是中断需要堆栈来保存上下文信息,如果每一个中断都有大量的事情需要执行,堆栈占用过多,可能溢出。
(3)数据混乱:在一个中断中涉及大量的数据处理的话,一旦不同的中断对同一个数据进行处理,有可能出现在上一个中断应该处理好的某一个数据没处理好进入下一中断,就会带来混乱。

那么前后台系统相对轮询系统的进步在哪里?
轮询系统是只能顺序执行,对于突发事件没有感知。前后台系统是能够感知,但是不一定能立刻执行(相当于你在打游戏的时候喊你吃饭,你会说知道了等我打完),这取决于这件事的复杂程度是能在前台还是后台执行。

3、多任务系统:RTOS

·系统模式:

在多任务系统中,我们把每一个任务设计成一个个独立的、无限循环的程序。这个小程序我们称之为任务。而且他们都有各自的优先级(可以有相同的优先级)。不用担心这种无限循环怎么切换任务,因为操作系统可以进行调度。

·问题1:

如何体现实时性?
(1)高优先级的任务可以像中断的嵌套一样,高优先级中断抢占低优先级中断---->高优先级任务抢占低优先级任务。
(2)相同优先级任务就是各自运行一段极短的时间,就给人一种都在执行的错觉。
这两种一个是抢占式调度、另一个是时间片调度。
在这里插入图片描述

·问题2:

如果高优先级一直在运行咋样?
低优先级任务会一直卡着不执行,除非进入阻塞态。高优先级任务在等待某些事件(如I/O操作完成或信号量)的过程中会进入阻塞状态。这时,调度器可以执行其他就绪的任务。例如高优先级进行delay的时候系统不会空等,而是让出CPU使用权给低优先级任务。进行任务调度。

·问题3:

我们在前后台系统中使用了中断,在多任务系统中使用中断啥样?
任务的优先级由软件定义,中断的优先级由硬件管理(如NVIC管理)。但是不管中断是什么优先级,是一定能够打断任何优先级的任务的。

4、使用RTOS好处

可以显著提升系统的实时性能,可靠性和可管理性。而且这种任务拆成一个个无限循环的程序,有助于我们对系统任务进行解耦。其他的好处进一步学习的时候再补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值