STM32F10x移植FreeRTOS

news2024/11/28 2:40:03

一、获取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.coloradmin.cn/o/1650337.html

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

相关文章

28.leetcode---前K个高频单词(Java版)

题目链接: https://leetcode.cn/problems/top-k-frequent-words/description/ 题解: 代码: 测试:

巨控GRM561/562/563/564Q杀菌信息远程监控

摘要 通过程序编写、手机APP画面制作等运行系统,实现电脑及手机APP显示的历史曲线画面和数据图形化的实时性。 不仅流程效率提升90%以上,同时为杀菌生产提供有利的质量保障,还有效规避因触屏及内存卡的突发异常导致历史数据的丢失&#xff0…

强大的禄得可转债自定义因子轮动系统完成,可转债三低为例子

经过几天的测试终于完成了可转债自定义因子轮动,超过1000行的源代码 我提供了服务器的数据支持自动api下载,我给大家维护数据 网页 http://120.78.132.143:8023/ 录得数据支持http://120.78.132.143:8023/lude_data_app api数据支持,我提供…

杭州恒生面试,社招,3年经验

你好,我是田哥 一位朋友节前去恒生面试,其实面试问题大部分都是八股文,但由于自己平时工作比较忙,完全没有时间没有精力去看八股文,导致面试结果不太理想,HR说节后通知面试结果(估计是凉了&…

传统汽车空调系统工作原理

1.首先讲一个概念 液体变成气体:吸热 气体变成液体:放热 2.在汽车空调系统中热量的传递的介质不是水,而是氟利昂,简称:“氟”。 3.传统式汽车空调结构如下 该三个部件位于车头进气口位置 该部位位于汽车驾驶车厢前方…

常见的容器技术有哪些

容器技术是一种轻量级的软件封装方式,它将软件代码及其依赖项打包在一起,这样应用可以在任何支持容器的系统上无缝运行。它允许应用程序及其依赖项在一个隔离的环境中运行,这个环境被称为容器。容器技术有助于提高应用程序的可移植性、一致性…

Vue3专栏项目 -- 一、第一个页面(上)

一、ColumnList 组件(专栏列表组件)编码: 该组件要接收一个数组,数组中是一个个专栏数据,数据中包括id、title、avator、description。所以我们定义一个泛型,泛型为id为number类型title为string类型如下这…

初识C++ · 类和对象(下)

目录 1 再谈构造函数 2 类中的隐式类型转换 3 Static成员 4 友元和内部类 5 匿名对象 6 编译器的一些优化 1 再谈构造函数 先看一段代码: class Date { public :Date(int year, int month, int day){_year year;_month month;_day day;} private:int _ye…

Redis之Linux下的安装配置

Redis之Linux下的安装配置 Redis下载 Linux下下载源码安装配置 方式一 官网下载:https://redis.io/download ​ 其他版本下载:https://download.redis.io/releases/ 方式二(推荐) GitHub下载:https://github.com/r…

基于ambari hdp的kafka用户授权读写权限

基于ambari hdp的kafka用户授权读写权限 版本Kafka 2.0.0添加自定义配置修改admin密码重启kafka授权读取授权写入有效通配符部分举例 版本Kafka 2.0.0 添加自定义配置 authorizer.class.name kafka.security.auth.SimpleAclAuthorizer super.users User:admin allow.everyo…

【强训笔记】day13

NO.1 代码实现&#xff1a; #include <iostream>#include<string>using namespace std;int n,k,t; string s;int func() {int ret0;for(int i0;i<n;i){char chs[i];if(chL) ret-1;else{if(i-1>0&&i-2>0&&s[i-1]W&&s[i-2]W) retk…

Android 官网Ota介绍

构建 OTA 软件包 | Android 开源项目 | Android Open Source Project

太阳能光伏在生活中的三大作用

随着现在太阳能光伏的逐步发展&#xff0c;太阳能光伏已经越来越走近人们的生活&#xff0c;小编带大家盘点一下光伏在生活中的应用 一、发电 光伏的最初应用就是用来发电&#xff0c;以替代传统的化石燃料发电方式。光伏发电可以从根本上解决当今社会面临的能源短缺问题&…

我的板子为什么测不了损耗

高速先生成员--周伟 最近我们珠海高速实验室正式对外开放了&#xff0c;我们也同步推出了关于高速信号测试、高速仪器的一些视频。 大家知道我们有仪器后&#xff0c;很多热心的小伙伴们就以为我们开挂了&#xff0c;什么都能测&#xff0c;然后就会来咨询我们&#xff0c;很多…

申请免费一年期的https证书

现在https证书的普及度还是比较高的&#xff0c;大众对于https证书的需求度也日益提升。针对于一些个人用户或是企业而言&#xff0c;实现网站的https访问已经成为了一种标配。 当前的免费证书&#xff1a; 截止到2024年为止&#xff0c;基本所有平台都停止了对于一年期免费S…

Windows环境编译 VVenC 源码生成 Visual Studio 工程

VVenC介绍 Fraunhofer通用视频编码器(VVenC)的开发是为了提供一种公开可用的、快速和有效的VVC编码器实现。VVenC软件基于VTM&#xff0c;其优化包括软件重新设计以减轻性能瓶颈、广泛的SIMD优化、改进的编码器搜索算法和基本的多线程支持以利用并行。此外&#xff0c;VVenC支…

Python运维-日志记录、FTP、邮件提醒

本章目录如下&#xff1a; 五、日志记录 5.1、日志模块简介 5.2、logging模块的配置与使用 六、搭建FTP服务器与客户端 6.1、FTP服务器模式 6.2、搭建服务器 6.3、编写FTP客户端程序 七、邮件提醒 7.1、发送邮件 7.2、接收邮件 7.3、实例&#xff1a;将报警信息实时…

python实验三 实现UDP协议、TCP协议进行服务器端与客户端的交互

实验三 实验题目 1、请利用生成器构造一下求阶乘的函数Factorial()&#xff0c;定义一个函数m()&#xff0c;在m()中调用生成器Factorial()生成小于100的阶乘序列存入集合s中&#xff0c;输出s。 【代码】 def factorial():n1f1while 1:​ f * n​ yield (f)​ n1…

Map集合的实现类~TreeMap

重复依据&#xff1a;通过对键进行排序 先创建Student类&#xff0c;并在主函数new对象&#xff0c;然后创建TreeMap&#xff1a; 建立红黑树&#xff0c;需要在Student类后面实现类的接口&#xff1a; 重写其中的compareTo方法&#xff1a; 或者可以自定义比较器&#xff1a; …

使用quicker进行局域网文件互传

使用了动作&#xff1a;文件服务器 https://getquicker.net/Sharedaction?code7a49ca6b-d243-4478-1e87-08d9f1ba2358 在文件夹中打开打开这个动作就能使用。 配置 右键动作可以设置&#xff1a; 选择了最后一个之后&#xff0c;打开服务之后能在右下角有一个弹窗&#xff…