【FreeRTOS】FreeRTOS移植stm32详细步骤介绍

我在查找FreeRTOS移植的相关教程特别少,所以想非常详细的介绍FreeRTOS移植stm32详细步骤,包括源码的下载,源码介绍,系统移植,代码验证等,每一步都有对应的介绍和解释,希望可以帮助到你们。
在这里插入图片描述


文章目录

    • 1. FreeRTOS源码的下载
    • 2. FreeRTOS源码介绍
    • 3. FreeRTOS系统移植
    • 4. 系统代码验证


1. FreeRTOS源码的下载

官网下载,仓库下载,镜像下载,百度网盘下载,私信我


1.1 可以直到FreeRTOS官网去下载,【FreeRTOS官网传送门】,但是下载速度很慢,不翻墙的话不建议使用这个方法下载。

1.1.1 官网页面如下,点击右上角或下方的下载入口

在这里插入图片描述


1.1.2 进入下载页面有两个下载选项,

  • 第一个选项是FreeRTOS 202212.01,下载的数据包包含最新 FreeRTOS 内核、 FreeRTOS-Plus 库 和 AWS IoT 库,以及示例项目
  • 第二个选项是FreeRTOS 202210.01 LTS,数据包包含 FreeRTOS LTS 库,其中包括 FreeRTOS 内核和 IoT 库,但没有示例项目

一般我们下载第一个就行

在这里插入图片描述


1.2 直接通过仓库下载,【仓库地址传送门】,同样很慢,甚至打不开网页,也不建议使用这种方法。


1.3 通过国内镜像下载,这种方式下载不受域名影响,是最直接的方式
【国内镜像传送门】,建议使用


1.3.1 打开链接页面

在这里插入图片描述


1.3.2 点击下载/克隆,下载成功

在这里插入图片描述


1.4 使用我上传到百度网盘的源码,是在官方网站直接下载的数据包,建议使用,起码比官网和仓库快

链接:【百度网盘传送门】
提取码:sqml


1.5 以上方式都不行的可以直接私信我

下载好的压缩包解压好的文件呀包含下面的内容:
在这里插入图片描述

压缩包88.3MB,解压文件夹506MB


2. FreeRTOS源码介绍

前面的文章已经很详细介绍过了,可以直达前面的文章去了解源码结构,可以更好的帮助你理解移植的原理和FreeRTOS的实现原理。

博客传送门:【FreeRTOS】详细目录结构和作用

基本上可以概括为下面一张图:
在这里插入图片描述


3. FreeRTOS系统移植

3.1 准备好FreeRTOS源码和一个配置好的STM32项目工程,我使用的是之前一个已经成功实现的LED闪烁的工程

在这里插入图片描述

在这里插入图片描述


3.2 在项目工程中创建一个FreeRTOS文件夹,里面存放所有的移植文件

在这里插入图片描述


3.3 在刚才创建的FreeRTOS文件夹中,分别新建src、inc、port文件夹:

  • src文件夹用来存放源码
  • inc文件夹用来存放头文件
  • port文件夹用来存放移植平台的相关文件

在这里插入图片描述


3.4 接下来我们将FreeRTOS源码的移植到我们新建的文件夹中

3.4.1首先我们打开源码中的Soure文件夹中的protable文件夹,找到MemMang文件夹,这个文件夹中都是内存管理文件,我们只用到heap_4.c文件,将其复制到port文件夹中

在这里插入图片描述


3.4.2 接着我们在刚才的portable文件夹中,找到RVDS文件夹,选择里面的ARM_M3中的port.c和portmacro.h两个文件,也复制到我们的工程文件port文件夹中

在这里插入图片描述


3.4.3 回到source文件夹中,将这个文件夹中的.c文件全部复制到工程新建的src文件夹中


在这里插入图片描述


3.4.4 在source文件夹中的include文件夹里全部都是FreeRTOS的头文件,将其添加到工程新建的inc文件夹中

在这里插入图片描述


3.4.5 添加一个配置文件,在FreeRTOS文件夹中的demo文件夹中找到CORTEX_STM32F103_Keil文件夹,复制里面的FreerRTOSConfig.h文件到新建的FreeRTOS文件夹中

在这里插入图片描述


3.5 接着我们添加文件路径,打开keil软件点击魔术棒,进入C/C++,在Include Paths中添加文件路径,将FreeRTO、src、inc、port的路径全部添加进来

在这里插入图片描述


