STM32(F103ZET6)第十九课:FreeRtos的移植和使用

目录

  • 需求
  • 一、FreeRtos简介
  • 二、移植FreeRtos
    • 1.复制代码
    • 2.内存空间分配和内核相关接口
    • 3.FreeRtosConfig
    • 4.添加到工程中
    • 三、任务块操作
    • 1.任务四种状态
    • 2.创建任务过程

需求

1.将FreeRtos(嵌入式实时操作系统)移植到STM32中。
2.在该系统中实现任务的创建、挂起、恢复和删除。
3.将板子上写的传感器模块的数据获取,移植到FreeRtos(嵌入式实时操作系统)环境下。
在这里插入图片描述

一、FreeRtos简介

裸机执行流程:前后台系统
在这里插入图片描述
操作系统执行流程:
在这里插入图片描述
加入操作系统的作用:用户想要实现多个任务并行的效果,但是单片机只有一个核心,同时只能处理一件事,通过加入操作系统,可以实现任务快速的切换,给人一种多个任务同时在执行的错觉。
FreeRtos的概念:
在这里插入图片描述在这里插入图片描述

二、移植FreeRtos

移植之前,找一个工程mian.c清空,然后移植FreeRTOS。因为加上操作系统之后,编程方式就变了,之前的while(1)就不在使用了。

1.复制代码

从官网下载的FreeRTOS 包含 Demo 例程和内核源码(比较重要,我们就需要提取该目录下的大部分文件)。 FreeRTOS 文件夹下的 Source 文件夹里面包含的是 FreeRTOS 内核的源代码,
我们移植 FreeRTOS 的时候就需要这部分源代码; FreeRTOS 文件夹下的 Demo 文件夹里
面包含了 FreeRTOS 官方为各个单片机移植好的工程代码, FreeRTOS 为了推广自己,会
给各种半导体厂商的评估板写好完整的工程程序,这些程序就放在 Demo 这个目录下,这
部分 Demo 非常有参考价值。我们把 FreeRTOS 到 STM32 的时候,FreeRTOSConfig.h 这
个头文件就是从这里拷贝过来的。
在这里插入图片描述
将源码直接复制到想要移植的工程文件下,改名为FreeRtos:
在这里插入图片描述
这里我们再重点分析下 FreeRTOS/ Source 文件夹下的文件,具体见图 13-6。“include”
文件夹和“portable”文件夹包含的是 FreeRTOS 的通用的头文件和 C 文件,这两部分的文
件试用于各种编译器和 include 处理器, 是通用的。需要移植的头文件和 C 文件放在编号
portblle 这个文件夹。
在这里插入图片描述
我们打开 portable 这个文件夹,可以看到里面很多与编译器相关的文件夹, 在不同的
编译器中使用不同的支持文件。文件夹“Keil”就是我们就是我们使用的编译器,当打开 “Keil”
文件夹的时候,你会看到一句话“See-also-the-RVDS-directory.txt”,其实 “Keil” 里面的内容
跟 RVDS 里面的内容一样,所以我们只需要 RVDS 文件夹里面的内容即可。而 MemMang
文件夹下存放的是跟内存管理相关的,我们的重点是RVDS文件夹
在这里插入图片描述
打开 RVDS 文件夹, 下面包含了各种处理器相关的文件夹,从文件夹的名字我们就非
常熟悉了,有 M0、 M3、 M4 等各种系列, FreeRTOS 是一个软件,单片机是一个硬件,
FreeRTOS 要想运行在一个单片机上面,它们就必须关联在一起,那么怎么关联?还是得通
过写代码来关联,这部分关联的文件叫接口文件,通常由汇编和 C 联合编写。这些接口文
件都是跟硬件密切相关的,不同的硬件接口文件是不一样的,但都大同小异。编写这些接口
文件的过程我们就叫移植,移植的过程通常由 FreeRTOS 和 MCU 原厂的人来负责,移植
好的这些接口文件就放在 RVDS 这个文件夹的目录下。
在这里插入图片描述

2.内存空间分配和内核相关接口

