【STM32项目】在FreeRtos背景下的实战项目的实现过程(一)

在这里插入图片描述
个人主页~

这篇文章是我亲身经历的,在做完一个项目之后总结的经验,虽然我没有将整个项目给放出来,因为这项目确实也是花了米让导师指导的,但是这个过程对于STM32的实战项目开发都是非常好用的,可以说按照这个过程,在你熟悉各种外设的前提下,你可以不用受别人指导地进行一个项目,甚至完成自己的一个作品


实战项目的实现过程

  • 一、FreeRtos
    • 1、简介
    • 2、功能
      • (1)裸机开发
      • (2)基于Rtos的开发
    • 3、格式
      • (1)定义任务
      • (2)定义空闲任务
      • (3)main函数
      • (4)开始任务函数

一、FreeRtos

1、简介

Rtos就是实时操作系统,os的意思就像是我们常用的iOS、HamonyOS是一个意思,就是操作系统的意思,而FreeRtos就是免费的实时操作系统,在嵌入式系统中非常常用

它的底层代码是用C语言写成的,可移植性特别好,且简单易用,核心代码有9000多行

2、功能

(1)裸机开发

像STM32在开始学习的时候,我们的程序是一个main函数,里面的代码一行接着一行执行,非常单一,只要写好程序,程序就会按照既定的顺序执行,不会出现某一段代码先于前面几行的代码的情况,也就是实时性差,这叫做裸机开发也就是不带操作系统的开发,它常用于不需要高实时性的场景的产品开发

在delay函数下的等待只能等待,没有占用CPU的情况,浪费资源

(2)基于Rtos的开发

Rtos有很多种,除了FreeRtos以外,我们可以在浏览器上搜索其他的Rtos,但在所有嵌入式系统中,FreeRtos是应用最多的

添加了Rtos的嵌入式系统实时性会提高,我们可以将某些程序分为多个任务,给予它们优先级,优先级高的优先获得CPU使用权,也就是一个优先级低的任务执行过程中,优先级高的任务一旦出现需要执行的情况,优先级低的任务立刻发生中断,先让优先级高的任务完成,然后再回到原来的位置继续执行,而且这个过程是可以嵌套的,在优先级1的任务过程中,优先级2的任务可以中断优先级1的任务,然后优先级3的任务又可以中断优先级2的任务

多个任务可以同一优先级,创建的实时任务数量没有软件限制,也就是说,在理想条件下,创建的实时任务可以有无数个

在不断中断的过程中,嵌入式系统捕捉外界变化的能力变得十分灵敏,实时性有所提高

在delay函数下按照优先级的顺序使用CPU,确保CPU能在每个时间段都有事情可做,节省资源

3、格式

FreeRtos的配置过程可以直接看正点原子的视频教程,这里其实只要懂得基本原理即可,直接找一个现成的文件用就可以,实在想要自己做就跟着视频教程一步一步来搭建一个Rtos系统
在这里插入图片描述
我们这里就不讲怎么配置了,文本解释不清还占用篇幅

(1)定义任务

//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小
#define START_STK_SIZE 		128  
//任务堆栈
StackType_t StartTaskStack[START_STK_SIZE];
//任务控制块
StaticTask_t StartTaskTCB;
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define TASK1_TASK_PRIO		2
//任务堆栈大小
#define TASK1_STK_SIZE 		128  
//任务堆栈
StackType_t Task1TaskStack[TASK1_STK_SIZE];
//任务控制块
StaticTask_t Task1TaskTCB;
//任务句柄
TaskHandle_t Task1Task_Handler;
//任务函数
void task1_task(void *pvParameters);//任务优先级
#define TASK2_TASK_PRIO		3
//任务堆栈大小
#define TASK2_STK_SIZE 		128  
//任务堆栈
StackType_t Task2TaskStack[TASK2_STK_SIZE];
//任务控制块
StaticTask_t Task2TaskTCB;
//任务句柄
TaskHandle_t Task2Task_Handler;
//任务函数
void task2_task(void *pvParameters);

开始任务start_task是必须要有的,然后按照一样的格式将任务1234等创建好,确定堆栈以及堆栈大小,控制块、句柄以及任务函数的声明

(2)定义空闲任务

//空闲任务堆栈
static StackType_t Idle_Task_Stack[configMINIMAL_STACK_SIZE];
//定时器任务堆栈
static StackType_t Timer_Task_Stack[configTIMER_TASK_STACK_DEPTH];//空闲任务控制块
static StaticTask_t Idle_Task_TCB;	
//定时器任务控制块
static StaticTask_t Timer_Task_TCB;//获取空闲任务的任务堆栈和任务控制块内存,因为本例程使用的是静态内存
//因此空闲任务的任务堆栈由用户来提供,接口函数就是下面这个函数//ppxIdleTaskTCBBuffer:任务控制块内存
//ppxIdleTaskStackBuffer:任务堆栈内存
//pulIdleTaskStackSize:任务堆栈大小
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize)
{*ppxIdleTaskTCBBuffer=&Idle_Task_TCB;*ppxIdleTaskStackBuffer=Idle_Task_Stack;*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
}//获取定时器任务的任务堆栈和任务控制块内存
//ppxTimerTaskTCBBuffer:任务控制块内存
//ppxTimerTaskStackBuffer:任务堆栈内存
//pulTimerTaskStackSize:任务堆栈大小void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t**ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize)
{*ppxTimerTaskTCBBuffer=&Timer_Task_TCB;*ppxTimerTaskStackBuffer=Timer_Task_Stack;*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;
}

