项目实战-外卖自提柜 2. CubeMX + FreeRTOS入门

2023-10-30 03:50

本文主要是介绍项目实战-外卖自提柜 2. CubeMX + FreeRTOS入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目实战-外卖自提柜 1.项目介绍、协议制定
项目实战-外卖自提柜 2. CubeMX + FreeRTOS入门
项目实战-外卖自提柜 3. FreeRTOS主要API的应用
项目实战-外卖自提柜 4. FreeRTOS 堆栈分配、调试技巧
项目实战-外卖自提柜 5. ESP8266 01S配置与掉线处理
项目实战-外卖自提柜 6. 硬件工作与测试(原理图、PCB绘制、测试视频)

简要

选择使用FreeRTOS,除了需求原因,还有这是第一个接触的RTOS,也想把它用到项目上。
这一阵子刚好从标准库脱坑,加入到HAL库的大家庭中,所以CubeMX+FreeRTOS成为理所当然的选择,也省了我很多时间。

HAL库

先说HAL库,这个在网上褒贬不一,我也算标准库、HAL库都用过,HAL库开发快,HAL库在开发周期上是比标准库短很多的。
有人批HAL库的理由是:运行效率低、BUG多
我拿这个项目用到的资源来说:
串口+DMA、硬件SPI+DMA、RTC、PWM
HAL库的串口函数我用起来确实有点不习惯,而且遇到了比较烦的问题:
https://blog.csdn.net/weixin_44578655/article/details/104677301
但除了这个,像RTC、PWM这些,都是一遍调通,省了很多时间。
至于运行效率,未见得有什么效率问题,有时候进入函数内部,看起来也没发现比标准库复杂什么。

综上,以后有相关的项目,我还是优先考虑HAL库。

FreeRTOS

再说说FreeRTOS,此前也每太了解过,我是看书过了一遍,下面这本
书籍pdf:
https://download.csdn.net/download/weixin_44578655/12207937
(积分不够的话在评论区留个言吧,私发)
这其实就是一个手册,很短,一天大概就能看完,看完我对RTOS有了相当的了解了。

就直观说说使用FreeRTOS的感想:
相当于把一个单片机拆成好几个用,裸奔只能写一个大循环,现在可以写好几个(一个任务就是一个大循环)。
每个任务间“并行”运行,加引号是因为这不是真正意义上的并行,而是每个任务都占用CPU一会儿,轮流执行,不太恰当的比喻就是,一个72M的单片机执行两个任务的话,就可以看程是两个36M的单片机在同时运行,当然FreeRTOS本身还需要占用一定的CPU资源。

我做这个项目的时候,觉得需要掌握以下几点就够了:

  1. FreeRTOS任务调度的工作方式、任务的各种状态等等。
    理解这个我觉得就算入门了。
    那时候还写了点东西:
    FreeRTOS学习笔记

  2. 任务间通讯、任务同步的几种常用方式:队列、信号量等等
    当然你可以使用全局变量,但全局变量会带来资源访问冲突的问题。
    例如:当任务A在对某全局数组在进行一个执行时间比较长的操作,比如在进行memcpy,刚复制了一半,突然任务A被任务B抢占,任务B对这个全局数组进行了修改。这时候跳回到任务A执行的时候,任务A就得到了错误的值,因为一半被改过,另一半没被改过。

    如果使用消息队列的话,A任务要使用队列S,先申请,申请成功以后才可以使用。B任务也要使用S的时候也要先申请,当时发现S已经被A任务使用了,所以B任务就没法使用,直到A任务使用完S并且释放掉B任务才申请使用。

    虽然全局变量不能随便用,我在进行任务间同步的时候(例如任务A通知任务B:饭做好了,该回家吃饭了),大部分还是使用全局变量(标志位,任务A置位,任务B扫描),因为这不会有资源访问冲突的风险,内存开销也比消息队列小。

  3. 任务管理的常用手段:如何合理地安排任务间地互斥
    互斥,直接举例子:
    考虑如下情形,有两个任务都试图往一个 LCD 中写数据:
    任务 A 运行,并往 LCD 写字符串”Hello world”。
    任务 A 被任务 B 抢占,但此时字符串才输出到”Hello w”。
    任务 B 往 LCD 写”Abort, Retry, Fail?”,然后进入阻塞态。
    任务 A 从被抢占处继续执行,完成剩余的字符输出——“orld”。
    现在 LCD 显示的是被破坏了的字符串”Hello wAbort, Retry, Fail?orld”。
    所以某任务在要紧的情况下,是不能被打断的,即便是更高优先级的任务,如何实现呢?互斥有很多方法:暂时调高优先级、互斥量、安全区等等。

掌握以上三点,就可以开动脑筋做项目了。

FreeRTOS在CubeMX中的配置

图上的CMSIS_V1和V2的API名称不太一样,我用的是V1
(我还没搜到过V2的例程)
在这里插入图片描述
CubeMX对FreeRTOS进行了一层包装:

CMSIS-RTOS是ARM公司为统一操作系统、降低嵌入式门槛而发布的操作系统标准软件接口。通俗讲,CMSIS-RTOS将操作系统(不管是FREE-RTOS还是RTX等)屏蔽起来,然后提供CMSIS-RTOS接口函数给最终使用者调用。如此以来,最终使用者只需要学习CMSIS-ROTS即可,从而降低学习门槛。(不过,目前只有FREE-RTOS和RTX能够支持CMSIS-RTOS)。

具体配置这里只列下面两点,其他配置可以参照别人的帖子:
在这里插入图片描述

这里的TOTAL_HEAP_SIZE,其大小需要根据实际情况确定,我这用了8k,所有跟FreeRTOS相关的,诸如任务创建、队列创建等等所需要的栈空间都从这里分配,这里空间不足会导致任务、队列等创建失败。
在这里插入图片描述
这些是FreeRTOS的一些可选择的API函数,这里有一些API我们调试的时候要用到,有的一般用不到,可以自己选择。

CMSIS OS的相关API

CubeMX对FreeRTOS封装后,名为CMSIS OS,这部分资料少一些,刚开始接触CMSIS OS的时候,找不到手册,API名称也不清楚在哪找,这里贴出来:
CubeMX FreeRTOS(cmsis os)函数API一览

项目实战-外卖自提柜 1.项目介绍、协议制定
项目实战-外卖自提柜 2. CubeMX + FreeRTOS入门
项目实战-外卖自提柜 3. FreeRTOS主要API的应用
项目实战-外卖自提柜 4. FreeRTOS 堆栈分配、调试技巧
项目实战-外卖自提柜 5. ESP8266 01S配置与掉线处理
项目实战-外卖自提柜 6. 硬件工作与测试(原理图、PCB绘制、测试视频)

https://blog.csdn.net/weixin_44578655/article/details/105952248

这篇关于项目实战-外卖自提柜 2. CubeMX + FreeRTOS入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时