STM32之FreeRTOS移植

news2024/12/23 11:38:44

1.FreeRTOS的移植过程是将系统需要的文件和代码进行移植和裁剪,其移植的主要过程为:

(1)官网上下载FreeRTOS源码:https://www.freertos.org/

(2)移植文件夹,在portable文件夹中只需要保留:Keil、MemMang、RVDS。

(3)代码中的裁剪,修改相关的宏定义。

2.移植文件夹:

(1)首先在Keil的基本工程模板中创建一个文件夹FreeRTOS,用来存放FreeRTOS的源码:

(2)将如下三个文件夹导入到FreeRTOS目录下:

其中,Demo中存放的参考例程。License中是相关的许可信息。Source中便是FreeRTOS的源码。

(3)裁剪Source中的文件:

Source中的文件信息如下

portable中存放是FreeRTOS和硬件之间的接口桥梁,在portable中只需要保留如下三个文件夹即可。

MemMang中存放是内存管理相关的算法文件,本文选择heap_c.c。

RVDS和Keil中存放是软件和硬件之间的接口文件。本文的STM32是Coretex-M3系列,所以需要选择ARM_CM3。

3.创建工程文件:

在基础工程文件中创建两个如下两个文件夹用来存放FreeRTOS相关的文件:

添加文件:

4.导入头文件的路径:

5.移植FreeRTOSConfig.h文件:

FreeRTOSConfig.h是FreeRTOS的配置文件,通常FreeRTOS的裁剪都是通过修改此文件中的宏定义来实现。选择芯片序号和开发环境对应的文件:

将FreeRTOSConfig.h复制到自己的工程文件下,本文将FreeRTOSConfig.h放在include文件夹下:

6.代码裁剪:

(1)添加宏定义,将STM32的PendSV_Handler、SVC_Handler、SysTick_Handler映射到FreeRTOS中。在FreeRTOS中添加如下三个宏定义:

(2)注释stm32f10x_it.c中的SysTick_Handler()、SVC_Handler()和 PendSV_Handler()三个中断服务函数。因为在FreeRTOS中已经重新定义了这三个中断服务函数,所以此处需要注释,防止重复定义。

7.创建任务:

  (1)led.c

#include "led.h"

void LED_Init(void)
{
	//¶¨Òå¶Ë¿ÚµÄ½á¹¹Ìå:
	GPIO_InitTypeDef GPIO_InitStruct;
	
	//1.ʹÄÜʱÖÓ£º
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOA,ENABLE);
	
	//2.ÅäÖö˿ڽṹÌåµÄÏà¹ØÐÅÏ¢£º£¨LED1£©
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOD,&GPIO_InitStruct);
	
	//ÅäÖÃLED0£º
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//³õʼʱ½«LEDµÄ¶Ë¿Ú¶¼ÖÃΪ1£¬¼´Ï¨Ãð
	GPIO_SetBits(GPIOA,GPIO_Pin_8);
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
}

(2)main.c:

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "FreeRTOS.h"
#include "task.h"

TaskHandle_t led0_handler;
TaskHandle_t led1_handler;

void led0(void)
{
	while(1)
	{
		GPIO_ResetBits(GPIOA,GPIO_Pin_8);			//´ò¿ªLED
		vTaskDelay(500);
		GPIO_SetBits(GPIOA,GPIO_Pin_8);			//´ò¿ªLED
		vTaskDelay(500);
	}
}