3.6 新建组将文件全部添加到工程中,点击魔术棒旁边的三个格子的图标,选择新建组,我们分别新建FreeRTOS_src、FreeRTOS_inc、FreeRTOS_port三个组,将工程文件夹src中的所有.c文件添加到FreeRTOS_src中,将工程文件夹inc中的所有.h文件添加到FreeRTOS_inc中(不包括.readme),将工程文件夹port中的文件(heap_4.c、port.c添加到FreeRTOS_port中,还有配置文件FreeRTOSConfig.h添加到FreeRTOS_inc组中

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


3.7 完成中断函数的宏定义,在FreeRTOSConfig.h中,在条件编译中加入

#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler

在这里插入图片描述


3.8 注释掉STM库函数中的三个中断空函数

分别为:

void SVC_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);

在这里插入图片描述

至此,系统移植已经全部完成


4. 系统代码验证

4.1 首先在main文件中添加头文件FreeRTOS.h和task.h

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "FreeRTOS.H"
#include "task.h"

4.2 我们直接使用LED灯闪烁的代码进行验证,先创建一个任务函数

static void task1(void *arg)
{while(1){GPIO_ResetBits(GPIOC, GPIO_Pin_13);vTaskDelay(500);GPIO_SetBits(GPIOC, GPIO_Pin_13);vTaskDelay(500);}
}

4.3 在主函数中创建一个任务并开启任务调度器

	xTaskCreate(task1,"task1",512,NULL,2,&task1Handler);vTaskStartScheduler();

4.4 当然要使用LED肯定要初始化串口,我们以GPIOC中的GPIO_Pin_13为例

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);

4.5 main文件中的全部代码为

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "FreeRTOS.H"
#include "task.h"TaskHandle_t task1Handler;static void task1(void *arg)
{while(1){GPIO_ResetBits(GPIOC, GPIO_Pin_13);vTaskDelay(500);GPIO_SetBits(GPIOC, GPIO_Pin_13);vTaskDelay(500);}
}
int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);xTaskCreate(task1,"task1",512,NULL,2,&task1Handler);vTaskStartScheduler();}

FreeRTOS常用函数传送口:【FreeRTOS】常用函数总结


4.6 完成编译后可以烧录到开发板上进行验证


4.7 或者使用keil自带的调试器进行调试
4.7.1 首先在魔术棒中找到debug选项,选择use simulate,下面也要配置成相应的单片机型号

在这里插入图片描述


4.7.2 点击调试按钮,在上方添加逻辑分析仪

在这里插入图片描述


4.7.3 点击逻辑分析仪的setup,添加信号,我们使用的是stm32f103c8t6,所以信号为PORTC.13,不同的开发板可以查看配置的串口和单片机对应的寄存器,注意需要将信号类型选择为bit

在这里插入图片描述


4.7.4 全速运行可以得到串口准确的波形

在这里插入图片描述

你也可以创建多个任务,查看波形分析任务的执行情况


项目工程完整代码传送口:
链接:FreeRTOS示例工程
提取码:k8uk

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

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

相关文章

openGauss学习笔记-84 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署服务器优化:x86

文章目录 openGauss学习笔记-84 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署服务器优化:x8684.1 BIOS84.2 操作系统环境设置84.3 网络 openGauss学习笔记-84 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署服务器优化:x86 …

基于vue+Element Table Popover 弹出框内置表格的封装

文章目录 项目场景:实现效果认识组件代码效果分析 封装:代码封装思路页面中使用 项目场景: 在选择数据的时候需要在已选择的数据中对比选择,具体就是点击一个按钮,弹出一个小的弹出框,但不像对话框那样还需…

[DS资源推荐] Data Structure 严书配套代码

下图引入自康建伟老师博客 Github地址 使用说明:康老师博客 使用感受:Orz!非常非常非常全面!终于能看得下去严书了…

UWB技术在汽车智能制造的应用

返修区车辆管理项目 应用背景 在车辆总装生产线中,车辆下线后检测与返修是最后一个关键环节,整车一旦下线,由于流水线装配工艺、来料等原因,可能会出现部分整车存在瑕疵,进而进入返修区域待检。由于可能出现问题的不确…

区块链(9):java区块链项目的Web服务实现之实现web服务

1 引入pom依赖 <dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-server</artifactId><version>9.4.8.v20171121</version></dependency><dependency><groupId>org.eclipse.jetty</groupId…

SpringCloud Alibaba - 基于 FeignClient 整合 Sentinel,实现“线程隔离”和“熔断降级”

目录 一、FeignClient 整合 Sentinel 1.1、整合原因 1.2、实现步骤 1.2.1、修改 OrderService 中的 application.yml 文件 1.2.2、给 FeignClient 编写失败后的降级逻辑 二、线程隔离 2.1、线程隔离的两种方式 2.1.1、线程池隔离 2.1.2、信号量隔离&#xff08;Sentin…

【自定义类型】--- 位段、枚举、联合

&#x1f493;博客主页&#xff1a;江池俊的博客⏩收录专栏&#xff1a;C语言进阶之路&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅数据结构探索&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文…

智慧公厕与传统公共厕所对比五大优势是什么?

