【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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1. mycat入门

1、mycat介绍 Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存 储引擎,所以并不是完全意义的分布式数据库系统。MyCat是目前最流行的基于Java语言编写的数据库中间件,也可以理解为是数据…

Firmware Analysis Plus (Fap)固件模拟安装教程(最新)

最近在搞IoT的研究,但是难在设备比较难弄,只有固件,而没有设备,买吧,又太费钱,不划算。好在有很多项目可以在模拟环境中运行固件。但是几乎没有一个平台能够模拟所有硬件设备。IoT产品的架构也不尽相同。 …

C++初学教程四

一、程序设计 程序设计的三种基本结构:顺序、选择、循环 选择结构(也叫分支结构) :判断所指定的条件是否满足,决定从给定的两组或多组操作选择其中的一种。 计算机的判断是通过对表达式的计算来实现,也就是关系运算、逻辑运算。 用语句来体现就是if语…

53 代码审计-TP5框架及无框架变量覆盖反序列化

目录 演示案例:Metinfo-无框架-变量覆盖-自动审计或搜索phpmyadmin-无框架-反序列化-自动审计或搜索Thinkphp5-有框架-搭建使用入口访问调试SQL等 演示案例: Metinfo-无框架-变量覆盖-自动审计或搜索 变量覆盖会直接覆盖原始变量,来形成新的变量值 搜索关键字或者…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Spring IOC底层实现

第一章 SpringIOC底层实现 IOC:将对象的控制器反转给Spring 1.1 BeanFactory与ApplicationContexet BeanFactory:IOC容器的基本实现,是Spring内部的使用接口,是面向Spring本身的,不是提供给开发人员使用的。****Appli…

APP自动化测试工具大全

一、UI自动化测试工具 1. uiautomator2 openatx开源的ui自动化工具,支持Android和iOS。主要面向的编程语言是Python,API设计简洁易用,在开源社区也是很受欢迎。 安装: pip install --upgrade --pre uiautomator2# Or you can …

IO / day07 作业

1. 使用消息队列完成两个进程之间相互通信 代码 #include <myhead.h>//define a msg struct type struct msgbuf {long mtype; //消息类型char mtext[1024]; //消息正文大小};//macro msg size #define SIZE (sizeof(struct msgbuf)-sizeof(long))int recv(int mtype_r…

Vue学习计划-Vue2--VueCLi(三)ref属性、mixins混入、插件、scoped样式

1. ref属性 被用来给元素或子组件注册引用信息&#xff08;id的替代者&#xff09;应用在html标签上获取的是真实DOM元素&#xff0c;应用在组件标签上是组件实例对象&#xff08;VC&#xff08;VueComponent&#xff09;&#xff09;使用方式&#xff1a; 打标识<h1 ref&q…

火山引擎边缘计算用硬核助力赛事直播

经过一个多月激烈争夺&#xff0c;2023英雄联盟全球总决赛终于在11月19日落下帷幕。精彩的对决和高热话题使得直播平台观赛人数暴增&#xff0c;给直播平台稳定性和资源储备提出了巨大的考验。

macosx dbeaver执行脚本报错提示:还没有设置连接地址

1.原因 因为你本地没有安装MySql Client所以按照网上其他操作办法你找不到MySql的客户端&#xff0c;因此配置客户端的时候自然就找不到对应的文件. 2.解决办法 参考DBeaver提供的解决办法&#xff1a; https://dbeaver.com/docs/dbeaver/Local-Client-Configuration/#local…

【复杂网络建模】——基于Graph Convolutional Networks (GCN)进行链接预测

目录 一、复杂网络建模 二、图嵌入方法&#xff08;Graph Convolutional Networks (GCN) &#xff09; 1. 图表示&#xff1a; 2. 邻接矩阵&#xff08;Adjacency Matrix&#xff09;&#xff1a; 3. 图卷积层&#xff08;Graph Convolutional Layer&#xff09;&#xff…

docker的资源控制:

docker的资源控制&#xff1a; 对容器的使用宿主机的资源进行限制 cpu 内存 磁盘i/0 docker使用linux自带的功能cgroup control grouos是linux内核系统提供的一种可以限制&#xff0c;记录&#xff0c;隔离进程所使用的物理资源 control grouos是linux内核系统提供的一种可…

【动态规划】03斐波那契数列模型_最小花费爬楼梯_C++(easy1)

题目链接&#xff1a;leetcode使用最小花费爬楼梯 目录 题目解析&#xff1a; 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析&#xff1a; 题目让我们求达到楼梯顶部的最低花费. 由题可得&#xff1a; cost[i] 是从楼梯第 i 个…

【LeetCode刷题-树】--113.路径总和II

113.路径总和II 方法一&#xff1a;深度优先搜素 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeN…

语音识别功能测试:90%问题,可以通过技术解决

现在市面上的智能电子产品千千万&#xff0c;为了达到人们使用更加方便的目的&#xff0c;很多智能产品都开发了语音识别功能&#xff0c;用来语音唤醒进行交互&#xff1b;另外&#xff0c;各大公司也开发出来了各种智能语音机器人&#xff0c;比如小米公司的“小爱”&#xf…

少儿编程考级:激发孩子逻辑思维能力的关键

在当今信息化时代&#xff0c;少儿编程已经成为孩子们不可或缺的一项技能。而少儿编程考级&#xff0c;则是检验孩子们在这一技能上所取得的成就的重要途径。少儿编程考级不仅能够激发孩子们的逻辑思维能力&#xff0c;还能够提高他们的动手能力和创造力。6547网将详细介绍少儿…

Windows Terminal的半透明效果

打开Windows Terminal的半透明效果 最终实现效果&#xff1a; 系统&#xff1a;win11 23H2 步骤&#xff1a; 1.winx打开终端 2.右键打开设置 3.打开外观->亚克力材料开启 4.默认值->外观->透明度&#xff0c;按喜好选择即可

使用opengl编写shader出现错误,提示无法创建片段shader,且提示:too much data in type constructor

最近在学opengl&#xff0c;在编写片段shader时&#xff0c;编译出现错误如下&#xff1a; 造成这个问题的原因是fragment shader的代码有问题&#xff0c;在创建片段着色器代码的第七行需要传入一些参数&#xff0c;如果传入参数的个数超过了规定值&#xff0c;就会报错。 解…

springboot 极简案例

安装idea File -> New Project 选择依赖 创建controller文件 输入controller类名 输入代码 运行项目 访问 localhost:8080/hello/boot package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.…

使用 VSCode 开发 Golang 代码,并支持 debug断点调试

背景 Go 自2012年发布至今&#xff0c;由于其出色的性能与并发处理能力&#xff0c;已经被各大互联网公司应用到成熟的产品服务上&#xff0c;目前本人从事项目的后端服务已经从Python全部切换到Go。 于是决定跟后端大佬系统的学习一下Golang语言&#xff0c;然后将自己学习过…