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);   //初始化C13
	
	xTaskCreate(task1,"task1",512,NULL,2,&task1Handler);
	vTaskStartScheduler();  //开启调度器


	
	while(1)
	{
		
	}

}

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

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

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

相关文章

回归预测 | Matlab实现基于CNN-SE-Attention-ITCN多特征输入回归组合预测算法

回归预测 | Matlab实现基于CNN-SE-Attention-ITCN多特征输入回归组合预测算法 目录 回归预测 | Matlab实现基于CNN-SE-Attention-ITCN多特征输入回归组合预测算法预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【模型简介】CNN-SE_Attention结合了卷积神经网络&#xff…

好消息|5月6日起换发补发出入境证件可“全程网办”

国家移民管理局从2024年5月6日起,实施若干便民利企出入境管理的六项政策措施,包括在北京等20个城市试点实行换发补发出入境证件的“全程网办”,该举措对于访问学者、博士后研究人员及联合培养博士都是利好消息。故知识人网小编转载发布。 为更…

自动语音识别

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#xf…

恭喜发财!东方第一 MEME 拥抱符文

第 431 号符文 HOPE•YOU•GET•RICH 🧧,是 Omnity 首个支持的跨链 Runes 资产,也是TG群里红包小程序支持的第一个 Runes 资产。 大家可以在 Omnity 的 TG 群和 RunesCC 的 TG 群里,不定时的抢到符文红包。 Omnity TG:…

Git系列:git push (-u) 与 git branch (-u)

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

W801学习笔记二十二:英语背单词学习应用——下

续上篇: W801学习笔记二十一:英语背单词学习应用——上 五、处理用户交互 由于英语也是采用了和唐诗一样的《三分钟限时挑战》《五十题竞速挑战》《零错误闯关挑战》,所以用户交互的逻辑和唐诗是一样的。所以,我们抽一个基类&a…

热敏电阻怎么进行性能测试?并以LabVIEW为例进行说明

过程也可用于执行热敏电阻测量。RTD和热敏电阻遵循非常相似的功能原理,测量步骤与下面提供的步骤相同。有关热敏电阻的更多信息,请参阅本文档。 查找设备引脚排列 在连接任何信号之前,请找到您的设备引脚排列。 打开NI MAX并展开设备和接口。…

ETLCloud工具怎么实现多流SQL实时运算?

多流SQL实时运算的特点和应用场景 多流SQL实时运算是一种先进的数据处理技术,它在大数据处理领域中扮演着至关重要的角色,尤其是在需要对多个数据流进行实时分析和处理的应用场景中。该技术结合了SQL(结构化查询语言)的易用性和流…

【计算机毕业设计】基于SSM++jsp的网络游戏公司官方平台系统【源码+lw+部署文档+讲解】

目录 第1章 绪论 1.1 课题背景 1.2 课题意义 1.3 研究内容 第2章 开发环境与技术 2.1 MYSQL数据库 2.2 JSP技术 2.3 SSM框架 第3章 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 系统流程 3.2.1 操作流程 3.2.2 登录流程 3.2.3 删除信息流…

Redis 入坑基本指南

引言 本指南将帮助您了解如何安装、配置和基本使用 Redis。Redis 是一款开源的高性能键值存储系统,可用于缓存、数据库、消息中间件等多种用途。 1. 安装 Redis a. 下载 Redis: 可以从 Redis 官方网站(https://redis.io)下载最…

GORM 与 MySQL(一)

GORM 操作 Mysql 数据库(一) 温馨提示:以下关于 GORM 的使用,是基于 Gin 框架的基础上,如果之前没有了解过 Gin 可能略微困难。 GORM 介绍 GORM 是 Golang 的一个 orm 框架。简单说,ORM 就是通过实例对象…

Ubuntu18.04设置SSH密钥登录

我们一般使用 VSCode 、MobaXterm、PuTTY等 SSH 客户端来远程管理 Linux 服务器。但是,一般的密码方式登录,容易有密码被暴力破解的问题。所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,或者禁用 root 账户登录。但是即…

解决ImportError: cannot import name ‘xxx‘ from partially initialized module xxx

python项目中某个文件名与需要引入的module中的文件名相同时,可能出现循环引用的情况,此时会报错ImportError: cannot import name ‘xxx‘ from partially initialized module xxx。 所以把项目文件中涉及 报错内容的python文件名 修改即可。 如我的…

剧本杀小程序,为商家带来更多收益

剧本杀作为一种社交类游戏,关注度越来越高,目前,市场上剧本杀依然呈现上升发展趋势。 不过当下,在剧本杀市场中,大部分商家都开始使用小程序管理运营剧本杀。相对于线下剧本杀,线上剧本杀小程序便于商家管…

「51媒体」企业单位新闻稿件考核,怎么发布

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 电力税务企事业单位部门等单位提供了新闻稿件,如何在一些重点媒体进行宣发呢: 精准锁定发布媒体 了解考核要求:仔细阅读宣传任务名单,了解…

探索GitHub上的GPTs项目:泄露和被破解的GPT提示

GPTs项目是一个在GitHub上由用户linexjlin发起的开源项目,专注于提供泄露的GPT(生成式预训练转换器)提示。这些提示用于指导和优化AI模型的输出,进而提升代码生成的质量和效率。项目页面提供了丰富的功能和资源,旨在帮…

JavaScript余数运算符

console.log(5 % 2); //5 2 * 2 1 console.log(8 % 3); //8 2 * 3 2 console.log(6 % 2); //6 2 * 3 0 console.log(7 % 2); //7 2 * 3 1● 我们可以利用这个特性来判断一个数是奇数还是偶数 const isEven n >n % 2 0 ? console.log(${n}是偶数) : console.…

Python扩展模块的开发

有关python C扩展开发的教程可以参考概述 — Python 3.12.3 文档。项目已经发布至python官方的pypi里了。具体详情请见AdroitFisherman PyPI。目前该项目还处在测试阶段。尚有部分模块需要开发和测试。 项目结构 项目结构见下图: 代码展示与说明 以单链表(SingleL…

【go项目01_学习记录04】

学习记录 1 集成 Gorilla Mux1.1 为什么不选择 HttpRouter?1.2 安装 gorilla/mux1.3 使用 gorilla/mux1.4 迁移到 Gorilla Mux1.4.1 新增 homeHandler1.4.2 指定 Methods () 来区分请求方法1.4.3 请求路径参数和正则匹配1.4.4 命名路由与链接生成 1 集成 Gorilla Mu…

【Linux网络】PXE批量网络装机

目录 一、系统装机 1.1 三种引导方式 1.2 系统安装过程 1.3 四大重要文件 二、PXE 2.1 PXE实现原理 2.2 PXE手动搭建过程 2.3 kickstart配合pxe完成批量自动安装 一、系统装机 1.1 三种引导方式 硬盘光驱(U盘)网络启动 1.2 系统安装过程 加载boot loader加载启动安…
最新文章