stm32 打造自己环形队列

2023-05-16

stm32 esp8266 ota系列文章:
stm32 esp8266 ota-快速搭建web服务器之docker安装openresty
stm32 esp8266 ota升级-tcp模拟http
stm32 esp8266 ota升级-hex合并-烧录-bin生成
stm32 esp8266 ota升级-qt bin文件处理工具
stm32 esp8266 ota升级-自建mqtt和文件服务器动态AB面方式
stm32 esp8266 ota升级-自建mqtt和文件服务器全量升级

stm32 打造自己环形队列

本环形队列实现以数组形式批量写入和读取队列中数据。

写入数据时,对于队列剩余空间不足时,可以选择强制覆盖写入(会有覆盖部分原队列数据,请根据自己实现需要操作);不覆盖,则不会写入;

读取数据时,如果超过队列中已存数据长度,则读取实际大小;没有超过,则正常读取。

本环形队列可用作串口数据缓存接收,尤为适用于有具体协议格式数据,方便查找TAG标识进行定位。但对于串口采用DMA方式,接收大量无协议格式的数据,暂不适用。

以上理解,如有误,请指正。

环境介绍

硬件

  1. stm32F103C8t6系列板子;

软件

app 程序

环形队列测试程序

环形队列原理

请参考数据结构–环形队列的介绍与实现 博文,感谢博主分享;

环形队列具体实现

枚举和结构体定义

image-20230112093430016

队列初始化

image-20230112093522891

队列判断空和满

image-20230112093659033

以数组形式写入队列

对于写入数组数据大小大于队列剩余空间时,

1)如果forceWrite=true,则有数据覆盖,返回RINGQUEUE_FORCE_OVERWRITE_SUCCESS,此时队列大小为queueSize;

2)如果forceWrite=false,则不做处理,直接返回RINGQUEUE_OVERWRITE_DATA_FAIL;

image-20230112093835566

从队列以数组形式读取

image-20230112094100549

测试

测试所用数据

char data[64] = "12345678abcdef";   //14个字符

初始化队列,队列大小为16

//初始化队列
ringQueue_init(&testRQ, rq_buf, 16);

正常读写测试

image-20230112101901398

测试日志

1 正常读写测试

待写入数据为:12345678abcdef

+++++++++++++以数组形式写入队列+++++++++++++
写入后头位置、尾位置和队列中已存数据大小 front:0,rear:14,dataLength:14
RINGQUEUE_STATUS_e val:1  //对比枚举定义,RINGQUEUE_WRITE_SUCCESS=1

+++++++++从队列以数组形式读取++++++++++
读取后头位置、尾位置和队列中已存数据大小 front:14,rear:14,dataLength:0
data:12345678abcdef,length:14

----------------------------------------

异常读写

超队列大小写测试

对于写入数据超过队列大小了,无论强制写与否,都返回RINGQUEUE_SIZE_EXCEEDED_FAIL,不能写入。对于这种情况,请增大队列缓存区大小。

image-20230112175525633

日志:

2 异常读写测试 

刚开始初始头位置、尾位置和队列中已存数据大小 front:0,rear:0,dataLength:0 

2.1.1 写入20字节超过队列大小,不强制,返回RINGQUEUE_SIZE_EXCEEDED_FAIL 5

RINGQUEUE_STATUS_e val:5
forceWrite==false 写入后头位置、尾位置和队列中已存数据大小 front:0,rear:0,dataLength:0 

2.1.2 写入20字节超过队列大小,强制,返回RINGQUEUE_SIZE_EXCEEDED_FAIL

RINGQUEUE_STATUS_e val:5
forceWrite==true 写入后头位置、尾位置和队列中已存数据大小 front:0,rear:0,dataLength:0 

多次写入数据,达到覆盖数据测试

队列剩余空间可以容纳待写入数据时,正常写入;当写入数据大于可容纳数据时,强制写会出现数据覆盖;不强制,则不能写入,返回失败。

image-20230112180333122

日志:

2.2 多次写入数据,达到覆盖数据测试,forceWrite==false时,不覆盖;true时覆盖 

2.2.1 写入10字节未超过队列大小,强制,返回RINGQUEUE_WRITE_SUCCESS,队列数据10字节

RINGQUEUE_STATUS_e val:1

forceWrite==true 写入后头位置、尾位置和队列中已存数据大小 front:0,rear:10,dataLength:10 

2.2.2 写入14字节超过队列剩余可写空间大小6字节,强制,返回RINGQUEUE_FORCE_OVERWRITE_SUCCESS,队满会覆盖掉原Front位置后的8个字节\r

RINGQUEUE_STATUS_e val:7

forceWrite==false 写入后头位置、尾位置和队列中已存数据大小 front:8,rear:8,dataLength:16 

多次读数据,读取长度大于队列或队列中已有数据大小

读取数据长度小于队列已存数据长度时,正常读取;

读取长度大于队列或队列中已有数据大小时,读取出队列中已有数据;

image-20230112181241691

日志:

2.3 多次读数据,读取长度大于队列或队列中已有数据大小时,则读取实际的队列中已有数据大小\r

2.3.1 读取10字节

data:ab12345678,length:10

读取长度大于dataLength,头位置、尾位置和队列中已存数据大小 front:2,rear:8,dataLength:6 

2.3.2 读取10字节

data:abcdef,length:6

读取长度大于dataLength,头位置、尾位置和队列中已存数据大小 front:8,rear:8,dataLength:0 

队列为空时读取

队列为空时,读取数据为NULL,长度为0。程序也做了异常处理。

正确用法是,在读取时,应该做判空处理。不为空时,再读取。

image-20230112181553293

日志:

2.4 队列为空时读取\

队列为空时读取,头位置、尾位置和队列中已存数据大小 front:0,rear:0,dataLength:0 

data:,length:0

总结

通过对循环队列讲解,用户可根据自己的实际情况,修改代码,打造适用于自己项目的循环队列。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32 打造自己环形队列 的相关文章

  • 如何在 Cortex-M3 (STM32) 上从 RAM 执行函数?

    我正在尝试从 Cortex M3 处理器 STM32 上的 RAM 执行函数 该函数会擦除并重写内部闪存 所以我肯定需要在 RAM 中 但我该怎么做呢 我尝试过的是 使用 memcpy 将函数复制到 RAM 中的字节数组 检查它是否正确对齐
  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