关于FreeRTOS移植到STM32F103上的步骤以及注意事项

2024-05-27 11:08

本文主要是介绍关于FreeRTOS移植到STM32F103上的步骤以及注意事项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    因为最近比较有时间,而且发现自己对于STM上可以跑的操作系统相对陌生。所以选择几个操作系统进行移植和玩几个DEMO理解一下。虽然理解的不是很深入,但是如果项目需要的话,只是移植,进行多任务的操作。应付一下还是绰绰有余的。之前移植了uCosII.后续有需要会总结一下。这里先对FreeRTOS相关的问题进行总结。因为个人能力有限。有什么不对的地方请大家批评,写这个主要是为了记录一下自己的移植过程。

1、第一步肯定是先到官网去下载关于FreeRTOS的源码

下面的网址是官方最新源码的下载地址:

https://sourceforge.net/projects/freertos/files/latest/download?source=files

目前官方提供的最新版本是v9.0.0, FreeRTOS源码在解压目录下的路径为

FreeRTOS_V9.0.0rc2\FreeRTOS\Source

2、下载完,进行安装。安装完你会得到如下目录的文件

我们需要的是FreeRTOS这个目录的文件。而关于-Plus的使用,目前小弟并没有试过。大家可以试试,好玩记得推荐哦。

3、进入FreeRTOS目录,你会发现里面有三个文件夹,分别是Demo,License,Source。在Demo中,我们能看到很多不同平台的移植例程,这个很好的,有相关不懂的平台,完全可以用来参考使用。因为我们是在MDK下移植。所以选择CORTEX_STM32F103_Keil这个文件夹的内容进行参考,其实这个Demo还是很有帮助的,后续你在移植的时候,会发现缺少的文件都可以在这个Demo中进行直接拿来使用。选择介绍另一个文件夹的主要用途。

另一个文件夹是Source.这个目录下的文件主要有

include这个目录,我建议大家如果不是很清楚哪些要用,哪些不用的要,都可以添加进工程中。重点是这个portable文件夹,里面的东西比较多。而我们主要用到的目录有下面几个。关于不同的平台,大家可以自己选择哦。

其实你会发现,你进入Keil中,其实没有东西,就是告诉你,这个目录和RVDS中的是一样的操作。所以你需要进入RVDS中。把关于你平台内核的文件拷贝过来。小弟这边使用的M3内核,所以拷贝后如下。还有这个MemMang一定要记得拿过来,很重要哦。因为关于内存的管理都是在这里面呢。

接下来介绍下根目录下的这个几个源文件,我们需要用到的就只有几个,如果只是移植看一下加入操作系统后的运行情况。

现在,我们需要移植的文件大概就只有这些哦。现在就可以建立一个简单的工程了。关于工程建立,这边就不多说啦。大家不会的话,可以自己参考网上的例程或者正点原子中不完全手册上的教程哦。现在小弟创建工程并添加进相关文件如下:

其中port.c就是在ARM_CM3中找。heap_4.c就是在MenMang中找。里面有不同的内存管理方案,大家可以根据需要选择自己想要的方案,小弟这边选的是heap_4.c.现在要说一个最最骚的问题了,就是你添加完这些文件。然后点击编译,如果你默认的是选择系统的启动文件,就会报出很多错误。还有就是会缺少一个文件叫做FreeRTOSConfig.h,你会发现这个文件在源码中并找不到。所以刚才说了哦,Demo很重要呢。就是要到Demo中去找到这个文件,并且添加进去。还有就是启动文件,如果你看不出那些错误怎么改,也拿Demo中的启动文件啦。有时候,我们需要的是应用,如果你有时间并且很多兴趣,你就可以一步步进行理解操作哦。小弟这边是试验。所以直接拿了STM32F10x.s这个启动文件,后续的话,应该会进行对比分析,再跟大家分享。

最后就是跟你的需要添加一些文件进去哦,如果你用的是库函数开发,记得关于stm32f10x_conf.h、#include "stm32f10x.h"这些文件很重要哦。记得去Demo中找,如果丢失会很麻烦呢,很多地方编译都不会通过。还有就是库函数开发的话,这边一个地方要设置,不然也编译不过呢

 

现在看一下main.c函数的主要操作

#include "led.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x.h"
#include "misc.h"

#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"

