FreeRTOS简介
RTOS 是一种能够在严格的时间限制内处理任务的操作系统。在嵌入式系统中,RTOS 使得多个任务能够并发执行,并确保关键任务在规定时间内得到处理。FreeRTOS 是一个免费的嵌入式实时操作系统,其特点有:
- 免费开源:商业产品中使用,无潜在商业风险
- 可裁剪:核心代码9000+行,包含在3个.c文件中
- 简单:可移植性非常好
- 优先级不限:任务优先级分配无限制,多任务可同一优先级
- 任务不限:可创建的实时任务数量没有软件限制(但受硬件限制,内存影响)
- 支持抢占式、协程式、时间片流转任务调度
FreeRTOS的核心组件
FreeRTOS的核心组件包括任务、队列、信号量、互斥量和软件定时器等,这些是构建实时应用程序的基本模块。它们共同为嵌入式系统中的多任务处理、同步和通信提供了强大的支持。
1、任务(Task)
任务是FreeRTOS中最基本的执行单元,可以理解为一个独立运行的线程。每个任务都具有自己的执行函数、堆栈和状态信息。任务的创建、管理和调度是FreeRTOS的核心功能。
关键属性
- 优先级:每个任务都有优先级。FreeRTOS根据优先级调度任务,优先级高的任务会优先获得CPU执行时间。任务优先级可以动态调整。
- 任务函数:任务由一个函数来定义,这个函数是一个无限循环,FreeRTOS通过调度器决定何时执行该函数。
- 堆栈空间:每个任务都有自己的独立堆栈,堆栈的大小在任务创建时定义,影响任务的运行。
2、队列(Queue)
队列是任务间通信的主要机制,用于在任务之间传递数据或消息。队列可以存储多个固定大小的消息,任务可以通过队列进行数据的发送(放入队列)和接收(从队列中取出)。
队列的特点
- 先进先出(FIFO):队列遵循先进先出原则,最早放入的消息最早取出。
- 多任务通信:可以允许多个任务向同一个队列发送或接收数据,支持任务之间的同步与异步通信。
- 线程安全:FreeRTOS自动处理队列的访问同步,确保多个任务并发访问队列时不会出现数据冲突。
3、信号量(Semaphore)
信号量是用于任务之间同步或用于管理对共享资源访问的工具。它们提供了一种机制,让一个任务可以等待另一个任务的事件完成。FreeRTOS支持二值信号量、计数信号量和递归信号量。
信号量的类型
- 二值信号量:只有两个状态:可用或不可用。用于简单的事件通知或资源访问控制。
- 计数信号量:可以持有多个令牌,用于允许多个任务或中断同时访问资源,或者控制访问次数。
- 递归信号量:允许同一个任务多次锁定资源,适合递归函数或嵌套访问。
4、互斥量(Mutex)
互斥量(Mutex,互斥信号量)是信号量的一种特化形式,专用于确保任务对共享资源的独占访问。与一般信号量不同,互斥量支持优先级继承,这能防止由于优先级反转导致的系统性能问题。
互斥量的特点
- 独占访问:任务在获取互斥量时,其他任务必须等待该任务释放互斥量后才能访问共享资源。
- 优先级继承:如果低优先级任务持有互斥量并导致高优先级任务阻塞,低优先级任务会暂时提升其优先级,以避免优先级反转。
5、软件定时器(Software Timer)
软件定时器用于在特定的时间段后执行回调函数。它允许任务或者中断服务例程在延迟之后或以固定间隔执行一些任务,不需要忙等待。
定时器的特点
- 单次定时器:定时器到期后只执行一次。
- 周期定时器:定时器以固定的时间间隔重复执行。
- 精度:FreeRTOS的软件定时器是基于操作系统的时间节拍运行的,因此其精度依赖于Tick的频率。
6、事件组(Event Group)
事件组允许任务在不同的事件标志上同步,提供了一种任务之间多标志位同步的机制。一个事件组包含多个事件位,每个任务可以等待特定的事件位集合变为有效状态。
事件组的特点
- 多事件等待:任务可以等待多个事件位的集合,任何一个或所有位被设置后,任务才继续运行。
- 同步机制:多个任务可以通过事件组实现同步,确保特定条件满足后才执行下一步操作。
FreeRTOS通过其核心组件(任务、队列、信号量、互斥量、软件定时器和事件组),为嵌入式系统提供了强大的多任务管理和任务间通信机制。这些组件的结合使得开发者能够轻松地构建复杂、实时的嵌入式应用,同时保持系统的高效性和响应性。
FreeRTOS的架构
FreeRTOS 的架构由多个核心模块组成,这些模块共同协作以实现任务管理、通信和同步等功能。主要模块包括:
1、任务管理模块
- 任务(Task):FreeRTOS 允许用户创建多个任务,每个任务可以看作一个独立的执行单元,具有自己的执行上下文和堆栈。
- 任务调度器:负责根据任务优先级和状态(就绪、阻塞等)调度任务执行。FreeRTOS 使用优先级抢占调度算法,确保高优先级任务能够优先获得 CPU 时间。
2、内存管理模块
- 动态内存分配:FreeRTOS 提供多种内存分配方案,用户可以根据系统的需求选择合适的内存管理方式,如 heap_1、heap_2、heap_3 和 heap_4。
- 内存池管理:内存管理模块可以实现固定大小的内存块分配,适合需要频繁创建和销毁对象的应用场景。
3、任务间通信与同步模块
- 队列(Queue):用于任务间的消息传递,支持多个任务之间的数据交换。
- 信号量(Semaphore):用于任务之间的同步,可以控制对共享资源的访问。
- 互斥量(Mutex):确保共享资源的独占访问,避免数据竞争。
- 事件组(Event Group):支持多位事件的同步,任务可以在多个事件位上等待和响应。
4、定时器模块
软件定时器用于在特定时间点执行回调函数,支持一次性和周期性定时器。定时器可以与任务协作,以便在设定时间后执行特定操作。