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 打造自己环形队列 的相关文章

  • 在地址“0xXXXXXX”处中断,没有可用的调试信息,或在程序代码之外

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • GCC - 如何停止链接 malloc?

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

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公

随机推荐