void led1(void)
{
	while(1)
	{
		GPIO_ResetBits(GPIOD,GPIO_Pin_2);			//´ò¿ªLED
		vTaskDelay(1000);
		GPIO_SetBits(GPIOD,GPIO_Pin_2);			//´ò¿ªLED
		vTaskDelay(1000);
	}
}

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// ÉèÖÃÖжÏÓÅÏȼ¶·Ö×é2
	LED_Init();
	
	/*´´½¨ÈÎÎñ*/
	xTaskCreate((TaskFunction_t) led0,				//ÈÎÎñº¯Êý
	(const char *)"led0_task",								//ÈÎÎñÃû³Æ
		(uint16_t)50,											      //ÈÎÎñ¶ÑÕ»´óС
			(void *)NULL,													//´«µÝ¸øÈÎÎñº¯ÊýµÄ²ÎÊý
				(UBaseType_t)1,											//ÈÎÎñÓÅÏȼ¶
			(TaskHandle_t *)&led0_handler);				//ÈÎÎñ¾ä±ú
	xTaskCreate((TaskFunction_t) led1,
	(const char *)"led1_task",
		(uint16_t)50,
			(void *)NULL,
				(UBaseType_t)1,
			(TaskHandle_t *)&led1_handler);
	vTaskStartScheduler();													//¿ªÊ¼ÈÎÎñµ÷¶È
}



8.运行结果:本文的运行结果是两个LED灯闪烁,其中led0每500ms闪烁一次,led1每1000ms闪烁一次。

9.总结:

FreeRTOS的移植过程主要是对相关的文件和代码进行裁剪。需要去了解每个文件夹中代码的大搞功能,才可以正确的移植文件。

此外,当使用xTaskGetSchedulerState()函数时,需要将FreeRTOS.h中的对应宏定义改为1:

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

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

相关文章

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024)

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024) 会议简介 2024年国际文化、历史、人文、艺术与社会发展会议(CHHASD2024)将在中国武汉举行,主题为“文化、历史,人文、艺术和社会发展”。CHHASD2024汇集了来自世界各…

【C语言】指针篇-初识指针(1/5)

🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 **内存和地址(知识铺垫(了解即可))**如何理解编址**指针变量*…

故障诊断 | 基于LSTM的滚动轴承故障诊断

效果 概述 基于LSTM(长短期记忆网络)的滚动轴承故障诊断是一种利用深度学习技术来预测滚动轴承是否存在故障的方法。下面是一个基本的滚动轴承故障诊断的流程: 数据收集:首先,需要收集与滚动轴承相关的振动信号数据。这些数据可以通过传感器或振动监测系统获取。收集的数…

OSI七层网络模型 —— 筑梦之路

在信息技术领域,OSI七层模型是一个经典的网络通信框架,它将网络通信分为七个层次,每一层都有其独特的功能和作用。为了帮助记忆这七个层次,有一个巧妙的方法:将每个层次的英文单词首字母组合起来,形成了一句…

c# .net 香橙派 Orangepi GPIO高低电平、上升沿触发\下降沿触发 监听回调方法

c# .net 香橙派GPIO高低电平、上升沿触发\下降沿触发 监听回调方法 通过gpio readall 查看 gpio编码 这里用orangepi zero3 ,gpio= 70为例 当gpio 70 输入高电平时,触发回调 c# .net 代码 方法1: Nuget 包 System.Device.Gpio ,微软官方库对香橙派支持越来越好了,用得…

构建第一个ArkTS应用之@BuilderParam装饰器:引用@Builder函数

当开发者创建了自定义组件,并想对该组件添加特定功能时,例如在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法,将会导致所有引入该自定义组件的地方均增加了该功能。为解决此问题,ArkUI引入了BuilderParam装饰器&…

2024年网络安全行业全景图 | 亚信安全实力占据62领域

近日,安全牛《中国网络安全行业全景图》(第十一版)正式发布。 本次发布的全景图,包含16个一级安全分类,108个二级细分领域,共收录454家国内安全厂商,细分领域共收录2413项。亚信安全凭借在云安全…

① 学习PID--先认识有什么电机和驱动

我们在学习和使用PID的时候,可能会有很多电机的选择。然而不同的电机使用的PID参数是不太一样的。所以我们需要认识电机和驱动器。 1 电机有什么类型 1.1 电机的简介 电机是一种可以在电能和机械能的之间相互转换的设备,其中发电机是将机械能转换为电能…

虚拟机下CentOS7开启SSH连接