MemMang 文件夹下存放的是跟内存管理相关的,总共有五个 heap 文件以及一
个 readme 说明文件,这五个 heap 文件在移植的时候必须使用一个,因为 FreeRTOS 在
创建内核对象的时候使用的是动态分配内存,而这些动态内存分配的函数则在这几个文件里
面实现,不同的分配算法会导致不同的效率与结果,后面在内存管理中我们会讲解每个文件
的区别,由于现在是初学,所以我们选用 heap4.c 即可。
在这里插入图片描述
FreeRTOS 为我们提供了 cortex-m0、m3、m4 和 m7 等内核的单片机的接口文件,
只要是使用了这些内核的 MCU 都可以使用里面的接口文件。我们这里以 ARM_CM3 这个
文件夹为例,看看里面的文件,里面只有“port.c”与“portmacro.h”两个文件, port.c 文件里
面的内容是由 FreeRTOS 官方的技术人员为 Cortex-M3 内核的处理器写的接口文件,里面
核心的上下文切换代码是由汇编语言编写而成;portmacro.h 则是 port.c 文件对应的头文
件,主要是一些数据类型和宏定义。
在这里插入图片描述
首先在我们的 STM32 裸机工程模板根目录下新建一个文件夹,命名为“FreeRTOS”,
并且在 FreeRTOS 文件夹下新建两个空文件夹,分别命名为“src”与“port”,src 文件夹用于
保存 FreeRTOS 中的核心源文件,也就是我们常说的‘.c 文件’, port 文件夹用于保存内存
管理以及处理器架构相关代码,这些代码 FreeRTOS 官方已经提供给我们的,直接使用即可,
在前面已经说了, FreeRTOS 是软件,我们的开发版是硬件,软硬件必须有桥梁来连接,这
些 与 处 理 器 架 构 相 关 的 代 码 , 可 以 称 之 为 RTOS 硬 件 接 口 层 , 它 们 位 于
FreeRTOS/Source/Portable 文件夹下。
在这里插入图片描述
打开 FreeRTOS 源码,在“FreeRTOSvX.X.X\FreeRTOS\Source”目录下找到所有的‘.c 文
件’,将它们拷贝到我们新建的 src 文件夹中。
在这里插入图片描述
打开 FreeRTOS VX.X.X 源码,在“FreeRTOS VX.X.X \FreeRTOS\Source\portable”目录
下找到“ MemMang”文件夹与“ RVDS”文件夹,将它们拷贝到我们新建的 port 文件夹中。
在这里插入图片描述
打开 FreeRTOS VX.X.X 源码,在“FreeRTOS VX.X.X \FreeRTOS\Source” 目录下找到
“include”文件夹,它是我们需要用到 FreeRTOS 的一些头文件,将它直接拷贝到我们新建的
FreeRTOS 文件夹中,完成这一步之后就可以看到我们新建的 FreeRTOS 文件夹已经有 3
个文件夹,这 3 个文件夹就包含 FreeRTOS 的核心文件,至此,FreeRTOS 的源码就提取
完成
在这里插入图片描述

3.FreeRtosConfig

拷贝 FreeRTOSConfig.h 文件到 user 文件夹
FreeRTOSConfig.h 文件是 FreeRTOS 的工程配置文件,因为 FreeRTOS 是可以裁剪的
实时操作内核,应用于不同的处理器平台,用户可以通过修改这个 FreeRTOS 内核的配置头
文件来裁剪 FreeRTOS 的功能,所以我们把它拷贝一份放在 user 这个文件夹下面
在这里插入图片描述
其中,FreeRTOSConfig.h 是直接从 demo 文件夹下面拷贝过来的,该头文件对裁剪整个FreeRTOS 所需的功能的宏均做了定义,有些宏定义被使能,有些宏定义被失能,一开始我们只需要配置最简单的功能即可。要想随心所欲的配置 FreeRTOS 的功能,必须对这些宏定义的功能有所掌握。
比较重要的宏文件:
#define configUSE_TIME_SLICING 1 //使能时间片调度(默认式使能的)
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 //硬件计算前导零指令,如果所使用的, MCU 没有这些硬件指令的话此宏应该设置为 0
#define configUSE_TICKLESS_IDLE 0 //置 1:使能低功耗 tickless 模式;置 0:保持系统节拍(tick)中断一直运行
#define configUSE_QUEUE_SETS 1 //启用队列
#define configUSE_TASK_NOTIFICATIONS 1 //开启任务通知功能,默认开启
#define configUSE_MUTEXES 1 //使用互斥信号量
#define configUSE_RECURSIVE_MUTEXES 1 //使用递归互斥信号量
#define configUSE_COUNTING_SEMAPHORES 1 //为 1 时使用计数信号量
#define configQUEUE_REGISTRY_SIZE 10 //设置可以注册的信号量和消息队列个数
#define configUSE_APPLICATION_TASK_TAG 0
#define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持动态内存申请
#define configUSE_MALLOC_FAILED_HOOK 0 //使用内存申请失败钩子函数
#define configCHECK_FOR_STACK_OVERFLOW 1// 大于 0 时启用堆栈溢出检测功能,如果使用此功能用户必须提供一个栈溢出钩子函数如果使用的话此值可以为 1 或者 2,因为有两种栈溢出检测方法
#define configGENERATE_RUN_TIME_STATS 0 //启用运行时间统计功能
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define configUSE_TIMERS 1 //启用软件定时器
#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1) //软件定时器优先级
#define configTIMER_QUEUE_LENGTH 10 //软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2) //软件定时器任务堆栈大小
//可选函数配置选项
#define INCLUDE_xTaskGetSchedulerState 1
#define INCLUDE_eTaskGetState 1
#define INCLUDE_xTimerPendFunctionCall 1
//中断服务函数 也可以修改起始文件
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

