一、实时操作系统概述
1、概念
RTOS:根据各个任务的要求,进行资源(包括存储器、外设等)管理、消息管理、任务调度、异常处理等工作。每个任务都有一个优先级,RTOS根据各个任务的优先级,动态地切换各个任务,保证对实时性的要求。
2、RTOS的必要性
- 嵌入式实时操作系统提高了系统的可靠性
- 提高了开发效率、缩短了开发周期
- 嵌入式实时操作系统充分发挥了32位CPU的多任务潜力
但是实时操作系统还需要额外的ROM/RAM开销,2~5%的CPU额外负荷,以及内核的费用。
3、RTOS与裸机的区别
①裸机开发
类似于我们学校里玩的51单片机、STM32都是跑在main函数中,里面会有一个超级大的while(1)循环,这里面几乎包含整个项目的所有业务逻辑,然后每个逻辑里面都会有delay这样的等待函数,这样就会导致所有的业务逻辑都是串行起来工作的。然后进行轮询一件件事,事情一件件按顺序来,同一时间只能做一件事情。类似于下图这种。
②如何改进呢?
把这每件事情,都对应一个任务,降低耦合度,一个任务对应一个硬件,这种通过抢占任务优先级,来高效的实现任务的切换。
4、FreeRTOS的特点
- FreeRTOS的内核支持抢占式和时间片调度
- 提供了一个用于低功耗的Tickless模式
- 系统的组件在创建时可以选择动态或者静态的RAM,比如任务、消息队列、信号量、软件定时器等。
- FreeRTOS-MPU支持Corex-M系列中的MPU单元,比如STM32F429.
- FreeRTOS系统简单、小巧、易用,通常情况下内核占用4k-9k字节的空间
- 高可移植性,代码主要C语言编写。
- 高效的软件定时器
- 强大的跟踪执行功能。
- 堆栈溢出检测功能。
- 任务数量不限。
- 任务优先级(0~63)不限。
二、FreeRTOS的架构
- 一个任务管理一个硬件
- 任务与任务或任务与中断涉及到数据传输使用消息队列
- 任务件共享资源访问使用互斥锁
- 任务的同步使用信号量
- 标志位的管理使用事件标志组
- 编写一个专门初始化硬件的任务,该任务可以包含创建任务的功能。
三、FreeRTOS的代码架构
- croutine.c/croutine.h:协程,在8位/16位平台下效率比较高,在32位平台建议使用任务Task。
- event_group.c/event_group.h:这个是事件组的实现。
- heap_x.c:内核堆实现,FreeRTOS提供了heap_1.c~heap_5.c,5种堆管理器,各有优缺点,需要根据应用进行选择。这一块我会在另一篇博客详细讲解。
- list.c/list.h:链表实现,主要为调度器提供数据结构算法支持服务。比如任务链表。
- port.c/portmacro.h:硬件相关层级可移植抽象,主要包括SysTick中断,上下文切换,中断管理,具体实现很大程度上取决于平台(单片机体系硬件内核和编译器工具集)。通常以汇编语言实现。
- queue.c/queue.h/semphr.h:信号量、互斥体实现。
- tasks.c/task.h:任务管理器实现。
- timers.c/timers.h:软件定时器实现。
- FreeRTOS.h:编译配置文件,用于汇总所有源文件的编译选择控制。
- FreeRTOSConfig.h:FreeRTOS内核配置,Tick时钟和irq中断配置。