虚拟机下CentOS7开启SSH连接 自己在VMware中装了CentOS 6.3,然后主机(或者说xshell)与里面的虚拟机连不通,刚学习,一头雾水,查了半天,也不知道怎么弄。 在虚拟机(Vmware Workstatio…

优思学院|2024年如何成为一名六西格玛黑带?

如果你总是觉得无论多么努力,职场上似乎难以有所突破,那么你应该知道,你并不是孤独的。 实际上,大量研究表明,高达90%的人对自己的工作感到不满,这意味着在你认识的每10人中,可能只有1人对其工…

小程序视频如何下载到电脑上

小程序视频如何下载到电脑上,很简单 1.利用Fiddler和Charles这些专业的抓包工具 2.利用录屏 3.利用专门抓取资源的工具(集成了抓取下载,而且对资源下载很友好) 工具我已经打包好了 下载高手链接:https://pan.baidu.com/s/1qJ81sNBzzzU0w…

烧结钕铁硼永磁体是如何生产的?

烧结钕铁硼永磁体是采用粉末冶金法生产的,从备料到成品发货一般要经过十几个工艺环节,在不同阶段还包括若干次检测分析。 整个生产过程是一个系统工程,环环相扣。一般我们将生产磁体毛坯的过程称为前道生产环节,将毛坯加工成最终…

Thingsboard PE 白标的使用

只有专业版支持白标功能。 使用 ThingsBoard Cloud 或安装您自己的平台实例。 一、介绍 ThingsBoard Web 界面提供了简便的操作,让您能够轻松配置您的公司或产品标识和配色方案,无需进行编码工作或重新启动服务。 系统管理员、租户和客户管理员可以根据需要自定义配色方案、…

计算机网络2——物理层2

文章目录 一、信道复用技术1、介绍2、频分复用、时分复用和统计时分复用3、波分复用4、码分复用 二、数字传输系统三、宽带接入技术1、介绍2、ADSL 技术3、光纤同轴混合网(HFC网)4、FTTx技术 一、信道复用技术 1、介绍 复用(multiplexing)是通信技术中的基本概念。计算机网络…

抖音小店开店必做的几个基础搭建,新手注意,不做店铺没流量

大家好,我是电商笨笨熊 新手入手做抖音小店一定不要着急选品,先去做店铺基础搭建,吸引更多流量进入店铺,提升店铺曝光度。 店铺搭建都没做好,流量来了你也接不住,所以今天我们就来聊聊哪些必做的搭建内容…

常见 Java 代码缺陷及规避方式

阿里妹导读 在日常开发过程中,我们会碰到各种各样的代码缺陷或者 Bug,比如 NPE、 线程安全问题、异常处理等。这篇文章总结了一些常见的问题及应对方案,希望能帮助到大家。 问题列表 空指针异常 NPE 或许是编程语言中最常见的问题&#xff0…

rv1103/buildroot系统中添加包如v4l2

v4l2: rv1103给出的包中已经有v4l,只需要在menuconfig中打开编译选项,步骤如下: 在luckfox的github网站中下载的源代码在~/linux/luckfox/luckfox-pico-main中目录结构如下: 打开编译选项 cd ./sysdrv/source/buildroot/buildroot-2023.02.…

浅谈普通人成为程序员的几个原因

成为程序员的原因可以因人而异,以下是一些普遍的原因: 兴趣和热情:很多人对计算机科学和编程非常感兴趣。他们喜欢探索如何使用代码来解决问题,并且享受编程过程中的逻辑思考和创造性。 高薪和就业机会:现代社会对技术…

GEE错误——Landsat影像加载后显示白色或黑色如何解决?

错误展示 简介 在GEE中,如果加载的Landsat影像显示为白色或黑色,可能的原因: 1. 数据范围问题:Landsat影像通常以16位有符号整数的格式存储,但在加载到GEE时,默认使用了0到1的归一化数据范围。这可能导致影像显示不正确。解决方法是通过将图像转换为正确的数据范围来修…

ubuntu下的串口调试工具cutecom

系统:ubuntu20.04 (1)接线 使用 rs485<-----> rs232 转接口( 设备直接出来的是rs485),电脑主机接入一根 rs232<-----> USB口 连接线,ubuntu系统下打开 termin…