4.添加到工程中

添加 FreeRTOS 源码到工程组文件夹
在这里插入图片描述
配置 FreeRTOS 头文件路径
在这里插入图片描述

三、任务块操作

1.任务四种状态

在这里插入图片描述
四种形态:
运行态
当任务实际执行时,它被称为处于运行状态。 任务当前正在使用处理器。 如果运行 RTOS 的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。
就绪态
准备就绪任务指那些能够执行(它们不处于阻塞或挂起状态), 但目前没有执行的任务, 因为同等或更高优先级的不同任务已经处于运行状态。
阻塞态
如果任务当前正在等待时间或外部事件,则该任务被认为处于阻塞状态。 例如,如果一个任务调用vTaskDelay(),它将被阻塞(被置于阻塞状态), 直到延迟结束-一个时间事件。 任务也可以通过阻塞来等待队列、信号量、事件组、通知或信号量 事件。 处于阻塞状态的任务通常有一个"超时"期, 超时后任务将被超时,并被解除阻塞, 即使该任务所等待的事件没有发生。
“阻塞”状态下的任务不使用任何处理时间,不能 被选择进入运行状态。
挂起态
与“阻塞”状态下的任务一样, “挂起”状态下的任务不能 被选择进入运行状态,但处于挂起状态的任务 没有超时。 相反,任务只有在分别通过 vTaskSuspend() 和 xTaskResume() API 调用明确命令时 才会进入或退出挂起状态。
调度机制
和裸机操作不同,操作系统中执行的是一个一个任务块,通过任务调度器(使用相关的调度算法)来决定当前时刻要执行哪个任务。
调度方式主要有两种:
1.抢占式调度:任务优先级不同时使用。每个任务都有自己的优先级,高优先级的任务会抢占低优先级的任务。
2.时间片调度:任务优先级相同时使用。当多个任务优先级相同时,任务调度器会在每一次系统节拍到的时候切换任务。
其实说白了就是:STM32执行的是线性代码,只有中断能打断。而FreeRtos执行的是不同等级的任务块,等级越高任务块就越先执行,相同等级的任务块执行时系统会来回切换。
优先级不能设置为0,因为FreeRtos的空闲任务优先级为0,一般情况下我们不去抢。

2.创建任务过程

1、首先要添加FreeRTOS相关头文件。这是必须的!
在这里插入图片描述
2、创建一个句柄,TaskHandle_t 类型
在这里插入图片描述在这里插入图片描述
3、创建任务

