移植FreeRTOS到STM32

news2024/9/25 23:16:10

移植FreeRTOS到STM32单片机上

  • 引言
  • 介绍
    • 什么是 RTOS?
    • 为什么嵌入式设备往往使用RTOS?
    • FreeRTOS
  • 具体步骤
  • 总结

引言

本文详细介绍如何移植FreeRTOS到STM32单片机上。移植操作系统是嵌入式开发的入门基础,单片机和嵌入式在物理上其实是一摸一样的,区别就是软件上嵌入式跑了操作系统而单片机没有。文本选用市场上最常见的STM32和FreeRTOS,为大家介绍如何移植操作系统到MCU上。

介绍

什么是 RTOS?

实时操作系统(Real-time operating system, RTOS),它会按照排序运行、管理系统资源,并为开发应用程序提供一致的基础。
实时操作系统与一般的操作系统相比,最大的特色就是“实时性”,如果有一个任务需要执行,实时操作系统会马上(在较短时间内)执行该任务,不会有较长的延时。这种特性保证了各个任务的及时执行。

只有“实时性”才是RTOS的最大特征,其它的都不算是。

实时运算是计算机科学中对受到“实时约束”的计算机硬件和计算机软件系统的研究,实时约束像是从事件发生到系统回应之间的最长时间限制。实时程序必须保证在严格的时间限制内响应。

实时操作系统中都要包含一个实时任务调度器,这个任务调度器与其它操作系统的最大不同是强调:严格按照优先级来分配CPU时间,并且时间片轮转不是实时调度器的一个必选项。

提出实时操作系统的概念,可以至少解决两个问题:一个是早期的CPU任务切换的开销太大,实时调度器可以避免任务频繁切换导致CPU时间的浪费;另一个是在一些特殊的应用场景中,必须要保证重要的任务优先被执行。

在这样的背景下,实时操作系统就被设计出来了,典型的实时操作系统有FreeRTOS、VxWorks,RT-Thread,uCOS,QNX,WinCE等。

由于设备性能的发展,原来很多实时性要求高的场景,已经切换到普通的操作系统了。Linux在嵌入式设备上的推广,使用实时操作系统的很多设备已经改用Linux了,因为硬件性能的提升会让系统延迟降低到一个用户可以接受的程度。

但在某些特定的场景下,比如工业自动化、机器人、航空航天、军工领域等,仍然对实时操作系统有需求,并且应该会长期存在。

为什么嵌入式设备往往使用RTOS?

由于嵌入式设备对资源,功耗很敏感,所以RTOS也具备可裁剪、低功耗、资源占用率低等特点。相对于通用的分时操作系统,如linux,Windows而言,RTOS更强调实时。

RTOS保证了在规定时间内能够完成某个任务,如果不能在指定时间完成会造成重大事故,所以必须某些场景必须使用RTOS。

FreeRTOS

FreeRTOS应该算是目前最流行的嵌入式操作系统之一,具体原因当然是因为开源,毕竟产品还是要控制成本的。FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,我们学习中最常用的STM32F103C8T6跑很多RTOS都可能因为内存受限,但FreeRTOS就不会,完全能满足我们日常的开发需求。当然了,FreeRTOS 不仅局限于在微控制器中使用。但从文件数量上来看 FreeRTOS 要比UCOSII 和 UCOSIII 小的多。

FreeRTOS最开始网站是全英的,我刚入门的时候因为英语不好,饱受折磨。现在网站已经能切换中文了,算是方便了后面学习的人。

具体步骤

  1. 首先准备一个基础项目,我们的点灯或者串口收发这种简单的程序就行,甚至连点灯都没有的项目也可以。毕竟操作系统也要依托于一个MCU的项目。
  2. 获取FreeRTOS系统源码,两种方法。
  • 公众号:物联网知识,后台回复:FreeRTOS源码

  • CSDN资源平台:FreeRTOS源码(最新)-嵌入式文档类资源-CSDN文库

  • 官网下载:FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions

  1. 解压我们下载的文件,我们进入FreeRTOSv202112.00,之后进入FreeRTOS,再后进入吧Source文件。一会我们需要用到的文件主要就在这里。


  1. 我们在我们准备的项目中创建一个文件夹FreeRTOS,将上面一步的文件中的内容复制到刚创建的FreeRTOS中。

  1. 进行剪裁,portable 文件夹,我们只需要留下 keil、MemMang 和 RVDS这三个文件夹,其他的都可以删除掉。
  2. 向工程分组中添加文件,创建两个组,分别是FreeRTOS_CORE和FreeRTOS_Portable。

将FreeRTOS相关的文件添加进来。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lJGKbvQN-1672372740060)(image-20221230110308042.png)]

