环形队列中断会导致数据错误吗

主循环里面写环形队列,中断里面读取,如果主循环写数据的时候,发生了中断,写的过程被打断,那会出现数据错误吗,我的答案是不会,看看环形队列的结构

#define DEFINE_QUEUE_TYPE(NAME, TYPE, SIZE)                              \
    typedef struct {                                                     \
        TYPE data[SIZE];                                                 \
        int front;                                                       \
        int rear;                                                        \
        int size;                                                        \
        int max_size;                                                    \
    } NAME##_queue;                                                      \
                                                                         \
    void NAME##_queue_init(NAME##_queue *queue) {                        \
        queue->front = 0;                                                \
        queue->rear = -1;                                                \
        queue->size = 0;                                                 \
        queue->max_size = SIZE;                                          \
    }                                                                    \
                                                                         \
    bool NAME##_queue_is_empty(NAME##_queue *queue) {                    \
        return queue->size == 0;                                         \
    }                                                                    \
                                                                         \
    bool NAME##_queue_is_full(NAME##_queue *queue) {                     \
        return queue->size == queue->max_size;                           \
    }                                                                    \
                                                                         \
    bool NAME##_queue_push(NAME##_queue *queue, TYPE value) {            \
        if (NAME##_queue_is_full(queue)) {                               \
            return false;                                                \
        }                                                                \
        queue->rear = (queue->rear + 1) % queue->max_size;               \
        queue->data[queue->rear] = value;                                \
        queue->size++;                                                   \
        return true;                                                     \
    }                                                                    \
    bool NAME##_queue_pop(NAME##_queue *queue) {                         \
        if (NAME##_queue_is_empty(queue)) {                              \
            return false;                                                \
        }                                                                \
        queue->front = (queue->front + 1) % queue->max_size;             \
        queue->size--;                                                   \
        return true;                                                     \
    }                                                                    \
    bool NAME##_queue_front(NAME##_queue *queue, TYPE *value) {          \
        if (NAME##_queue_is_empty(queue)) {                              \
            return false;                                                \
        }                                                                \
        *value = queue->data[queue->front];                              \
        return true;                                                     \
    }

这是一个环形队列的模板,结构体里面包含数据缓存,读指针和写指针。

在主循环里面写的时候用push操作,push里面首先会检查队列是否满,如果满了,则不会进行写入操作。

while (1)
  {
    RUN_BY_LIMIT_BLOCK(2,
      for (int i = 0; i < PUSH_TIMES; i++){
          u16_queue_push(&test_queue, TEST_NUMBER1);
          u16_queue_push(&test_queue, TEST_NUMBER2);
      }
    )
  }

在中断里面读取的时候用front和pop操作,front里面会判断队列是否为空,不为空才会进行读取。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
  if (htim->Instance == TIM10) {
    RUN_BY_LIMIT_BLOCK(1000, 
      SEGGER_RTT_printf(0, "tim10 interrupt!\n")
    )
    uint16_t tmp;
    while (u16_queue_front(&test_queue, &tmp) == true) {
      u16_queue_pop(&test_queue);
      if (tmp != TEST_NUMBER1 && tmp != TEST_NUMBER2) {
        SEGGER_RTT_printf(0, "[%d]***************queue error! data: 0x%04X\n",HAL_GetTick(), tmp);
      }else {
        SEGGER_RTT_printf(0, "[%d]queue ok, data: 0x%04X!\n", HAL_GetTick(), tmp);
      }
    }
  }
}

如何在写的时候突然中断来了,写入还没完成怎么办,比如写入的是一个结构体或者u16的数据。如果这时候中断来了,主循环的现场会保存,中断里面判断空的时候,用的是size还是上一次的,因为size的变化要等到push完成后才会改变,所以读取不会发生错误,等中断结束再回到主循环,继续写入操作。

同样写入到 时候会判断是否为满,中断前不是满的,中断读取后仍然不是满的,所以写入也不会出错。

经过2天的实测,主循环2ms写入1024个数据,中断1ms读取一次,暂时还没有发现错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/713891.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EMQX集群搭建

1. 什么是 MQTT&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议&#xff0c;适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎&#xff0c;能够实现传感器、…

DETR实现目标检测(一)-训练自己的数据集

1、DETR架构 DETR&#xff08;Detection Transformer&#xff09;是一种新型的目标检测模型&#xff0c;由Facebook AI Research (FAIR) 在2020年提出。DETR的核心思想是将目标检测任务视为一个直接的集合预测问题&#xff0c;而不是传统的两步或多步预测问题。这种方法的创新…

FPGA IO_BANK、IO_STANDARD

描述 Xilinx 7系列FPGA和UltraScale体系结构提供了高性能&#xff08;HP&#xff09;和 高范围&#xff08;HR&#xff09;I/O组。I/O库是I/O块&#xff08;IOB&#xff09;的集合&#xff0c;具有可配置的 SelectIO驱动程序和接收器&#xff0c;支持多种标准接口 单端和差分。…

vxe-table表格新增节点

做前端的朋友可以参考下&#xff1a;也可结合实际需求查看相应的官方文档 效果图 附上完整代码 <template><div><vxe-toolbar ref"toolbarRef" :refresh"{queryMethod: searchMethod}" export print custom><template #buttons>&…

React写一个 Modal组件

