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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++11(下)】—— 我与C++的不解之缘(三十二)

前言 随着 C11 的引入,现代 C 语言在语法层面上变得更加灵活、简洁。其中最受欢迎的新特性之一就是 lambda 表达式(Lambda Expression),它让我们可以在函数内部直接定义匿名函数。配合 std::function 包装器 使用,可以…

JavaScript中的Proxy详解

1. 什么是Proxy? Proxy是ES6引入的一个强大特性,它允许你创建一个对象的代理,从而可以拦截和自定义该对象的基本操作。Proxy提供了一种机制,可以在对象的基本操作,如属性查找、赋值、枚举、函数调用等之前或之后执行自…

【git】VScode修改撤回文件总是出现.lh文件,在 ​所有 Git 项目 中全局忽略特定文件

VScode里面powershell被迫关闭 场景解决办法 场景 系统:Windows IDE:Visual Studio Code 一旦修改代码,就算撤回也会显示 解决办法 第一步:“C:\Users\用户名字.gitignore_global”:在该路径下新建.gitignore_glo…

为什么 LoRA 梯度是建立在全量参数 W 的梯度之上

🧠 首先搞清楚 LoRA 是怎么做微调的 我们原来要训练的参数矩阵是 W W W,但 LoRA 说: 别动 W,我在它旁边加一个低秩矩阵 Δ W U V \Delta W UV ΔWUV,只训练这个部分! 也就是说,LoRA 用一个…

Nginx负载均衡时如何为指定ip配置固定服务器

大家在用Nginx做负载均衡时,一般是采用默认的weight权重指定或默认的平均分配实现后端服务器的路由,还有一种做法是通过ip_hash来自动计算进行后端服务器的路由,但最近遇到一个问题,就是希望大部分用户采用ip_hash自动分配后端服务…

Llama 4 家族:原生多模态 AI 创新的新时代开启

0 要点总结 Meta发布 Llama 4 系列的首批模型,帮用户打造更个性化多模态体验Llama 4 Scout 是有 170 亿激活参数、16 个专家模块的模型,同类中全球最强多模态模型,性能超越以往所有 Llama 系列模型,能在一张 NVIDIA H100 GPU 上运…

【硬件开发技巧】如何通过元器件丝印反查型号

目录 一、在线数据库查询 二、官方资料匹配 三、专业软件辅助 四、实物比对与场景推断 五、社区与人工支持 注意事项 一、在线数据库查询 专业元器件平台 Digi-Key、Mouser、ICMaster等平台支持直接输入丝印代码检索,可获取芯片型号、技术文档及替代型号。例如…

【算法/c++】利用中序遍历和后序遍历建二叉树

目录 题目:树的遍历前言题目来源树的数组存储基本思想存储规则示例 建树算法关键思路代码总代码 链表法 题目:树的遍历 前言 如果不是完全二叉树,使用数组模拟树,会很浪费空间。 题目来源 本题来自 PTA 天梯赛。 题目链接: 树…

李臻20242817_安全文件传输系统项目报告_第6周

安全文件传输系统项目报告(第 1 周) 1. 代码链接 Gitee 仓库地址:https://gitee.com/li-zhen1215/homework/tree/master/Secure-file 代码结构说明: project-root/├── src/ # 源代码目录│ ├── main.c # 主程序入口│ ├…

嵌入式rodata段

在嵌入式软件开发中,将数据放入只读数据段(.rodata)具有以下好处及典型应用示例: 好处 数据保护 .rodata段的内容在程序运行时不可修改,防止意外或恶意篡改,提升系统稳定性。 节省RAM资源 只读数据可直接…

InfoSec Prep: OSCP靶场渗透

InfoSec Prep: OSCP InfoSec Prep: OSCP ~ VulnHubInfoSec Prep: OSCP, made by FalconSpy. Download & walkthrough links are available.https://www.vulnhub.com/entry/infosec-prep-oscp,508/ 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做…

【JavaWeb-Spring boot】学习笔记

目录 <<回到导览Spring boot1. http协议1.1.请求协议1.2.响应协议 2.Tomcat2.1.请求2.1.1.apifox2.1.2.简单参数2.1.3.实体参数2.1.4.数组集合参数2.1.5.日期参数2.1.6.(重点)JSON参数2.1.7.路径参数 2.2.响应2.3.综合练习 3.三层架构3.1.三层拆分3.2.分层解耦3.3.补充 &…

C++的多态-上

目录 多态的概念 多态的定义及实现 1.虚函数 2. 多态的实现 2.1.多态构成条件 2.2.虚函数重写的两个例外 (1)协变(基类与派生类虚函数返回值类型不同) (2)析构函数的重写(基类与派生类析构函数的名字不同) 2.3.多态的实现 2.4.多态在析构函数中的应用 2.5.多态构成条…

网络安全的重要性与防护措施

随着信息技术的飞速发展&#xff0c;互联网已经成为我们日常生活、工作和学习的必需品。无论是通过社交媒体与朋友互动&#xff0c;还是在网上进行银行交易&#xff0c;网络已经渗透到我们生活的方方面面。然而&#xff0c;随之而来的是各种网络安全问题&#xff0c;包括数据泄…

CMake学习--Window下VSCode 中 CMake C++ 代码调试操作方法

目录 一、背景知识二、使用方法&#xff08;一&#xff09;安装扩展&#xff08;二&#xff09;创建 CMake 项目&#xff08;三&#xff09;编写代码&#xff08;四&#xff09;配置 CMakeLists.txt&#xff08;五&#xff09;生成构建文件&#xff08;六&#xff09;开始调试 …

访问数组元素(四十四)

1. 数组下标与类型 数组的索引从 0 开始。例如&#xff0c;一个包含 10 个元素的数组&#xff0c;其合法下标范围为 0 到 9&#xff0c;而不是 1 到 10。为了表示下标&#xff0c;通常使用 size_t 类型&#xff0c;它是一种与机器相关的无符号整型&#xff0c;足够大以存放内存…

计算机网络 3-1 数据链路层(功能+组帧+差错控制)

【考纲内容】 &#xff08;一&#xff09;数据链路层的功能 &#xff08;二&#xff09;组帧 &#xff08;三&#xff09;差错控制 检错编码&#xff1b;纠错编码 &#xff08;四&#xff09;流量控制与可靠传输机制 流量控制、可靠传输与滑动窗口机制&#xff1b;停止-等…

Django中使用不同种类缓存的完整案例

Django中使用不同种类缓存的完整案例 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 Django中使用不同种类缓存的完整案例步骤1:设置Django项目步骤2:设置URL路由步骤3:视图级别…

Spring Boot 集成Redis 的Lua脚本详解

1. 对比Lua脚本方案与Redis自身事务 对比表格 对比维度Redis事务&#xff08;MULTI/EXEC&#xff09;Lua脚本方案原子性事务命令序列化执行&#xff0c;但中间可被其他命令打断&#xff0c;不保证原子性Lua脚本在Redis单线程中原子执行&#xff0c;不可中断计算能力仅支持Red…

【大模型】DeepSeek + 蓝耕MaaS平台 + 海螺AI生成高质量视频操作详解

目录 一、前言 二、蓝耘智能云MaaS平台介绍 2.1 蓝耘智算平台是什么 2.2 平台优势 2.3 平台核心能力 三、海螺AI视频介绍 3.1 海螺AI视频是什么 3.2 海螺AI视频主要功能 3.3 海螺AI视频应用场景 3.4 海螺AI视频核心优势 3.5 项目git地址 四、蓝耘MaaS平台DeepSeek海…