STM32F10x移植FreeRTOS

一、获取FreeRTOS源码

(1)登录FreeRTOS官网:www.freertos.org,下载第一个压缩包

(2)通过GitHub网站:github.com/FreeRTOS/FreeRTOS下载,由于该网站服务器在国外,所以访问较慢,甚至访问失败,不建议使用

(3)通过网盘资源下载

下载完成后,解压文件后如下图所示:

我们重点关注第一个文件夹:FreeRTOS

Demo:不同系列开发板的示例

Source:源文件

二、FreeRTOS移植

(1)在工程中建立“FreeRTOS”文件夹,同时在该文件夹中建立3个子文件夹:include、source、port

include文件夹用来存放头文件

source文件夹用来存放源码

port文件夹用来存放与内核连接的相关文件

(2)将源码移植到新建文件夹中

FreeRTOSv202212.01\FreeRTOSv202212.01\FreeRTOS\Source路径下的源文件移植到新建的source文件夹中

FreeRTOSv202212.01\FreeRTOSv202212.01\FreeRTOS\Source\include路径下的头文件移植到新建的include文件夹中

FreeRTOSv202212.01\FreeRTOSv202212.01\FreeRTOS\Source\portable\RVDS\ARM_CM3路径下的文件和FreeRTOSv202212.01\FreeRTOSv202212.01\FreeRTOS\Source\portable\MemMang移植到port文件夹中

在FreeRTOS文件夹中的demo文件夹中找到CORTEX_STM32F103_Keil文件夹,复制里面的FreerRTOSConfig.h文件到新建的FreeRTOS文件夹中

(3)打开Keil5,点击魔术棒,选择C/C++,将新移植的头文件路径添加进来

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

(5)在FreeRTOSConfig.h添加,添加中断函数的宏定义

#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler

这两个宏定义: PendSV_Handler——用于出发任务切换操作,SysTick_Handler——用于实现定时功能,SVC_Handler——用于实现系统用调用三个中断函数,当运行之后,会出现函数重定义错误,因为在stm32f10x_it.c文件中已经包含了这三个函数,需要进行删掉

(6)完善systick中断服务函数

上面定义的两个宏直接使用的port.c自带的函数。systick中断服务函数功能还没有完善,具体代码如下。就是在stm32f10x_it.c文件中的函数里修改即可

extern void xPortSysTickHandler(void);//systick中断服务函数
void SysTick_Handler(void)
{	#if (INCLUDE_xTaskGetSchedulerState  == 1 )if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED){#endif  /* INCLUDE_xTaskGetSchedulerState */  xPortSysTickHandler();#if (INCLUDE_xTaskGetSchedulerState  == 1 )}#endif  /* INCLUDE_xTaskGetSchedulerState */
}

        至此,FreeRTOS已经成功移植到STM32F103C8T6

三、测试程序

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

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

3.2 创建任务函数

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);}
}

3.3 在主函数中创建任务,并开启任务调度器

	xTaskCreate(task1,"task1",512,NULL,2,&task1Handler);vTaskStartScheduler();  //开启调度器

3.4 初始化GPIO口

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);  //打开GPIOC的时钟GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 ;   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStruct);   //初始化C13

main.c

#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()
{//uint8_t i = 0;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);  //打开GPIOC的时钟GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 ;   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStruct);   //初始化C13xTaskCreate(task1,"task1",512,NULL,2,&task1Handler);vTaskStartScheduler();  //开启调度器while(1){}}

        如果LED以500ms进行闪烁,则证明FreeRTOS移植成功

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

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

相关文章

2-5 任务:打印九九表

本次实战的目标是通过编写程序实现打印九九乘法表、字符矩形、字符平行四边形和字符菱形等图形,以及解决百钱买百鸡问题和输出素数等实际问题。在实战过程中,我们将学习并掌握以下知识点。 双重循环的使用:通过双重循环实现九九乘法表的打印&…

[笔记] Win11 Microsoft Store App 离线下载

微软应用商店无法下载或下载缓慢解决方法 在一些环境下 Microsoft Store 下载速度缓慢,或者需要账号登录才能安装的场景,可以通过找到对应的离线安装包的形式进行安装。 Micorsoft Store 中的离线安装包一般后缀为 AppxBundle 和 Appx。以 Ubuntu 为例…

【three.js】23. Raycaster and Mouse Events 投射射线(碰撞检测)和鼠标事件

介绍 顾名思义,Raycaster 可以向特定方向投射(或发射)一条射线,并测试与它相交的对象。 您可以使用该技术来检测玩家前面是否有墙,测试激光枪是否击中了什么东西,测试当前鼠标下方是否有东西来模拟鼠标事…

Kansformer?变形金刚来自过去的新敌人

​1.前言 多层感知器(MLPs),也被称为全连接前馈神经网络,是当今深度学习模型的基础组成部分。 MLPs在机器学习中扮演着至关重要的角色,因为它们是用于近似非线性函数的默认模型,这得益于通用近似定理所保证的表达能力。然而,MLPs真的是我们能构建的最佳非线性回归器吗?尽管ML…

如何去官网下载windows10操作系统iso镜像

文章目录 一、先从微软中国官网https://www.microsoft.com/zh-cn/进去二、然后按图示一步步点进去三、点击下载工具这个工具会帮你生成windows操作系统iso文件四、下载好后一步步按图示要求成功操作一、先从微软中国官网https://www.microsoft.com/zh-cn/进去 二、然后按图示一…

强一致性的皇冠:分布式事务模型的至高法则揭秘

关注微信公众号 “程序员小胖” 每日技术干货,第一时间送达! 引言 分布式事务模型是分布式系统设计的核心,关键在于保证数据一致性和事务完整性,尤其强调强一致性。诸如2PC、3PC、Saga、TCC等模型与协议,应运而生以解…

类加载器aa

一,关系图及各自管辖范围 (不赘述) 二,查看关系 package com.jiazai;public class Main {public static void main(String[] args) {ClassLoader appClassLoader ClassLoader.getSystemClassLoader();//默认System.out.println…

5.7代码

1.环境治理 分析:最开始进入了一个误区,觉得都有通路了直接算通路就可以,后来才发现居然是最小路径的总和,所以大概是每减一次都要算一次各点之间的最小路径了,然后是循环,到需要的条件为止 总的来说思路不…

[leetcode] 67. 二进制求和

文章目录 题目描述解题方法模拟java代码复杂度分析 相似题目 题目描述 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 输入:a "11", b "1" 输出:"100"示例 2: 输…

使用curl命令查看服务器端口开放情况

目录 1.ssh端口 22 2.mysql数据库端口 3306 3.web应用端口 (Jellyfin 8082) (wordpress 8088) (tomcat 8080) 4.不存在的端口 5.被防火墙阻挡的端口 1.ssh端口 22 curl -v 10.10.10.205:22 curl…

SpringBoot+Vue+Element-UI实现在线外卖系统

前言介绍 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势社会的发展和科学技术的进步,互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的…

java:递归实现的案例

//求第20个月兔子的对数 //每个月兔子对数:1,1,2,3,5,8 public class Test {//求第20个月兔子的对数//每个月兔子对数:1,1,2,3,5,8pu…