项目实战-外卖自提柜 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

相关文章

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现