Ret = xTaskCreate(LED_Task, //创建任务的任务函数名"LED1_Toggle",//任务名字50,//任务栈深度。32位单片机*4NULL,//创建任务时传递参数,没有就给NULL1,//任务优先级&LED_TaskHandle);//任务的句柄,用于后边删除,挂起任务if(Ret == pdPASS){printf("LED_Task创建完成\r\n");}Ret = xTaskCreate(KEY_Task, //创建任务的任务函数名"KEY_Task",//任务名字100,//任务栈深度。32位单片机*4NULL,//创建任务时传递参数,没有就给NULL2,//任务优先级&KEY_TaskHandle);//任务的句柄,用于后边删除,挂起任务if(Ret == pdPASS){printf("KEY_Task创建完成\r\n");}printf("开启FreeRTOS调度器\r\n");//调度器启动完成之后,FreeRTOS会获取CPU控制权,会按照任务优先级执行创建的任务vTaskStartScheduler();printf("开启FreeRTOS调度器成功\r\n");

创建完成后一定要打开调度器。
4、写与句柄对应的任务函数,通常要加while(1)每个任务都是1个无限循环程序,内容根据需求来定。
在这里插入图片描述在这里插入图片描述
接下来重点了解一下创建函数:

在这里插入图片描述
在这里插入图片描述
简单来说:
参数1:实现任务的函数名
参数2:自己起一个任务名
参数3:分配空间,栈深度(32位单片机*4)
参数4:任务函数传参时使用
参数5:任务优先级(越高优先级越高)
参数6:该任务的句柄

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

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

相关文章

Elasticsearch集群工作原理

简介 ELasticsearch作为一个分布式搜索引擎,能够出色地支持集群模式、动态水平扩容、故障转移等分布式系统特性,这是其作为全文搜索引擎首选的重要原因。 本文从零开始描述集群的配置和扩容过程,让你对Elasticsearch集群的工作原理有初步的…

mmdetection学习——模型对比实验

1. 安装配置mmdetection环境,直接看官网 开始你的第一步 — MMDetection 3.0.0 文档 最好用conda新建环境管理,防止包冲突 git clone mmdetection源码到本地 2. 开始实验 2.1 准备数据集 需要使用COCO数据集格式 2.2 配置训练文件 在configs文件夹…

【PyTorch][chapter 27][李宏毅深度学习][transformer-1]

前言: transformer 是深度学习四大基础架构之一,最早Google 发表在NIPS(NeurIPS 全称神经信息处理系统大会), 是一种seq2seq 的模型.采用的Encoder-Decoder 结构,应用比较广泛。 比如文本生成,语音转换,视频生成. 相对RNN, LSTM …

基于PLC的粮食自动烘干机控制系统设计

基于PLC的粮食自动烘干机控制系统设计是一个综合性的工程任务,旨在通过PLC(可编程逻辑控制器)实现对粮食烘干过程的自动化控制,以提高烘干效率、保证烘干质量并降低能耗。以下是一个基于PLC的粮食自动烘干机控制系统设计的基本框架和关键要点: 前言 在我国,作为农业大国…

深度学习(八)-图像色彩操作

图像色彩调整 亮度调整 对HSV空间的V分量进行处理可以实现对图像亮度的增强。 直接将彩色图像灰度化,也可以得到代表图像亮度的灰度图进行图像处理,计算量比HSV颜色空间变化低。但在HSV空间中进行处理可以得到增强后的彩色图像。 opencv读取图片是BGR…

mac的使用

mac使用python的问题 对于python的虚拟环境,其实是基于已经安装到本地的python来安装不同的包。(之前我的mac上只安装了python3.9.6 ,安装的位置为/usr/bin/python3)然后我在vscode里怎么找都找不到如何弄一个python3.7.6 的版本…

论文阅读笔记:RepViT: Revisiting Mobile CNN From Vit Perspective

文章目录 RepViT: Revisiting Mobile CNN From Vit Perspective动机现状问题 贡献实现Block设置独立的token融合器和通道融合器减少膨胀并增加宽度 宏观设计stem的早期卷积简单分类器整体阶段比率 微观设计内核大小选择Squeeze-and-excitation层放置网络架构 实验ImageNet-1K上…

Codeforces Round 970 (Div. 3)

#include <iostream> #include <cmath> using namespace std;// 函数 is 用于判断给定的字符串 s 是否表示一个满足条件的正方形数。 bool is(const string &s, int n) {// 首先计算 n 的平方根 k。int k sqrt(n); // 如果 k 的平方不等于 n&#xff0c;那么 …

Java | Leetcode Java题解之第390题消除游戏

题目&#xff1a; 题解&#xff1a; class Solution {public int lastRemaining(int n) {int a1 1;int k 0, cnt n, step 1;while (cnt > 1) {if (k % 2 0) { // 正向a1 a1 step;} else { // 反向a1 (cnt % 2 0) ? a1 : a1 step;}k;cnt cnt >> 1;step s…

3012家!第六批专精特新“小巨人”企业名单和第三批复核通过企业名单公示