void LedTask1(void *pvParameters )
{
while(1)
{
printf("i am LedTask1\r\n");
//vTaskDelay(100 / portTICK_RATE_MS);  
LED0_OFF;
vTaskDelay(500 / portTICK_RATE_MS);  
LED0_ON;
vTaskDelay(500 / portTICK_RATE_MS);  
}

}

void LedTask2(void *pvParameters )
{
while(1)
{
printf("i am LedTask2\r\n");
vTaskDelay(10 / portTICK_RATE_MS);  
// LED1_OFF;
// vTaskDelay(500 / portTICK_RATE_MS);  
// LED1_ON;
// vTaskDelay(500 / portTICK_RATE_MS);  
}
}

int main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

uart_init(9600);
LED_Init();

printf("init sucess\r\n");

//堆栈深度(字)  //任务参数 //任务优先级 //任务句柄
xTaskCreate(LedTask1,"LED_TASK1",40,NULL,1,NULL);     
xTaskCreate(LedTask2,"LED_TASK2",40,NULL,2,NULL);  

vTaskStartScheduler(); //启动任务调度器

return 0;

}

 

根据需求添加哦。我这边是用LED灯和串口进行验证是否移植成功。所以添加了关于LED和USART的模块代码。这边有个注意的地方是。你的创建的任务一定记得在后面加上一点延迟。不然的话,很容易出错,你想看到的效果,就看不到啦。像小弟这个Demo,效果就是LED灯5秒闪烁一次。然后串口交替打印信息。

 

好了。目前简单的移植就这些啦,是不是觉得很简单呢。因为现在很多物联网小模块,可能只需要接收和处理数据。然后上传之类的。用上一个操作系统,可能会比较好哦,毕竟简单的处理。

这篇关于关于FreeRTOS移植到STM32F103上的步骤以及注意事项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007299

相关文章

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

bytes.split的用法和注意事项

当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa

arduino ide安装详细步骤

​ 大家好,我是程序员小羊! 前言: Arduino IDE 是一个专为编程 Arduino 微控制器设计的集成开发环境,使用起来非常方便。下面将介绍如何在不同平台上安装 Arduino IDE 的详细步骤,包括 Windows、Mac 和 Linux 系统。 一、在 Windows 上安装 Arduino IDE 1. 下载 Arduino IDE 打开 Arduino 官网

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

FreeRTOS学习笔记(六)队列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、队列的基本内容1.1 队列的引入1.2 FreeRTOS 队列的功能与作用1.3 队列的结构体1.4 队列的使用流程 二、相关API详解2.1 xQueueCreate2.2 xQueueSend2.3 xQueueReceive2.4 xQueueSendFromISR2.5 xQueueRecei

FreeRTOS学习笔记(二)任务基础篇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 任务的基本内容1.1 任务的基本特点1.2 任务的状态1.3 任务控制块——任务的“身份证” 二、 任务的实现2.1 定义任务函数2.2 创建任务2.3 启动任务调度器2.4 任务的运行与切换2.4.1 利用延时函数2.4.2 利用中断 2.5 任务的通信与同步2.6 任务的删除2.7 任务的通知2

Java程序到CPU上执行 的步骤

相信很多的小伙伴在最初学习编程的时候会容易产生一个疑惑❓,那就是编写的Java代码究竟是怎么一步一步到CPU上去执行的呢?CPU又是如何执行的呢?今天跟随小编的脚步去化解开这个疑惑❓。 在学习这个过程之前,我们需要先讲解一些与本内容相关的知识点 指令 指令是指导CPU运行的命令,主要由操作码+被操作数组成。 其中操作码用来表示要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也

FreeRTOS学习笔记(四)Freertos的中断管理及临界保护

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Cortex-M 中断管理1.1 中断优先级分组1.2 相关寄存器1.3 相关宏定义1.4 FreeRTOS 开关中断 二、临界段及其保护2.1 taskENTER_CRITICAL( ) 和 taskEXIT_CRITICAL( )2.2 taskENTER_CRITICAL_FROM_ISR( )

Vue项目开发各种注意事项

1、eCharts引入方式(单页面) import * as echarts from 'echarts'Vue.prototype.$echarts = echarts 2、Sass引入 sass和node-sass 中 node-sass不要引入最新版本  引入@7.x 否则会报错 可能是语法规则改变 3、严格模式不要随意开启、将eslint文件中 extends: 中的vue去除