【FreeRTOS学习】(1)在项目中添加FreeRTOS
一、FreeRTOS简介
FreeRTOS(Free Real-Time Operating System)是一个常用的实时操作系统内核,具有高可用性、可裁剪性、可移植性和可扩展性等特性。它是一个基于事件驱动的,用于嵌入式系统的实时操作系统,广泛应用于航空、航天、工业自动化、医疗设备、智能家居、汽车电子等领域。FreeRTOS提供了任务管理、时间管理、内存管理、中断处理、软件定时器和通信机制等功能。其内核非常小巧,仅需几KB的内存和一些最基本的处理器资源即可运行。同时FreeRTOS还提供多种语言接口,并且支持多种处理器架构,如ARM、AVR、PIC、MIPS等,因此备受广大嵌入式软件开发人员的欢迎。
二、在项目中添加FreeRTOS
FreeRTOS提供的对开发者的支持还是很多的,官网 也有中文版的开发文档,可以查阅API函数、内核机制,实在有问题解决不了还有一个官方的论坛,可以注册一个账号在上面提问。
1. 下载FreeRTOS源码
官网有最新版和最新长期支持版(LTS),如果是为了学习建议直接下最新版,源码里提供一些demo项目可以参考。
- 官方下载页面:

- Github 上获取源码
FreeRTOS-Plus是一些其他协议(如物联网相关)的扩展,最基础的实时操作系统内核只需要FreeRTOS就可以了。

可以自行下载压缩包或 git clone 。
2. 添加需要的文件
- 文件构成
下载好后解压后的文件构成是这样的:

其实也很好分辨,目录下的 .c 文件就是通用的源文件;include文件夹内是头文件;portable文件夹内是一些跟不同编译器、处理器架构相关和动态内存分配的源文件和头文件。 - 在项目添加所需要的文件
这里假设已经会如何新建一个对应处理器的(Keil / IAR / GCC)项目。
那么要做的其实就是(1)添加需要的代码文件并添加到项目中(2)在项目include项中添加所需头文件的路径。
比如以我使用的 IAR 作为 IDE 开发环境,首先在项目中新建一个FreeRTOS文件夹,再在其中创建src、inc、port三个文件夹:

demo和license无关紧要,只是一些对应处理器的demo项目和许可证相关。

将FreeRTOS内核下的所有.c文件复制到 项目路径/FreeRTOS/src 下。

将FreeRTOS内核下/include/ 的所有.h文件复制到 项目路径/FreeRTOS/src 下。

将portable/MemMang文件夹整个复制到 项目路径/FreeRTOS/port 下,它里面是几个关于堆(即动态分配内存)的.c文件,使用过程按需选择一个添加到项目中就可以,一般选择heap_4,具体区别建议点击里面的ReadMe网页查看;
选取portable中对应编译器和处理器架构,比如我的是 ./portable/IAR/ARM_CM4F 其中有一个汇编文件一个.c,一个.h,将这些文件复制到 项目路径/FreeRTOS/port/IAR/ARM_CM4F 下。



完成后,在IDE项目中添加源文件和在选项(Options)添加对应头文件路径:
注意:MemMang 中只用选择其中 一个!!(一般是4)

需要注意的是刚刚那个portasm.s由于它里面有一句 #include <FreeRTOSConfig.h>,所有汇编文件的pre include 路径也要添加相关的(起码FreeRTOS相关的都要添加)。就是Options的C/C++ Compiler和Assembler选项都要添加。

3. 添加 FreeRTOSConfig.h 配置文件
完成上面的步骤后,可以尝试编译一下,会报一个找不到 FreeRTOSConfig.h 的错误,因为 FreeRTOSConfig.h 这个文件根据官方来说是需要用户自己创建的,算作用户文件,不算内核,它是一个配置文件,define一些宏来选择相应的功能。
那我们就创建一个 FreeRTOSConfig.h 到 user group 下,这里给一个有注释的模板,以后再有需要可以用这个改,不过如果你是Keil/GCC需要修改一两行。
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
/*-----------------------------------------------------------
* Application specific definitions.
* 可以在下面这个网站查看对应选项的官方解释,此文件的注释只做参考
* See http://www.freertos.org/a00110.html
*----------------------------------------------------------*/
//#include "gd32f30x.h"
/* 这个是踩过的坑,因为汇编也要用到FreeRTOSConfig.h文件,所以有些关键字
* 如 enum 就会报 bad instruction 的错误,所以最好还是直接把如
* SystemCoreClock 这样的宏的值直接粘贴过来用,像我下面那样,就不要再包含
* gd32f30x.h 了。*/
/* Ensure stdint is only used by the compiler, and not the assembler. */
//这个地方__ICCARM__表示是IAR的编译器,若是Keil或GCC要改成__CC_ARM、__GNUC__
#if defined __ICCARM__
#include <stdint.h>
extern uint32_t SystemCoreClock;
#endif
//assert断言
/* Normal assert() semantics without relying on the provision of an assert.h
header file. */
#define configASSERT( x ) if( ( x ) == 0 ) {
taskDISABLE_INTERRUPTS(); for( ;; ); }
/*****************************************************************************
* 基础配置项
****************************************************************************/

文章详细介绍了如何在项目中添加FreeRTOS,包括从官网下载源码,添加必要的文件到项目结构中,配置FreeRTOSConfig.h文件以适应项目需求,以及编译验证过程。FreeRTOS是一个小巧且功能丰富的实时操作系统内核,常用于嵌入式系统,具备高可裁剪性和可移植性。
最低0.47元/天 解锁文章
3174

被折叠的 条评论
为什么被折叠?