在这里插入图片描述

(3)main函数

int main()
{//在前面这里放所使用模块的初始化,将所有用到的外设驱动起来//下面就是开始任务函数的定义StartTask_Handler=xTaskCreateStatic((TaskFunction_t	)start_task,//任务函数		(const char* 	)"start_task",//任务名称		(uint32_t 		)START_STK_SIZE,	//任务堆栈大小(void* 		  	)NULL,		//传递给任务函数的参数		(UBaseType_t 	)START_TASK_PRIO, //任务优先级	(StackType_t*   )StartTaskStack,	//任务堆栈(StaticTask_t*  )&StartTaskTCB);	         //任务控制块vTaskStartScheduler();//开启任务调度
}

在这里插入图片描述

(4)开始任务函数

在FreeRtos进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断
一般我们都会使用这个临界区,进入和退出是配套使用的,我们在使用的时候要尽量保持临时段耗时短

//开始任务函数
void start_task(void *pvParameters)
{taskENTER_CRITICAL();         //进入临界区//创建task1任务Task1Task_Handler=xTaskCreateStatic((TaskFunction_t	)task1_task,		(const char* 	)"task1_task",		(uint32_t 		)TASK1_STK_SIZE,	(void* 		  	)NULL,				(UBaseType_t 	)TASK1_TASK_PRIO, 	(StackType_t*   )Task1TaskStack,	(StaticTask_t*  )&Task1TaskTCB);	//创建task2任务Task2Task_Handler=xTaskCreateStatic((TaskFunction_t	)task2_task,		(const char* 	)"task2_task",		(uint32_t 		)TASK2_STK_SIZE,	(void* 		  	)NULL,				(UBaseType_t 	)TASK2_TASK_PRIO, 	(StackType_t*   )Task2TaskStack,	(StaticTask_t*  )&Task2TaskTCB);vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL();            //退出临界区
}

在这里插入图片描述
这里只是简单地使用FreeRtos,掌握Rtos下的多任务多优先级的实现方式,掌握FreeRtos的基本用法,打造一个实时性系统


今日分享就到这里~

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++ - 特殊类设计

文章目录 一、设计一个不允许拷贝的类二、设计一个只能在堆上实例对象的类三、设计一个只能在栈上创建对象的类四、设计一个不能被继承的类五、设计一个只能创建一个对象的类(单例模式) 一、设计一个不允许拷贝的类 1、方法一:将拷贝构造和赋…

多云网络部署存在挑战,F5分布式云应用简化方案解读

伴随着人工智能与云计算领域的深度融合与集中爆发,企业在多云环境中面临着挑战,包括复杂性、成本和风险的增加等……对于高度敏捷企业中的开发团队而言,传统网络的沉重运维成本和低效率将会成为发展的障碍。作为一家提供多云应用安全和应用交…

TcpSocket在切后台后如何保活

1)TcpSocket在切后台后如何保活 2)Magica Clothes 2插件与Burst编译问题 3)粒子拖尾合批失败怎么办 4)如何让射线追踪跟随我FPS游戏的十字准星进行移动 这是第398篇UWA技术知识分享的推送,精选了UWA社区的热门话题&…

flink文档刨析

flink任务运行方式 flink任务提交方式有3种 session、per-job、application三种 flink任务运行底座也有三种,Standalone、yarn、k8s 原则上一个flink任务运行的方式由3*39种,但是有些是没法搭配的 yarn:包括yarn-session 、yarn-per-job 、…

uni-app 吸顶方案总结

效果 页面级 uni.pageScrollTo 官方文档&#xff1a;https://uniapp.dcloud.net.cn/api/ui/scroll.html#pagescrollto 原生头部导航 uni.pageScrollTo({selector: #tabs,duration: 300 });(推荐)需要兼容自定义头部导航 <template><view id"demo1" :styl…

Vue框架学习笔记-6

Vue中的路由 Vue中的路由&#xff08;Routing&#xff09;是通过Vue Router这个官方提供的路由管理器来实现的。Vue Router允许你通过不同的URL访问应用中不同的页面&#xff08;组件&#xff09;&#xff0c;而无需重新加载页面。这对于构建单页应用&#xff08;SPA, Single …

【Hadoop】建立圈内组件的宏观认识

01存储02计算03调度04其他05回忆 众多组件们构建了大规模分布式计算和存储平台。本文介绍Hadoop生态圈中各个组件的主要功能和作用&#xff0c;辅助学者理解每个组件的定位和用途&#xff0c;从而建立对圈内组件的宏观认识。梳理清楚HDFS、MapReduce、YARN、Hive、HBase、Spark…

推出 SAM 2:适用于视频和图像的下一代 Meta Segment Anything 模型