工业和信息化部开展了第六批专精特新“小巨人”企业培育和第三批专精特新“小巨人”企业复核工作&#xff0c;已完成相关审核。今日&#xff0c;各地陆续公示了第六批专精特新“小巨人”企业和第三批专精特新“小巨人”复核通过企业名单。 第六批专精特新“小巨人”企业和第三…

TikTok店群模式:从盈利到管理的全方位指南

北京时间9月2日&#xff0c;TikTok举办了“Grow With TikTok”研讨会。此次盛会不仅深入探讨了品牌如何利用TikTok平台实现快速成长与业务拓展&#xff0c;还针对TikTok店群运营模式中遇到的实际问题&#xff0c;提供了宝贵的指导意见。基于会议的精髓&#xff0c;本文将探讨如…

Oceanbase 透明加密TDE

官方文档&#xff1a;数据库透明加密概述-V4.3.2-OceanBase 数据库文档-分布式数据库使用文档 OceanBase 数据库社区版暂不支持数据透明加密。 数据存储加密是指对数据和 Clog 等保存在磁盘中的数据进行无感知的加密&#xff0c;即透明加密&#xff08;简称 TDE&#xff09;。…

5G ARMxy边缘计算网关依靠 SPI加密芯片保障工业数据传输

数字化进程迅猛推进的时代&#xff0c;数据的采集、处理以及传输所占据的地位愈发关键。ARM 边缘计算机以其超乎寻常的强大性能和丰富多彩的功能特性&#xff0c;为形形色色的应用场景奉献出了高效且值得信赖的解决方案。 ARM 边缘计算机对于多种操作系统均予以支持&#xff0…

TCP协议 配合 Wireshark 分析数据

在TCP连接中&#xff0c;无论是客户端还是服务端&#xff0c;都有可能成为发送端或接收端&#xff0c;这是因为TCP是一个全双工协议&#xff0c;允许数据在同一连接中双向流动 客户端&#xff08;Client&#xff09;&#xff1a;通常是指主动发起连接请求的一方。例如&#xf…

Python脚本实现向飞书发送卡片消息

目录 1 先创建一个卡片消息2 Python脚本2.1 告警测试2.2 告警恢复 总结 1 先创建一个卡片消息 飞书卡片搭建工具 根据自己的需要创建一个消息卡片&#xff1a; 可以在 卡片源代码 中看到这个卡片的代码信息 2 Python脚本 2.1 告警测试 test.py 文件 ""&quo…

Table表格td之间有空隙?你少设了border-collapse

设置之前 设置之后 table {border:solid 1px #cccccc;border-collapse: collapse;border-spacing: 0; }

2024最新PyCharm下载安装激活汉化教程!(附激活码)

激活码&#xff08;文末附带精品籽料&#xff09;&#xff1a; K384HW36OB-eyJsaWNlbnNlSWQiOiJLMzg0SFczNk9CIiwibGljZW5zZWVOYW1lIjoibWFvIHplZG9uZyIsImxpY2Vuc2VlVHlwZSI6IlBFUlNPTkFMIiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6I…

TripoSR模型构建指南

一、介绍 TripoSR 是由 Tripo AI 和 Stability AI 合作开发的最先进的开源模型&#xff0c;用于从单个图像进行快速前馈 3D 重建。利用大型重建模型&#xff08;LRM&#xff09;的原理&#xff0c;TripoSR 带来了关键的进步&#xff0c;大大提高了 3D 重建的速度和质量。该模型…

【ISSCC】论文详解-34.6 28nm 72.12TFLOPS/W混合存内计算架构

本文介绍ISSCC34.6文章&#xff0c;题目是《A 28nm 72.12TFLOPS/W Hybrid-Domain Outer-Product Based Floating-Point SRAM Computing-in-Memory Macro with Logarithm Bit-Width Residual ADC》&#xff08;一种28nm 72.12TFLOPS/W混合域外积浮点SRAM存内计算宏单元&#xff…

AI Dify + 大模型+ Agent 详细教程 从0-1教你构建小助手

前言 Dify 是一个易于使用的 LLMOps 平台&#xff0c;提供了多种应用程序类型和模板&#xff0c;包括 AI 聊天机器人、代码转换器、SQL 生成器、新闻内容编写、创意脚本等。团队使用 Dify&#xff0c;可以基于 GPT-4 等模型快速「开发部署」 AI 应用程序并进行可视化操作&…