FreeRTOS介绍
本文主要涉及RTOS的相关内容
1.RTOS与裸机的区别
2.RTOS的架构与特点
3.任务调度
4.任务状态
文章目录
- FreeRTOS介绍
- 一、RTOS与裸机的区别
- 二、FreeRTOS 简介
- 2.1 特点
- 2.2 架构
- 2.3 应用领域
- 总结
- 三、 任务调度
- 3.1 基本原理
- 3.2 调度策略
- 3.3 实现方式
- 四、 任务状态
一、RTOS与裸机的区别
裸机(Bare Metal)和RTOS(Real-Time Operating System)是嵌入式系统中常见的两种软件开发方式,它们在特点上有明显的区别。
-
裸机:
- 直接访问硬件:裸机编程直接对硬件进行编程,开发人员需要直接操作寄存器和外设来实现功能。
- 无操作系统支持:裸机编程通常不依赖于操作系统,程序运行在处理器上的裸机环境中,没有操作系统提供的抽象层。
- 资源利用率高:由于没有操作系统的开销,裸机程序通常具有更高的资源利用率,可以更好地控制系统的性能和功耗。
- 定制化程度高:裸机编程适合对系统性能要求较高,对资源利用率和响应时间有严格要求的应用场景。
举例:在裸机编程中,如果要控制一个LED的亮度,可能需要直接操作微控制器的GPIO寄存器来设置LED的亮度等级,而不依赖于操作系统的抽象接口。
-
RTOS:
- 多任务支持:RTOS提供多任务支持,可以同时运行多个任务,通过任务调度器来管理多个任务的执行顺序和优先级。
- 抽象层:RTOS提供了抽象层,简化了对硬件的访问,开发人员可以使用RTOS提供的接口来访问硬件资源,而无需直接操作寄存器。
- 实时性:RTOS通常具有实时性,能够满足对任务响应时间有严格要求的应用场景。
- 灵活性:RTOS提供了丰富的功能模块,如任务管理、内存管理、定时器、消息队列等,使得开发人员能够更灵活地组织和管理代码。
举例:在使用RTOS开发一个嵌入式系统时,可以将系统划分为多个任务,比如一个任务负责处理用户输入,另一个任务负责控制外设,RTOS会负责管理这些任务的执行,根据任务的优先级和时间要求进行调度。
总体而言,裸机编程适用于对性能和资源利用率有严格要求的场景,而RTOS适用于需要多任务支持和实时性能的应用场景。选择裸机还是RTOS开发取决于具体的应用需求和开发人员的偏好。
二、FreeRTOS 简介
FreeRTOS是一个免费开源的实时操作系统(RTOS),由英国工程师Richard Barry创建,并由Real Time Engineers Ltd.维护。它是一个轻量级的实时操作系统,广泛用于嵌入式系统的开发。以下是对FreeRTOS的详细介绍:
2.1 特点
-
免费开源:FreeRTOS遵循MIT许可证,可以免费用于商业和非商业项目,并且开放源代码,使得开发人员可以自由地查看、修改和定制源代码。
-
轻量级:FreeRTOS设计精简,内核代码量小,占用系统资源少,适合于资源受限的嵌入式系统。
-
多任务支持:FreeRTOS支持
多任务并发执行
,通过任务调度器来管理任务的执行顺序和优先级,实现多任务之间的协作和调度。 -
优先级调度:FreeRTOS支持任务的优先级调度,可以根据任务的优先级动态调整任务的执行顺序,确保高优先级任务能够及时得到执行。FreeRTOS有32个优先级,0-31.优先级越高,所分配的优先级数值越大。注意与stm32的中断区分:中断是优先级越高,数值越小。
-
实时性:FreeRTOS具有实时性能,能够满足对任务响应时间有严格要求的应用场景。
-
可移植性:FreeRTOS提供了可移植的代码,支持多种不同的处理器架构和开发环境,包括ARM Cortex-M系列、AVR、PIC、MSP430等。
-
丰富的功能模块:除了任务调度外,FreeRTOS还提供了丰富的功能模块,如定时器、信号量、消息队列、事件组等,使得开发人员能够更灵活地组织和管理代码。
-
低功耗支持:FreeRTOS能够有效地管理系统资源,支持低功耗模式,适用于对功耗有严格要求的应用场景。
2.2 架构
FreeRTOS的架构主要包括以下几个组件:
-
内核(Kernel):包含任务调度器和其他核心功能模块,负责管理任务的创建、删除、调度等操作。
-
任务(Task):RTOS中的最基本的执行单元,相当于一个独立的线程,可以并发执行。
-
定时器(Timer):用于定时触发事件或任务,可以在指定的时间间隔内执行特定的操作。
-
信号量(Semaphore):用于实现任务之间的同步和互斥访问共享资源。
-
消息队列(Queue):用于任务之间的消息传递和通信。
-
事件组(Event Group):用于管理和同步多个事件的状态。
2.3 应用领域
FreeRTOS广泛应用于各种嵌入式系统中,包括但不限于:
- 汽车电子系统
- 工业自动化控制
- 医疗设备
- 智能家居
- 通信设备
- 消费电子产品等。
总结
FreeRTOS作为一款免费开源、轻量级、可移植、实时性好的RTOS,为嵌入式系统的开发提供了可靠的基础。它的灵活性和丰富的功能模块使得开发人员能够更轻松地构建复杂的嵌入式应用。
三、 任务调度
任务调度是实时操作系统(RTOS)中的一个核心概念,它负责管理系统中多个任务的执行顺序和优先级,以确保系统资源的合理利用和任务的及时响应。以下是对任务调度的介绍:
3.1 基本原理
-
任务:RTOS中的任务是系统中最基本的执行单元,类似于线程,在RTOS中通常称为任务(Task)。每个任务都有自己的代码段和堆栈空间。
-
任务状态:任务可以处于运行态、就绪态或阻塞态。运行态表示任务正在执行,就绪态表示任务已经准备好可以执行但还未获得执行的机会,阻塞态表示任务由于某种原因暂时无法执行。
-
任务调度器:任务调度器是RTOS的核心组件之一,负责决定哪个任务可以执行。任务调度器根据任务的优先级和调度策略来决定当前执行哪个任务。
-
上下文切换:任务调度器通过上下文切换(Context Switching)来实现任务之间的切换。当一个任务被挂起或者需要切换到另一个任务时,任务调度器会保存当前任务的上下文(包括程序计数器、堆栈指针等状态),然后加载下一个任务的上下文,使得下一个任务可以继续执行。
3.2 调度策略
-
抢占式调度:根据任务的优先级来确定任务的执行顺序,优先级高的任务会先被执行。优先级调度可以保证高优先级任务的及时响应,但可能导致低优先级任务饥饿(即长时间得不到执行)的问题。被抢占的任务会进入就绪态。
-
时间片调度:每个任务被分配一个时间片(Time Slice),在时间片用完之后,任务会被挂起,然后调度器会选择下一个任务执行。轮转调度可以保证任务之间的公平性,但可能导致任务切换的开销较大。–同等优先级任务轮流地享有相同的CPU时间(可设置)叫时间片。一个时间片就等于Sys Tick中断周期。注意一个任务没有使用完的时间片不会再使用,下次执行该任务还是一个时间片的时间。
-
抢占式调度:任务可以被更高优先级的任务抢占,即使当前任务没有执行完毕。抢占式调度可以保证高优先级任务的及时执行,但需要考虑任务切换的开销和上下文切换带来的系统负担。
3.3 实现方式
-
基于时间片的调度器:按照时间片分配任务的执行时间,常见于轮转调度策略。
-
基于优先级的调度器:根据任务的优先级确定执行顺序,通常采用抢占式调度策略。
-
协程式调度:当前执行任务 将会一直执行,同时高优先级的任务不会前瞻低优先级任务。Freertos现在虽然还支持,但是官方表示不在更新协程式调度。
四、 任务状态
FreeRTOS中的任务有四个状态,它们分别是:
-
就绪态(Ready):
- 任务已经创建并初始化完成,具备执行的条件,但还未获得CPU执行的机会。当任务处于就绪态时,RTOS的调度器会根据任务的优先级和调度策略来确定下一个需要执行的任务。
-
运行态(Running):
- 任务正在执行,处于CPU执行的状态。只有一个任务可以处于运行态,即当前正在被CPU执行的任务。注意在STM32中仅有一共任务处于运行态。
-
阻塞态(Blocked):
- 任务由于某种原因暂时无法执行,例如等待事件、等待信号量、等待消息队列等。当任务处于阻塞态时,它不会被调度执行,直到满足特定的条件才能从阻塞态转移到就绪态。
-
挂起态(Suspended):
- 任务被挂起,暂时停止执行,不参与调度。任务可以被
手动挂起
或者由其他任务或中断引发的操作导致任务被挂起
。被挂起的任务不会被调度执行,直到被明确地恢复到就绪态。
- 任务被挂起,暂时停止执行,不参与调度。任务可以被
这四个任务状态在FreeRTOS中用于描述任务的不同执行状态,任务会在这些状态之间转换,RTOS的调度器负责根据任务状态的变化来决定任务的执行顺序和时机,以实现多任务的协作和调度。
总结:
1、仅就绪态可转变成运行态
2、其他状态的任务想运行,必须先转变成就绪态