当前位置: 首页 > news >正文

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的详细步骤

相关文章:

  • visual_studio_2022集成SFML
  • IntelliJ IDEA Maven 工具栏消失怎么办?
  • ctf-show-杂项签到题
  • 输入框输入数字且保持精度
  • 【工具变量】全国各省及地级市绿色金融指数数据集(2000-2023年)
  • OpenGL学习笔记(模型材质、光照贴图)
  • 树莓派llama.cpp部署DeepSeek-R1-Distill-Qwen-1.5B
  • Gerapy二次开发:用户管理专栏页面样式与功能设计
  • OpenStack Yoga版安装笔记(十七)安全组笔记
  • 每日c/c++题 备战蓝桥杯(求解三个数的最大公约数与最小公倍数)
  • CANoe CAPL——Ethernet CAPL函数
  • btrfs , ext4 , jfs , xfs , zfs 对比 笔记250406
  • 前端知识-CSS3
  • Java Properties 类详解
  • 基于winform的串口调试助手
  • Nginx负载均衡时如何为指定ip配置固定服务器
  • 25.6 多模态AI类型系统实战:日均10万请求下的99.99%可靠性保障与10倍性能提升
  • 《Java八股文の文艺复兴》第十篇:量子永生架构——对象池的混沌边缘
  • C# 属性(Property)
  • 双向链表示例
  • b2b电子商务网站系统/网络推广怎么赚钱
  • 青海wap网站建设比较好/上海seo优化公司 kinglink
  • 潍坊做企业手机版网站/什么网站都能打开的浏览器
  • 厦门关键词优化软件/苏州seo免费咨询
  • 做网站找那个公司/百度统计官网
  • 做网站之前要备案是什么意思/网络推广的公司更可靠