port.c 是 RVDS 文件夹下的 ARM_CM3 中的文件,因为 STM32F103 是 Cortex-M3 内核的,因此要选择 ARM_CM3中的 port.c 文件。heap_4.c 是 MemMang 文件夹中的。

  1. 添加头文件,我们将FreeRTOS相关的头文件添加进项目。

  1. 头文件路径添加完成以后编译一下,看看有没有什么错误,结果会发现提示打不开“FreeRTOSConfig.h”这个文件,因为我们还没添加这个文件。这个文件最好是自己编写,当然官方也给我提供了一些例程。打开我们最开始下载的FreeRTOS源码,里面的Deme文件夹中有一个CORTEX_STM32F103_Keil文件夹,我们可以看到,里面是有这个.h文件的。

我们把这个文件复制粘贴放进我们的项目中存放头文件的文件夹即可。FreeRTOSConfig.h是剪裁RTOS的关键,后面的学习中,还会涉及到,读者也可以在网上查一查相关内容。

  1. 我们编译一下我们的项目,看看是否出现错误,如果出现错误就按照错误改正就好了,一般情况下不会出现什么错误,如果有错,绝大多数都是因为FreeRTOSConfig.h的配置问题,因为问题种类多样,这里就不一一列举,大家可以在网上搜索,我也会总结移植常遇到的问题和解决方法,后面再写一篇推文给大家分享。
  2. 移植成功,大家可以动手试试了。

总结

当裸机开发的实时性差,资源浪费和编写困难等问题逐渐暴露出来时,RTOS就是我们首选的解决方式。我们也就从单片机工程师转变成嵌入式工程师了。本文详细介绍了如何移植FreeRTOS到STM32上,这是嵌入式入门的关键,后面会继续分享更多嵌入式相关内容。

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

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

相关文章

二、MySQL 介绍及 MySQL 安装与配置

文章目录一、新手如何学习 MySQL二、MySQL 介绍2.1 百科定义2.2 创始人简历2.3 历史背景2.4 MySQL 的优势2.5 MySQL 版本2.6 MySQL 特性2.7 MySQL 的应用环境2.8 数据库专业术语2.9 MySQL 客户端和服务器架构(C/S架构)2.10 MySQL 内部结构三、MySQL 服务…

免费分享一个SpringBoot鲜花商城管理系统,很漂亮的

大家好,我是锋哥,看到一个不错的SpringBoot鲜花商城管理系统,分享下哈。 项目介绍 这是基于主流SpringBoot框架开发的项目,thymeleaf模版引擎,Mysql数据库,druid连接池,界面美观大方&#xff…

spring动态数据源,多数据源