吐槽一波 最近公司的项目终于度过了混乱的前期开发&#xff0c;现在开始有了喘息时间可以进行"规范"的处理了。 组件的处理&#xff0c;永远是前端的第一大任务&#xff0c;尤其是在我们的ui库并不怎么可靠的情况下&#xff0c;各个组件的封装都很重要&#xff0c;而…

minium小程序自动化

一、安装minium pip install minium二、新建config.json {"dev_tool_path": "D:\\Program Files (x86)\\Tencent\\微信web开发者工具\\cli.bat","project_path": "小程序项目路径" }三、编写脚本 import miniumclass FirstTest(min…

【Echarts系列】平滑折线面积图

【Echarts系列】平滑折线面积图 序示例数据格式代码 序 为了节省后续开发学习成本&#xff0c;这个系列将记录我工作所用到的一些echarts图表。 示例 平滑折线面积图如图所示&#xff1a; 数据格式 data [{name: 2020年,value: 150},{name: 2021年,value: 168},{name: 2…

设计模式-装饰器模式Decorator(结构型)

装饰器模式(Decorator) 装饰器模式是一种结构模式&#xff0c;通过装饰器模式可以在不改变原有类结构的情况下向一个新对象添加新功能&#xff0c;是现有类的包装。 图解 角色 抽象组件&#xff1a;定义组件的抽象方法具体组件&#xff1a;实现组件的抽象方法抽象装饰器&…

git的ssh安装,windows通过rsa生成密钥认证问题解决

1 windows下载 官网下载可能出现下载太慢的情况&#xff0c;Git官网下载地址为&#xff1a;官网&#xff0c;推荐官网下载&#xff0c;如无法下载&#xff0c;可移步至CSDN&#xff0c;csdn下载地址&#xff1a;https://download.csdn.net/download/m0_46309087/12428308 2 Gi…

【Linux】程序地址空间之动态库的加载

我们先进行一个整体轮廓的了解&#xff0c;随后在深入理解细节。 在动态库加载之前还要说一下程序的加载&#xff0c;因为理解了程序的加载对动态库会有更深的理解。 轮廓&#xff1a; 首先&#xff0c;不管是程序还是动态库刚开始都是在磁盘中的&#xff0c;想要执行对应的可…

PHP在线生成查询产品防伪证书系统源码

源码介绍 PHP在线生成查询产品防伪证书系统源码&#xff0c;源码自带90套授权证书模板&#xff0c;带PSD公章模板&#xff0c;证书PSD源文件。 环境要求&#xff1a;PHPMYSQL&#xff0c;PHP 版本请使用PHP5.1 ~5.3。 图片截图 源码安装说明 1.上传所有文件至你的空间服务器…

学会python——显示进度条(python实例五)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、进度条显示 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读…

从零到爆款:用ChatGPT写出让人停不下来的短视频文案

一、前言 在自媒体的浪潮中&#xff0c;精彩的短视频文案对内容传播至关重要。众多辅助工具之中&#xff0c;凭借强大的语言处理能力和广泛的应用场景&#xff0c;ChatGPT成为了内容创作者的重要助力。接下来&#xff0c;我将介绍如何借助ChatGPT编写引人入胜的短视频文案&…

积木搭建游戏-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第83讲。 积木搭建游戏&…

Windows10 利用QT搭建SOEM开发环境

文章目录 一. SOEM库简介二. 安装WinPcap三. SOEM(1.4)库安装(1) 编译32位库(2) 编译64位库 四. 运行SOEM示例代码五. WIN10下利用QT构建SOEM开发环境 一. SOEM库简介 SOEM&#xff08;Scalable Open EtherCAT Master 或 Simple Open EtherCAT Master&#xff09;是一个开源的…

【OrangePiKunPengPro】 linux下编译、安装Boa服务器

OrangePiKunPengPro | linux下编译、安装Boa服务器 时间&#xff1a;2024年6月7日21:41:01 1.参考 1.boa- CSDN搜索 2.Boa服务器 | Ubuntu下编译、安装Boa_ubuntu安装boa-CSDN博客 3.i.MX6ULL—ElfBoard Elf1板卡 移植boa服务器的方法 (qq.com) 2.实践 2-1下载代码 [fly752fa…

python将数据保存到文件的多种实现方式

&#x1f308;所属专栏&#xff1a;【python】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的…

EasyRecovery2024数据恢复神器#电脑必备良品

EasyRecovery数据恢复软件&#xff0c;让你的数据重见天日&#xff01; 大家好&#xff01;今天我要给大家种草一个非常实用的软件——EasyRecovery数据恢复软件&#xff01;你是不是也曾经遇到过不小心删除了重要的文件&#xff0c;或者电脑突然崩溃导致数据丢失的尴尬情况呢&…

手机照片免费数据恢复软件EasyRecovery2024免费版下载

大家好&#xff01;今天我要给大家推荐一款非常棒的软件——EasyRecovery。相信大家都知道&#xff0c;电脑中的重要文件一旦丢失&#xff0c;对我们的工作和学习都会产生很大的影响。 而EasyRecovery软件就是专门解决这个问题的利器&#xff01;它能够帮助我们快速、有效地恢…

第三篇—基于黑白样本的webshell检测

本篇为webshell检测的第三篇&#xff0c;主要讲的是基于黑白样本的webshell预测&#xff0c;从样本收集、特征提取、模型训练&#xff0c;最后模型评估这四步&#xff0c;实现一个简单的黑白样本预测模型。   若有误之处&#xff0c;望大佬们指出 Ⅰ 基本实现步骤 样本收集&…