FreeRTOS作为开源的轻量级实时性操作系统, 实现了基本的实时调度、 信号量、 队列和存储管理,而且免费!
FreeRTOS的实现主要由list.c、 queue.c、
是一个链表的实现, 主要供给内核调度器使用;
queue.c 是一个队列的实现, 支持中断环境和信号量控制;
croutine.c 和task.c是两种任务的组织实现。 对于croutine, 各任务共享同一个堆栈, 使RAM的需求进一步缩小,但也正因如此, 他的使用受到相对严格的限制。而task则是传统的实现,各任务使用各自的堆栈,支持完全的抢占式调度。
FreeRTOS的主要功能可以归结为以下几点:
1) 优先级调度、 相同优先级任务的轮转调度,同时可设成可剥夺内核或不可剥夺内核
2) 任务可选择是否共享堆栈(co-routines & tasks), 并且没有任务数限制
3) 消息队列, 二值信号量,计数信号量, 递归互斥体
4) 时间管理
5) 内存管理
各文件关键部分的实现:
1、 PORTMACRO.H宏定义部分
1) 定义编译器相关的各种数据类型
#define portCHAR char
#define portFLOAT float
#define portDOUBLE double
#define portLONG long
#define portSHORT short
#define portSTACK_TYPE unsigned portLONG
#define portBASE_TYPE long
2) 架构相关的定义
Cortex-M3的堆栈增长方向为高地址向低地址增长
#define portSTACK_GROWTH ( -1 )
每毫秒的心跳次数
#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ )
访问SRAM的字节对齐
#define portBYTE_ALIGNMENT 8
3) 定义用户主动引起内核调度的2个函数
强制上下文切换, 用在任务环境中调用
#define portYIELD() vPortYieldFromISR()
强制上下文切换, 用在中断处理环境中调用
#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) vPortYieldFromISR()
4) 定义临界区的管理函数
中断允许和关闭
#define portDISABLE_INTERRUPTS() vPortSetInterruptMask()
#define portENABLE_INTERRUPTS() vPortClearInterruptMask()
临界区进入和退出
#define portENTER_CRITICAL() vPortEnterCritical()
#define portEXIT_CRITICAL() vPortExitCritical()
用于在中断环境的中断允许和关闭
#define portSET_INTERRUPT_MASK_FROM_ISR() 0;vPortSetInterruptMask()
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask();(void)x
2、 PORT.C C文件
1) 堆栈初始化
2) 启动任务调度
3) 主动释放mcu使用权
4) 心跳时钟处理函数
Implementation of functions defined in portable.h for the ARM CM3 port
3、 HEAP_4. C文件
Heap_2.c 并不会把相邻的空闲块合并成一个更大的内存块,所以会产生内存碎片——如果分配和释放的总是相同大小的内存块,则内存碎片就不会成为一个问题
Heap_4.c就是改进了这一点。理论上不会产生内存碎片。