继图像元分割模型(SAM) 取得成功之后&#xff0c;我们发布了SAM 2&#xff0c;这是一个用于在图像和视频中实时提示对象分割的统一模型&#xff0c;可实现最先进的性能。 为了秉承我们的开放科学方针&#xff0c;我们通过宽松的 Apache 2.0 许可证共享代码和模型权重。 我们还…

传奇游戏为何采用多渠道发布如何有效利用论坛资源?

揭秘传奇游戏多渠道发布策略&#xff0c;探讨手机游戏发布论坛如何助力品牌形象塑造 游戏发布平台|手机游戏发布平台|公益服游戏发布站 问题&#xff1a;传奇游戏为何采用多渠道发布策略&#xff1f;这些渠道各自有何优劣势&#xff1f; 回答&#xff1a;传奇游戏采用多渠道发…

Github 2024-08-14 C开源项目日报Top10

根据Github Trendings的统计,今日(2024-08-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10Objective-C项目1PHP项目1Python项目1PHP:流行的Web开发脚本语言 创建周期:4710 天开发语言:C, PHP协议类型:OtherStar数量:37340 …

JAVA中new Object对象占用多少字节,Java对象的组成是哪些?Java对象头的组成又是哪些,MarkWord是什么,有什么作用?

Java对象头的组成_java对象头结构-CSDN博客 JAVA中new Object对象占用多少字节&#xff0c;Java对象的组成是哪些&#xff1f;Java对象头的组成又是哪些&#xff0c;MarkWord是什么&#xff0c;有什么作用&#xff1f; 一、JAVA对象的结构组成 JAVA Object对象的结构组成&…

FreeRTOS的任务创建和删除

1、任务创建和删除的API函数 任务的创建和删除本质就是调用FreeRTOS的API函数。 和任务创建和删除有关的函数主要有三&#xff1a; xTaskCreate():动态方式创建任务。 xTaskCreateStatic():静态方式创建任务。 vTaskDelete():删除任务。 那又有思考了 2、动态方式创建任…

实验五之用Processing绘画

1.案例代码如下&#xff1a; import generativedesign.*; import processing.pdf.*; import java.util.Calendar; Tablet tablet; boolean recordPDF false; float x 0, y 0; float stepSize 5.0; PFont font; String letters "Sie hren nicht die folgenden Gesnge…

超级字符串技能:提升你的编码游戏

嘿嘿,uu们,今天咱们来详解字符函数与字符串函数,好啦,废话不多讲,开干&#xff01; 1.:字符分类函数 C语言中又一系列的函数是专门做字符分类的,也就是一个字符属于什么类型的字符的,这些函数的使用需要包含头文件ctype.h 这些函数的使用方法都十分类似,博主在这里就举两到三个…

【C语言篇】C语言常考及易错题整理DAY3

文章目录 选择题整形提升与算术转换左移右移操作符操作符优先级与结合性后置指针变量基本知识 编程题最大连续1的个数完全数计算单词倒排面试题.珠玑妙算两数之和 选择题 整形提升与算术转换 声明以下变量&#xff0c;则表达式: ch/i (f*d – i) 的结果类型为&#xff08; &…

<Qt> 系统 - 网络编程 | 音视频

目录 前言&#xff1a; 一、QUdpSocket &#xff08;一&#xff09;核心 API 概览 &#xff08;二&#xff09;设计一个UDP回显服务器 二、QTCPSocket &#xff08;一&#xff09;核心 API 概览 &#xff08;二&#xff09;设计一个TCP回显服务器 三、HTTP Client 四、…

msgqueue.hpp队列模块

目录 一.MsgQueue模块介绍 二.MsgQueue类的实现 成员变量 构造函数与析构函数 成员函数 参数设置函数 setArgs 参数获取函数 getArgs 三.MsgQueueMapper类的实现 成员变量 构造函数 成员函数 创建表格函数 createTable 删除表格函数 dropTable 插入数据函数 inse…

GPT-4o:开启多模态AI识别新纪元

GPT-4o功能简介 在人工智能的演变历程中&#xff0c;图像识别技术始终占据着核心地位。技术的发展日新月异&#xff0c;使得AI不仅能够识别图像内容&#xff0c;还能将其转化为文字描述。特别值得一提的是&#xff0c;OpenAI在春季发布的GPT-4o模型&#xff0c;将图像识别技术…

微软Detours Hook库编译与使用

Detours 是微软开发的一个强大的Windows API钩子库&#xff0c;用于监视和拦截函数调用。它广泛应用于微软产品团队和众多独立软件开发中&#xff0c;旨在无需修改原始代码的情况下实现函数拦截和修改。Detours 在调试、监控、日志记录和性能分析等方面表现出色&#xff0c;已成…

shell命令行解释器—既陌生有熟悉的东西

今天做一个感性的认识来&#xff0c;用一个生活的例子。 你生活在有一条村子里面&#xff0c;在村的东边就是王婆&#xff0c;王婆呢&#xff1f;她主要做什么呢啊&#xff1f;她在村儿里面呢&#xff0c;也不种地啊&#xff0c;那她干什么呢&#xff1f;他主要做帮别人进行婚嫁…