FreeRTOS 学习总结(一)

来源:互联网 发布:预约抢号软件 编辑:程序博客网 时间:2024/06/05 17:27

FreeRTOS作为开源的轻量级实时性操作系统, 实现了基本的实时调度、 信号量、 队列和存储管理,而且免费!
FreeRTOS的实现主要由list.c queue.c croutine.c和tasks.c 4个文件组成。

 list.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就是改进了这一点。理论上不会产生内存碎片。

0 0
原创粉丝点击