项目实战-外卖自提柜 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绘制、测试视频)

猜你喜欢

转载自blog.csdn.net/weixin_44578655/article/details/105952248
今日推荐