实时操作系统Freertos开坑学习笔记:(一):基础概念及代码移植


前言

`这篇博客记录我学习正点原子freertos操作系统的过程。总共包括以下这些章节:
在这里插入图片描述

一、RTOS和裸机的区别?各自的优点缺点?

RTOS(Real-Time Operating System,实时操作系统)是一种专门为实时应用程序设计的操作系统,而裸机则是指直接在硬件上运行的程序,没有操作系统的支持。

以下是RTOS和裸机的区别以及各自的优点和缺点:

RTOS的优点:
1.实时性:RTOS专门为实时应用程序设计,能够提供可预测的响应时间和任务调度。
2.多任务支持:RTOS能够支持多任务并发执行,通过任务调度器实现任务切换。
3.丰富的功能和服务:RTOS通常提供丰富的功能和服务,如任务管理、通信机制、内存管理、设备驱动等。

RTOS的缺点:
复杂性:RTOS相对于裸机来说,具有更高的复杂性,需要学习和理解操作系统的概念和机制。
资源占用:RTOS需要额外的资源支持,如内存、处理器时间等,可能会占用一定的系统资源。
开发和调试难度:由于RTOS的复杂性,开发和调试RTOS应用程序可能会更加困难。

裸机的优点:
简单性:裸机程序相对于RTOS来说更加简单,不需要学习和理解操作系统的概念和机制。
资源效率:裸机程序不需要额外的资源支持,可以更好地利用系统资源。
可定制性:裸机程序可以根据需求进行定制开发,不受RTOS的限制。

裸机的缺点:
缺乏实时性:裸机程序无法提供实时性,无法保证任务的响应时间和调度。
不支持多任务:裸机程序无法支持多任务并发执行,只能顺序执行任务。
缺乏丰富的功能和服务:裸机程序无法提供像RTOS那样丰富的功能和服务,如任务管理、通信机制、内存管理、设备驱动等。
综上所述,RTOS适用于对实时性能要求较高、需要多任务支持和丰富功能服务的应用,而裸机适用于对实时性能要求不高、对资源效率和可定制性有要求的应用。

在这里插入图片描述
这个图很清楚,裸机在while循环里,永远只能先做这件事,再做那件事,不能同时进行。
而实时操作系统,他把时间分成很多个时间片,比如1ms间隔一个时间片,我先打游戏,间隔1ms又回消息,在隔1ms又打游戏,(好比faker打英雄联盟,瞬间切出任务管理器,又迅速切回英雄联盟,又切到4399小游戏,又切回去,过程很快,那么人眼看来在极短的时间里这几个任务同时发生了)。虽然不是说完全意义上的同时运行,都是间隔非常短的情况下,人眼是无法察觉出两个任务有明显的时间差的。

在这里插入图片描述
打游戏和回消息是相同的优先级,那如果这是出现肚子疼这个更高优先级的事件,对于裸机而言,利用中断执行肚子疼去医院动作,但是这个去医院动作会执行很长时间,中断迟迟不结束,便极大的影响了系统实时性。
那RTOS呢?他会将肚子疼去医院这个任务的优先级设置为更高,如果出现肚子疼,那么会优先执行去医院任务,然后用时间片处理低优先级任务。
在这里插入图片描述
在这里插入图片描述
操作系统中每个任务都是独立的,正常时较高优先级任务运行,可以利用延时函数进行延时时执行较低优先级任务。

1. 如果高优先级任务一直运行,会怎么办?

答:会一直执行,导致低优先级任务无法运行。
为了避免高优先级任务长时间占用CPU的问题,可以采取以下措施:

1.合理设置任务优先级:为任务设置适当的优先级,确保高优先级任务能够及时得到执行,但不过度占用CPU资源。
2.使用时间片轮转调度算法:时间片轮转调度算法可以保证每个任务都能够获得一定的执行时间,防止某个任务长时间占用CPU。
3.使用中断机制:如果高优先级任务需要实时响应某个事件,可以使用中断机制,将事件处理放在中断服务程序中,避免任务长时间占用CPU。
4.使用任务延时函数:在高优先级任务中适当使用任务延时函数,使得任务在执行一段时间后主动释放CPU,给低优先级任务执行的机会。

2.总结

在这里插入图片描述

二、freertos简介

FreeRTOS(Free Real-Time Operating System)是一个开源的实时操作系统(RTOS),专门用于嵌入式系统。它提供了一个小巧、高效、可移植的内核,适用于多种处理器架构和开发平台。

FreeRTOS的特点和优势包括:
小巧高效:FreeRTOS的内核非常小巧,内存占用和代码尺寸都很小,适合于资源有限的嵌入式系统。它采用了事件驱动的设计,具有低延迟和高实时性。
可移植性强:FreeRTOS的内核被设计成高度可移植的,可以方便地移植到各种处理器架构和开发平台,包括ARM、MIPS、x86等。
多任务支持:FreeRTOS支持多任务并发执行,可以创建和管理多个任务,实现任务的调度和切换。它提供了任务优先级管理、时间片轮转调度等功能,可以满足实时性要求。
④丰富的功能:FreeRTOS提供了一系列的功能和服务,包括任务管理、事件管理、信号量和互斥量、消息队列、定时器等。这些功能可以帮助开发者更方便地实现复杂的嵌入式应用。
⑤丰富的生态系统和社区支持:FreeRTOS拥有庞大的用户社区,提供了大量的文档、示例代码和支持资源。同时,它也有许多相关的工具和扩展,如FreeRTOS+,可以进一步增强系统的功能和性能。

总之,FreeRTOS是一个功能强大、易于使用和高度可移植的实时操作系统,广泛应用于嵌入式系统开发,包括工业控制、物联网、汽车电子、消费电子等领域。

三、freertos基础知识

1.任务调度

在这里插入图片描述

(1)抢占式调度:

FreeRTOS的抢占式调度是指当一个高优先级任务就绪时,它可以立即抢占正在执行的低优先级任务,以确保高优先级任务能够及时得到执行
在FreeRTOS中,每个任务都有一个优先级,优先级高的任务具有更高的执行优先级。当一个高优先级任务就绪时,如果当前正在执行的任务优先级低于该任务,FreeRTOS会立即进行任务切换,将CPU的控制权交给高优先级任务。

抢占式调度可以确保高优先级任务能够及时响应紧急事件或满足实时性要求。它使得高优先级任务能够在任何时刻抢占低优先级任务的执行,而不需要等待低优先级任务自行释放CPU。抢占式调度的实现依赖于硬件的中断机制和RTOS的任务调度器。当一个中断事件发生时,中断服务程序(ISR)可以通过请求任务切换,将控制权转移到高优先级任务。任务切换会保存当前任务的上下文,并将控制权交给高优先级任务,待高优先级任务执行完毕后,会再恢复到原来的任务继续执行。
在这里插入图片描述
如图,非常清楚。这里有几个概念:任务就绪、任务阻塞。这个概念下面介绍。

(2)时间片调度:

FreeRTOS中的时间片调度是一种任务调度算法,它将每个任务分配一个固定的时间片,当任务的时间片用完后,RTOS会切换到下一个任务执行,并将当前任务放回就绪队列末尾继续执行。时间片调度的主要思想是公平分配CPU时间给每个任务,避免某个任务长时间占用CPU,导致其他任务得不到执行机会。通过给每个任务分配相同的时间片,可以保证每个任务都能按照时间片轮流执行

在FreeRTOS中,时间片调度可以通过配置内核的调度策略来实现。可以设置每个任务的时间片大小,通常以毫秒为单位。当一个任务的时间片用完后,RTOS会切换到下一个就绪任务执行,并将当前任务放回就绪队列的末尾。
时间片调度可以避免某个任务长时间占用CPU,从而提高系统的公平性和响应性。但它也可能引入一定的延迟,因为任务在时间片用完之前可能会被切换出去,需要等待下一次轮到它执行。
在这里插入图片描述
也就是说,时间片轮转调度是对相同优先级的任务而言的。

(3)协程式调度:
任务主动放弃CPU的控制权,而不是被强制抢占或按照时间片轮转进行切换。任务可以通过特定的调用或指令将控制权交给其他任务,然后等待被唤醒或重新获取控制权继续执行。
目前看来不是很重要。

2.任务状态

前面将任务调度时,总强调任务会有就绪态和阻塞态,那这具体代表什么意思呢?
在这里插入图片描述
如图:
运行态(Running State):任务正在执行,占用CPU资源。在多任务系统中,只有一个任务可以处于运行态。当任务被调度到执行时,它就进入运行态。

就绪态(Ready State):任务已经准备好执行,但还未获得CPU资源。即使任务处于就绪态,但由于其他任务正在运行,该任务暂时无法执行。一旦任务获得CPU资源,它就可以从就绪态切换到运行态。

挂起态(Suspended State):任务被暂时挂起,不会被调度执行。任务在挂起态时,不会消耗CPU资源。通常,任务可以被主动挂起,或者在某些条件下被系统挂起。

阻塞态(Blocked State):任务因为某些条件或事件而无法继续执行,进入阻塞态。在阻塞态期间,任务不会被调度执行,也不会消耗CPU资源。任务可以通过等待某个事件或条件解除阻塞,然后切换到就绪态。

四种状态的转换关系

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

总结

在这里插入图片描述

四、freertos源码获取及移植

1.源码简介

正点原子官方提供了相关资料:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在source文件中,最重要的是列表、队列和任务相关文件。列表和队列涉及到数据结构的相关知识了。
在这里插入图片描述

2.适配正点原子开发板的代码移植

使用STM32F429的HAL库版本的《内存管理的实验》为基础工程进行FreeRTOS的移植。
具体的移植过程我这里不写了,本身新手可能也看不懂,后面靠例程看着看着就会了。
在这里插入图片描述
这里我随便打开一个文件,然后看到以下这几个重要文件:
在这里插入图片描述
这里主要对配置文件config.h进行解析。

3.config.h系统配置文件解析

在这里插入图片描述
这里注释还是很清楚的,举几个例子:
(1)#define configUSE_PREEMPTION 1 //1使用抢占式内核,0使用协程

这个宏定义用于设置是否使用抢占式内核调度。当它的值为1时,表示使用抢占式内核调度;当它的值为0时,表示使用协程调度。
抢占式内核调度是指操作系统能够根据任务的优先级和时间片,强制中断正在执行的任务,将CPU资源分配给优先级更高的任务。这种调度方式可以保证高优先级的任务及时执行,但可能会引入上下文切换的开销。

(2)#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 //1启用特殊方法来选择下一个要运行的任务
//一般是硬件计算前导零指令,如果所使用的
//MCU没有这些硬件指令的话此宏应该设置为0!

(3)#define configUSE_QUEUE_SETS 1 //为1时启用队列
#define configCPU_CLOCK_HZ (SystemCoreClock) //CPU频率
#define configTICK_RATE_HZ (1000) //时钟节拍频率,这里设置为1000,周期就是1ms
#define configMAX_PRIORITIES (32) //可使用的最大优先级
#define configMINIMAL_STACK_SIZE ((unsigned short)130) //空闲任务使用的堆栈大小

很多宏定义我目前都看不懂,也用不来,所以这里先不解释,后续再说。

4.总结

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_53092944/article/details/132513376
今日推荐