随着科技的不断发展&#xff0c;智慧公厕成为城市建设的新亮点。与传统公共厕所相比&#xff0c;它具备许多独特优势和巨大的价值。本文将以智慧公厕领先厂家广州中期科技有限公司&#xff0c;大量精品案例项目实景实例实图&#xff0c;深入探讨智慧公厕的各个方面的特点&#…

【VINS】苹果手机采集单目相机+IMU数据离线运行VINS-Mono

0.准备工作 开个新坑&#xff0c;之前用Android手机做过离线采集数据的实验&#xff0c;这次用IPhone来测试&#xff01; 1.虚拟机配置Mac OS 下载一个Mac OS 的ios镜像&#xff0c;打开虚拟机按照跟Ubuntu差不多的方式安装&#xff0c;但是发现没有Mac OS的入口。 因为VMwa…

[C++随笔录] stack queue模拟实现

stack && queue模拟实现 stack的实现stack测试用例queue的实现queue测试用例deque stack的实现 &#x1f5e8;️stack的容器适配器应该选什么比较好呢? 首先, stack的特点是 头部入, 尾部出 ⇒ 尾插 和 尾删操作比较频繁 我们前面学过的容器有 vector 和 list, vecto…

Vue中如何进行图表绘制

Vue中的图表绘制&#xff1a;数据可视化的艺术 数据可视化是现代Web应用程序的重要组成部分之一。Vue.js作为一种流行的JavaScript框架&#xff0c;提供了许多强大的工具和库&#xff0c;用于在前端应用程序中创建各种图表和数据可视化。本文将深入探讨在Vue中进行图表绘制的方…

以太网协议介绍(ARP、UDP、ICMP、IP)

以太网协议介绍 一、ARP协议 请求&#xff1a; 应答&#xff1a; ARP协议&#xff1a; 0x0001 0x0800 6 4硬件类型&#xff1a;2个字节&#xff0c;arp协议不仅能在以太网上运行还能在其他类型的硬件上运行。以太网用1来表示&#xff1b; 协议类型&#xff1a;两字节。指的是a…

【深入了解Java String类】

目录 String类 常用方法 字符串的不可变性 String的内存分析 StringBuilder类 解释可变和不可变字符串 常用方法 面试题&#xff1a;String&#xff0c;StringBuilder&#xff0c;StringBuffer之间的区别和联系 String类的OJ练习 String类 【1】直接使用&#xff0c…

【JUC并发编程--java线程】

文章目录 1. 线程1.1 线程的使用线程运行原理 1. 线程 1.1 线程的使用 方法一&#xff0c;直接使用 Thread&#xff1a; 方法二&#xff0c;使用 Runnable 配合 Thread&#xff1a; 把【线程】和【任务】&#xff08;要执行的代码&#xff09;分开 Thread 代表线程Runnabl…

为什么都说NFS读写性能差,如何进行优化?

使用基于NFS协议存储系统的同学经常遇到的问题是在小文件比较多的情况下性能会比较差。小文件访问性能差本身是可以理解的,但是NFS确实是太差了。不知大家是否深层次分析过,为什么NFS访问小文件性能会这么差? NFS文件系统与本地文件系统的差异在于多了一个网络传输的过程。…

毛玻璃用户卡交互

效果展示 页面结构组成 从效果展示可以看到&#xff0c;此效果都是比较常规的。主要的核心就是卡片的悬停效果。 CSS 知识点 backdrop-filter 回顾transitiontransform 页面基础布局实现 <section><div class"container"><div class"card&q…

react create-react-app v5配置 px2rem (暴露 eject方式)

环境信息&#xff1a; create-react-app v5 “react”: “^18.2.0” “postcss-plugin-px2rem”: “^0.8.1” 配置步骤&#xff1a; 我这个方式是 npm run eject 暴露 webpack配置的方法 1.安装 postcss-plugin-px2rem 和 lib-flexible cnpm install postcss-plugin-px2rem…

二叉树和堆

二叉树不存在度大于2的结点&#xff08;每个根最多只有两个子结点&#xff09;二叉树的子树有左右之分&#xff0c;次序不能颠倒&#xff0c;因此二叉树是有序树 两个特殊的二叉树——&#xff08;满二叉树&#xff0c;完全二叉树&#xff09; 满二叉树——每个根结点都有左右…

Ubuntu镜像源cn.arichinve.ubuntu.com不可用原因分析和解决

文章目录 Ubuntu查看系统版本Ubuntu更新系统不能更新Ubuntu查看APT更新源配置cn.archive.ubuntu.com已经自动跳转到清华镜像站Ubuntu变更镜像源地址备份原文件批量在VIM中变更 Ubuntu国内镜像站推荐推荐阅读 今天想要在Ubuntu环境下搭建一个测试环境&#xff0c;进入Ubuntu系统…