二.内存和任务管理
RTOS的核心功能是什么?
FreeRTOS的核心功能主要如下,再根据不同功能块去进行不同源码分析,RTOS本质则是一个精简版Linux系统。
2.1FreeRTOS的源码分析
RTOS一些重要功能源码是什么?
整个RTOS源码给人一种感觉为即所有的功能均可作为任务进行处理,将RTOS移值入32的主要操作在于将相关核心需要的源码复制到相关目录即可,其源码目录结构主要如下:
核心文件 | 功能 |
---|---|
tasks.c | 必须,任务操作 |
list.c | 必须,列表相关(作用?) |
queue.c | 必须,提供队列信号量等操作 |
timer.c | 可选,提供时基等相关操作 |
event_groups.c | 可选,提供时间群相关功能 |
(2).重要头文件
FreeRTOSConfig.h
: FreeRTOS的配置相关文件FreeRTOS.h
: 使用FreeRTOS API时必须包含的头文件
(3).内存管理&&入口函数
FreeRTOS的内存管理不同方法由不同的C语言代码设计实现,可供自己选择所需具体函数,其位置存放在Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang
FreeRTOS的入口函数主要如下:
/* Init scheduler */
osKernelInitialize(); /* 初始化FreeRTOS运行环境 */
MX_FREERTOS_Init(); /* 创建任务 */
/* Start scheduler */
osKernelStart(); /* 启动调度器 */
2.2 内存管理
操作系统中实现内存管理的目标是什么?
RTOS中的内存管理相关函数,管理的对象是什么,针对解决的什么问题?
需要注意的是RTOS中涉及的task、queue、semaphores(信号量)等一系列对象均是属于内核态下的对象,而这些对象一般都是采用动态分配策略:用时分配,用完释放。而这一系列动态管理的具体策略就是由操作系统的内存管理去完成的。进行内存管理目的在于高效的理由嵌入式内存空间。
关于堆(heap)栈(stack):
内存管理的本质即对程序进行堆栈管理,堆栈并不是一个东西,
- 堆: 说白了就是一块空闲的空间,但是被管理,其管理的方式主要有
malloc(堆分配)
和free(堆释放)
- 栈: 从堆中分配出的一块空间叫栈,通常用于函数调用及当前程序和变量的保存。一句话就是栈由部分堆分配而来。
2.2.2FreeRTOS中内存管理策略
FreeRTOS说明书吐血整理【适合新手+入门】-优快云博客
FreeRTOS中不同内存管理策略的优缺点(了解即可),以及常见系统内存使用策略及其原因?
FreeRTOS中共有5种内存管理相关的策略。 heap_1.c ~ heap_5.c
其中我们主要用到的是heap_4
,RTOS中的内存管理又是和任务相关进行关联的。
RTOS在进行任务[^20]创建时,需要先创建的两大对象: task control block(TCB,任务控制块)
、stack
(1).heap_1
其主要实现了pvPortMalloc()
[^21] heap_1并未使用动态内存,且实现较为简单,没有产生内存碎片等系列问题。其核心在于指只分配不回收。
(2).heap_4
heap_4最初也是使用大数组来分配内存,但其还使用了首次适应算法(first fit),实现把相邻的内存合并为一更大内存,有效的缓解了内存碎片问题。内存碎片是指因内存在分配为一块块区域的进行使用后的剩余空闲区域大小,无法满足新的程序需求而导致该空闲部分内存块一直没有被分配使用的情况。常见的其他OS中的解决办法是内存虚拟化技术。
首次适应算法: 即采用heap_4进行任务的内存分配时,选择第一次找到适应task需求的内存块,分配剩下的块中的空闲字节会留给后续的pvPortMalloc
去分配使用。
相邻空闲内存合并算法: 顾名思义,如下图所示,假设执行三个任务分配了三个不同的任务单元(各自的TCB和Stack构成),任务二执行完进行释放(绿色区域部分),则该算法会将相邻区域的空闲空间进行合并,并最终形成一块更大的空闲空间块。
2.2.3 Heap(堆)相关的函数
堆相关的重点元素有哪些?各自有什么功能?
堆内存分配/释放函数
void * pvPortMalloc( size_t xWantedSize );
void vPortFree( void * pv );
功能函数
-
size_t xPortGetFreeHeapSize( void );
该函数主要适用于优化内存,若整体都分配完后还剩多大,那么configTOTAL_HEAP_SIZE 就可减小多少。 -
size_t xPortGetMinimumEverFreeHeapSize( void );
返回多个空闲区域时,空闲内存容量的最小值
总结: RTOS中内存管理的本质是一种针对任务的内存大小分配策略,且在内存管理时涉及到两大物理先行概念 堆和栈,堆本质是一块被管理的空闲区域块,在堆的基础上再为没个任务分配出任务控制块(TCB)和栈(Stack),其次是关于内存具体分配中FreeRTOS中用得最多是heap_4方法,其比较实用为 首次适应算法 和 临近空闲区域合并算法。