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

相关文章

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加