FreeRTOS源码分析
FreeRTOS可以被移植到很多不同架构的处理器和编译器,事实上FreeRTOS源码里都已经附带了一个配置好的演示例程方便快速开发,每个演示例程都带有一个说明网页,提供如何定位RTOS演示工程源代码、如何编译演示例程、如何配置硬件平台的全部信息,演示例程说明网页还提供基本的RTOS移植细节信息,包括如何编写FreeRTOS兼容的中断服务例程,不同架构的中断处理会稍有不同。在FreeRTOS最新的V10.1.1代码里,已经提供了针对MCU STM32L152的IAR工程,而我们这里的MCU和集成开发环境分别是STM32L151和MDK,所以我们需要参考该项目使用MDK创建新的工程代码。
在开始移植FreeRTOS之前,我们可以到它的官方站点(https://www.freertos.org/)找最当前最新版本的下载链接,当然我们也可以直接到FreeRTOS的srouceforge源码仓库下去直接下载,其地址是: https://sourceforge.net/projects/freertos/files/FreeRTOS/ , 这里我们下载当前最新的V10.1.1版本并做该版本的移植。
下载完成后之后解压缩FreeRTOS源码,我们发现下载包目录包含两个子目录:FreeRTOS和FreeRTOS-Plus,此外还有一个readme文档和一些网页链接说明。如下所示:
- txt是FreeRTOSv10.1.1文件夹下的一些文件说明以及一些移植/使用参考链接;
- FreeRTOS目录下包含FreeRTOS内核源文件和已经移植到各个MCU的工程文件及源码文件,接下来我们移植所用的源码都在里面;
- 而FreeRTOS-Plus目录是FreeRTOS的一些常用组件(收费)和演示例程,在基础的移植过程中,不需要这些组件。
首先我们来看看FreeRTOS文件夹及其目录结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
FreeRTOS ├── Demo │ ├── ... ... │ ├── ARM7_AT91FR40008_GCC 移植到Atmel ARM7上的示例代码; │ ├── ARM9_AT91SAM9XE_IAR 移植到Atmel ARM9上的示例代码; │ ├── AVR32_UC3 移植到Atmel ARV32单片机上的示例代码; │ ├── CORTEX_STM32L152_IAR 移植到STM32L152 MUC上的IAR项目,我们会参考该项目来移植; │ ├── msp430_GCC 移植到MSP430单片机上的示例代码; │ ├── ... ... ├── Source │ ├── tasks.c FreeRTOS内核三大核心文件之一任务, 所有任务(调度)相关函数; │ ├── queue.c FreeRTOS内核三大核心文件之一队列,任务和任务之间的通讯处理; | ├── list.c FreeRTOS内核三大核心文件之一链表,在内核整体控制上都使用了链表数据结构处理,一切数据结构的基础; | ├── timers.c 软件定时器,以任务形式存在; | ├── croutine.c 协线程(协程)文件,和任务类似,在系统资源比较缺乏下使用; | ├── event_groups.c 事件标志组; │ ├── stream_buffer.c 一个用循环buffer实现的字节流buffer,可以在在中断服务程序与任务或任务与任务之间传送字节流数据; | ├── include FreeRTOS操作系统移植需要的一些头文件在这里面; | ├── portable 处理器架构相关的RTOS代码,这个是RTOS MCU底层硬件相关的移植层; │ | ├── Keil │ | │ └── See-also-the-RVDS-directory.txt 我们使用的是Keil MDK,这个文件说明参考下面的RVDS; │ | ├── MemMang FreeRTOS实现了5种简单的内存分配(malloc)实现 │ | │ ├── heap_1.c 这是所有实现中最简单的一个,一旦分配内存之后,它甚至不允许释放分配的内存,适合于大部分嵌入式情形; │ | │ ├── heap_2.c 使用一个最佳匹配算法,它允许释放之前分配的内存块。但它不会把相邻的空闲块合成一个更大的块,会产生内存碎片; │ | │ ├── heap_3.c 简单的包装了标准库中的malloc()和free()函数,包装后的malloc()和free()函数具备线程保护; │ | │ ├── heap_4.c 使用一个最佳匹配算法,会将相邻的空闲内存块合并成一个更大的块,解决内存碎片; │ | │ ├── heap_5.c 该方案同方案4的合并算法,并且允许堆栈跨越多个非连续的内存区; │ | │ └── ReadMe.url 关于5中堆管理实现的说明网站链接; | | ├── RVDS | | │ ├── ARM_CM3 STM32L151使用的是ARM Cortex M3的核,所以关于该MCU的硬件层移植使用这里的代码 | | │ │ ├── port.c | | │ │ └── portmacro.h | | └── readme.txt portable文件夹下的文件说明; │ └── readme.txt Source路径下文件说明 │ ├── License │ └── license.txt FreeRTOS的版权声明文件,使用修改过的GPL; ├── links_to_doc_pages_for_the_demo_projects.url └── readme.txt 关于该路径下的一些文件说明及其帮助链接; |
接下来也可以了解一下FreeRTOS-Plus文件夹及其目录结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
FreeRTOS-Plus/ ├── Demo │ ├── Also_See_More_FreeRTOS+TCP_and_FreeRTOS_FAT_in_the_lab.url 关于FreeRTOSs使用TCP和FAT的网站链接; │ ├── Common │ ├── FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator FreeRTOS下的命令行实现; │ ├── FreeRTOS_Plus_FAT_SL_and_CLI_Windows_Simulator FreeRTOS下的FAT和命令行实现; │ ├── FreeRTOS_Plus_Reliance_Edge_and_CLI_Windows_Simulator │ ├── FreeRTOS_Plus_TCP_Minimal_Windows_Simulator FreeRTOS的TCP实现; │ ├── FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC FreeRTOS的UDP和命令行实现; │ ├── FreeRTOS_Plus_UDP_and_CLI_Windows_Simulator │ ├── FreeRTOS_Plus_UDP_CLI_FAT_SL_SAM4E_Atmel_Studio │ ├── FreeRTOS_Plus_WolfSSL_Windows_Simulator FreeRTOS的SSL加密实现; │ └── readme.txt ├── readme.txt └── Source ├── FreeRTOS-Plus-CLI ├── FreeRTOS-Plus-IO ├── FreeRTOS-Plus-TCP ├── FreeRTOS-Plus-Trace ├── FreeRTOS-Plus-UDP ├── Reliance-Edge ├── WebDocs.url └── WolfSSL |
文章评论