欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > FreeRTOS移植笔记:让操作系统在你的硬件上跑起来

FreeRTOS移植笔记:让操作系统在你的硬件上跑起来

2025/4/7 18:33:16 来源:https://blog.csdn.net/Cha3043445754/article/details/147032316  浏览:    关键词:FreeRTOS移植笔记:让操作系统在你的硬件上跑起来

一、为什么需要移植?

FreeRTOS就像一套"操作系统积木",但不同硬件平台(如STM32、ESP32、AVR等)的CPU架构和外设差异大,需要针对目标硬件做适配配置。移植工作就是让FreeRTOS能正确管理你的硬件资源。

二、源码文件夹大揭秘(新人必看)

​​​​​​​

FreeRTOS├── Source           │   ├── include      // 内核头文件(任务、队列、信号量等API定义)│   └── portable     // 移植专用目录(不同编译器/处理器的适配代码)│       ├── MemMang  // 内存管理方案(heap_1.c ~ heap_5.c)│       ├── GCC      // GCC编译器移植文件│       ├── IAR      // IAR编译器移植文件│       └── RVDS     // ARM RealView移植文件(常用ARM_CM3/CM4)└── Demo             // 官方示例代码(非必需,可参考)

关键文件说明:

  1. portable/MemMang

    • heap_1.c:简单静态分配(不释放内存)

    • heap_4.c:带碎片合并的动态分配(新手推荐

    • heap_5.c:支持非连续内存区域分配

    • 包含5种内存管理方案(类似不同的"内存分配器"):

  2. portable/[Compiler]/[Architecture]

    • 处理器核心移植文件(如port.cportmacro.h

    • 例如:STM32F4使用 RVDS/ARM_CM4F 目录下的文件

  3. FreeRTOSConfig.h

    • 用户自定义配置文件(需手动创建/复制)

    • 位于工程目录,用于裁剪功能、设置时钟等参数

移植步骤讲解

1.首先我们在STM32裸机工程模板根目录下新建一个文件夹叫“FreeRTOS”,并在该文件夹下在创建两个文件夹“src”,"port",src文件夹用于保存FreeRTOS中的核心文件,也就是我们常说的“.c文件”,port文件夹中存放管理以及处理器相关代码,这些代码FreeRTOS官方提供给我们,直接使用。

FreeRTOS是软件,我们开发板是硬件,软硬件中间要有桥梁来连接,这些与处理器架构相关的代码,可以称为RTOS硬件接口层,它们位于FreeRTOS/Source/Portable文件夹下

2. 打开FreeRTOS,在目录“FreeRTOSvXXX\FreeRTOS\Source”找到.c文件,将他们拷贝到我们新建的src文件夹中

3.  打开FreeRTOS,在目录“FreeRTOSvXXX\FreeRTOS\portable”下找到“MemMang”文件夹与"RVDS'文件夹,将他们拷贝到我们新建的port文件夹

4. 打开FreeRTOS,在目录“FreeRTOSvXXX\FreeRTOS\Source”目录下找到"include" 文件夹,它们是我们需要用到FreeRTOS的一些头文件,将它们直接拷贝到我们新建的FreeRTOS文件夹中,完成这一步就可以看到我们新建的FreeRTOS文件夹已经有3个文件夹,这三个文件夹就包含了FreeRTOS的核心文件,至此FreeRTOS的源码就提取完成。

5. 拷贝FreeRTOSConfig.h文件到user文件夹

FreeRTOSConfig,h文件是FreeRTOS的工程配置文件,因为FreeRTOS是可以裁剪的实时操作系统,应用于不同处理器平台,我们可以修改这个文件来裁剪FreeRTOS的功能,一般我们把它拷贝在user文件夹下

6.添加FreeRTOS源码到工程文件夹

7. 配置FreeRTOS头文件路径

8.接下来我们就把文件FreeRTOSConfig.h进行修改

FreeRTOSConfig.h 文件是从 FreeRTOS 的 demo 文件夹下拷贝过来的。该头文件包含了用于裁剪整个 FreeRTOS 所需功能的宏定义。其中,一些宏定义被启用,一些被禁用。最初,我们只需要配置最基本的功能。然而,要自由配置 FreeRTOS 的功能,我们需要了解这些宏定义的功能。这样,其他人也能够轻松理解并读懂这些配置。

加上头文件"stm32f10x.h"

然后再将下述代码进行复制粘贴FreeRTOSConfig.h文件中

#define configUSE_TIME_SLICING  1  //使能时间片调度(默认式使能的) #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 //硬件计算前导零指令,如果所使用的, MCU 没有这些硬件指令的话此宏应该设置为 0 #define configUSE_TICKLESS_IDLE  1  保持系统节拍(tick)中断一直运行 #define configUSE_QUEUE_SETS 1      #define configUSE_TASK_NOTIFICATIONS 1  #define configUSE_MUTEXES    #define configUSE_RECURSIVE_MUTEXES 1    #define configUSE_COUNTING_SEMAPHORES 1  #define configQUEUE_REGISTRY_SIZE 10   #define configUSE_APPLICATION_TASK_TAG  0  #define configSUPPORT_DYNAMIC_ALLOCATION  1  #define configUSE_MALLOC_FAILED_HOOK  0 //使用内存申请失败钩子函数 #define configCHECK_FOR_STACK_OVERFLOW  1#define configGENERATE_RUN_TIME_STATS 0 //启用运行时间统计功能 #define configUSE_STATS_FORMATTING_FUNCTIONS 1 #define configUSE_TIMERS 1   //启用软件定时器 #define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1)  #define configTIMER_QUEUE_LENGTH 10   //软件定时器优先级 //软件定时器队列长度 #define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2)  //可选函数配置选项 #define INCLUDE_xTaskGetSchedulerState 1 #define INCLUDE_eTaskGetState 1 #define INCLUDE_xTimerPendFunctionCall 1 //中断服务函数  也可以修改起始文件 #define vPortSVCHandler     SVC_Handler#define xPortPendSVHandler    PendSV_Handler#define xPortSysTickHandler   SysTick_Handler

在port.c文件,写一个钩子函数

以上步骤就是移植FreeRTOS的详细步骤

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词