Spring是如何支持多数据源的 Spring提供了一个AbstractRoutingDataSource类,用来实现对多个DataSource的按需路由,本文介绍的就是基于此方式实现的多数据源实践。 一、什么是AbstractRoutingDataSource 先看类上的注释: Abstract {link jav…

Goby安装与使用

Goby安装与使用1.Goby简介1.1.Goby介绍1.2.Goby下载2.Goby使用2.1.切换语言2.2.新建扫描2.2.1.设置扫描地址2.2.2.设置端口2.2.2.1.选中默认端口2.2.2.2.自定义端口2.2.3.漏洞2.2.3.1.通用Poc2.2.3.2.暴力破解2.2.3.3.全部漏洞2.2.3.4.自定义Poc2.2.4.开始扫描2.3.扫描情况2.3.…

【Eureka】如何实现注册,续约,剔除,服务发现

文章目录前言服务注册服务续约服务剔除(服务端去剔除过期服务)被动下线服务下线(主动下线)client发起的服务发现集群同步信息Work下载前言 Eureka是SpringCloud的具体实现之一,提供了服务注册,发现,续约,撤…

[ Linux Audio 篇 ] Type-C 转 3.5mm音频接口介绍

简介 常见的Type-C 转3.5mm 线有两种: 模拟Type-C转3.5mm音频线数字Type-C转3.5mm 音频线,也就是带DAC芯片的转换线 当使用Type-C转换3.5mm音频接口时,使用到的是这里面的SBU1、D-、D、CC四个针脚,手机会通过这四个针脚输出模拟…

信贷--------

定义 信贷:一切以实现承诺为条件的价值运动方式,如贷款、担保、承诺、赊欠等 信贷业务:本外币贷款、贴现、透支、押汇(表内信贷);票据承兑、信用证、保函、贷款承诺、信贷证明等(表外信贷&…

卷积神经网络硬件加速——INT8数据精度加速

卷积神经网络硬件加速——INT8数据精度加速 上一专题已介绍了一种通用的卷积神经网络硬件加速方法——Supertile,本文将介绍一种特殊的硬件加速方案,一种INT8数据精度下的双倍算力提升方案。 目前大部分卷积神经网络模型的数据类型都是32-bits单精度浮点…

android开发笔记002

ListView控件 <ListViewandroid:id"id/main_iv"android:layout_width"match_parent"android:layout_height"match_parent"android:layout_below"id/main_top_layout"android:padding"10dp"android:divider"null&qu…

TCP三次握手详解

三次握手是 TCP 连接的建立过程。在握手之前&#xff0c;主动打开连接的客户端结束 CLOSE 阶段&#xff0c;被动打开的服务器也结束 CLOSE 阶段&#xff0c;并进入 LISTEN 阶段。随后进入三次握手阶段&#xff1a; ① 首先客户端向服务器发送一个 SYN 包&#xff0c;并等待服务…

c++11 标准模板(STL)(std::deque)(二)

构造函数 std::deque<T,Allocator>::deque deque(); (1) explicit deque( const Allocator& alloc ); (2)explicit deque( size_type count, const T& value T(), const Allocator& alloc Allocator());(3)(C11 前) …

网络编程 完成端口模型

1.概念以及重叠IO存在的问题 2.完成端口代码详解 整体流程 使用到的新函数 1.CreateIoCompletionPort函数 该函数创建输入/输出 (I/O) 完成端口并将其与指定的文件句柄相关联&#xff0c;或创建尚未与文件句柄关联的 I/O 完成端口&#xff0c;以便稍后关联&#xff0c;即创建…

金融业务的数据存储选型

为什么用关系型数据库&#xff1f;最常见的理由是别人在用&#xff0c;所以我也得用&#xff0c;但是这个并不是理由&#xff0c;而是借口。 1 数据分类 选择数据存储类型前&#xff0c;先分析数据特点&#xff0c;才能针对性选择存储方案。 通常按数据与数据之间关系的复杂…

SSM2---spring

Spring spring环境搭建 创建一个空白模块&#xff0c;目录结构如下 在pom.xml文件中引入相关依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/…

基于SSM(Spring+SpringMVC+Mybatis)实现的个人博客系统,含数据库文件及详细说明

关于项目 该博客是基于SSM实现的个人博客系统&#xff0c;适合初学SSM和个人博客制作的同学学习。 最新版本支持用户注册&#xff0c;包含用户和管理员两个角色 。 博主已写了一篇该项目的毕业论文和录制了2个小时的代码讲解可以供大家学习&#xff0c;需要的可以联系博主&…

RFID在模块管理中的应用

应用背景 模具是工业生产的基础工艺装备&#xff0c;被称为“工业之母”。作为国民经济的基础行业&#xff0c;模具涉及机械、汽车、轻工、电子、化工、冶金、建材等各个行业&#xff0c;应用范围十分广泛。模具资产管理采用传统的人工纸质记录的方式已经无法及时有效的进行&am…

还在用 XShell - 试试 IntelliJ IDEA 的 SSH

SSH 是很多人用得不多&#xff0c;但是又不得不用的工具。 如果你不是搞运维&#xff0c;没有必要搞个 CRT&#xff0c;XShell 也够用了&#xff0c;但是这 2 个都是收费软件&#xff0c;同时还不太便宜。 试试 IDEA 的 SSH 其实 IntelliJ IDEA 已经提供了 SSH 的功能。 如…

053-线程的状态改变及线程同步详细介绍

【上一讲】051-java线程的2种实现方法详解_CSDN专家-赖老师(软件之家)的博客-CSDN博客 线程可以处于以下四个状态之一1.新建(new):线程对象已经建立,但还没有启动,所以他不能运行。2.就绪(runnable):这种状态下,只要调度程序把时间片分配给线程就可以执行,也就是说…

10分钟带你了解什么是ArrayBuffer?

前言 很多时候我们前端开发是用不到 ArrayBuffer 的&#xff0c;但是用不到 ArrayBuffer 不代表我们不需要了解这个东西。本文就围绕 ArrayBuffer 来讲一下相关知识&#xff0c;大概需要10分钟左右就可以读完本文。 什么是ArrayBuffer&#xff1f; 描述 ArrayBuffer 对象用…

Paramiko库讲解

目录 基本概念 Paramiko组件架构 Key handing类 Transport类 SFTPClient类 SSHClient类—主要使用的类 Python编写完整例子 基本概念 Paramiko是Python实现SSHv2协议的模块&#xff0c;支持口令认证和公钥认证两种方式 通过Paramiko可以实现通过Python进行安全的远程命…