单片机开发进阶技巧:(三)生产者-消费者模型
上一篇下一篇如何判断一个浮点型运算结果是否为整数目 录生产者-消费者模型1定义2核心同步问题3实现方式3.1基于信号量的经典方案3.2在 RTOS 中如 FreeRTOS4实际工作中常见的应用场景5总结生产者-消费者模型1定义生产者-消费者模型 是并发编程中最经典的设计模式之一用于解决多线程/多进程之间数据传递与协作的问题。生产者Producer负责生成数据比如传感器采集、网络接收、文件读取。消费者Consumer负责处理数据比如计算、显示、存储、转发。共享缓冲区Buffer一个固定大小的队列或环形缓冲区生产者把数据放进去消费者从里面取出来。三者关系[生产者] —(写入)— [共享缓冲区] —(读取)— [消费者]。为什么需要这个模型好处说明解耦生产者和消费者互不依赖可以独立变化平衡速度差异生产者快、消费者慢时数据暂存缓冲区不会丢失或阻塞异步处理生产者在产生数据后不必等消费者处理完可以立刻去做下一件事支持并发多个生产者和多个消费者可以同时工作2核心同步问题共享缓冲区是临界资源需要解决两个问题问题描述典型解决方式互斥同一时刻只能有一个线程修改缓冲区互斥锁mutex同步缓冲区满时生产者必须等待缓冲区空时消费者必须等待信号量semaphore3实现方式3.1基于信号量的经典方案// 假设有一个长度为 N 的环形缓冲区sem_tempty_slots;// 初始值为 N空位数sem_tfilled_slots;// 初始值为 0已填数据数mutex_tbuffer_mutex;// 保护缓冲区操作voidproducer(){while(1){itemproduce_item();sem_wait(empty_slots);// 等有空位mutex_lock(buffer_mutex);insert_item(item);// 放入缓冲区mutex_unlock(buffer_mutex);sem_post(filled_slots);// 通知有新数据}}voidconsumer(){while(1){sem_wait(filled_slots);// 等有数据mutex_lock(buffer_mutex);itemremove_item();// 取出缓冲区mutex_unlock(buffer_mutex);sem_post(empty_slots);// 通知有空位consume_item(item);}}3.2在 RTOS 中如 FreeRTOS通常会用消息队列Queue直接实现队列本身已经内置了互斥和同步机制QueueHandle_t xQueuexQueueCreate(QUEUE_LENGTH,sizeof(Data_t));// 生产者voidvProducerTask(void*pvParameters){Data_t data;// ... 生成数据xQueueSend(xQueue,data,portMAX_DELAY);}// 消费者voidvConsumerTask(void*pvParameters){Data_t data;xQueueReceive(xQueue,data,portMAX_DELAY);// ... 处理数据}4实际工作中常见的应用场景场景生产者消费者缓冲区日志系统各个业务线程产生日志单独的日志线程写入文件无锁环形缓冲区串口通信串口接收中断ISR数据解析线程RingBuffer网络包处理网卡驱动接收数据协议栈线程LwIPpbuf 链表 / 队列传感器数据采集定时器中断采集 ADC数据处理/上传线程双缓冲或队列5总结生产者消费者模型就是通过一个共享的缓冲区把“生产数据”和“消费数据”两个动作分开让它们可以并发、异步地执行并利用互斥和同步机制保证数据安全与流程协调。

相关新闻

告别熬夜对账!这款小程序帮烘焙老板实时掌控门店营收

告别熬夜对账!这款小程序帮烘焙老板实时掌控门店营收

一、核心价值定位 传统实体门店尤其是烘焙行业普遍存在数据管理痛点:经营数据更新滞后,每日营收、销量、客流依靠电脑后台与人工统计,制表对账耗时易出错;店主外出、巡店时无法实时掌握门店经营状况,运营决策只能依靠…

2026/7/22 10:15:37 阅读更多 →
绿盟堡垒机5611版本—自动改密

绿盟堡垒机5611版本—自动改密

通过堡垒机的设备改密/改密计划功能,可以实现对运维服务器、设备的批量改密,也可以实现服务器的密码托管。目前堡垒机支持Windows以及字符类协议(ssh、telnet)设备的改密,目前堡垒机仅支持修改堡垒机上存储的设备账号&…

2026/7/22 10:15:37 阅读更多 →
EMIFA异步接口配置:嵌入式存储时序与寄存器详解

EMIFA异步接口配置:嵌入式存储时序与寄存器详解

1. EMIFA异步接口:嵌入式存储系统的“交通指挥官” 在嵌入式系统开发中,处理器与外部存储器的通信效率直接决定了整个系统的性能上限。想象一下,你的微控制器(MCU)是大脑,而外部的NOR Flash或SRAM是它的“外…

2026/7/22 10:14:37 阅读更多 →

最新新闻

TMS320C6000 DSP EMIF异步接口配置与Flash存储器驱动开发实战

TMS320C6000 DSP EMIF异步接口配置与Flash存储器驱动开发实战

1. 项目概述与核心价值在嵌入式DSP系统开发中,如何让高速的处理器与相对“慢速”的外部Flash存储器稳定、高效地对话,是每个工程师都会遇到的经典难题。TMS320C6000系列DSP强大的外部存储器接口(EMIF)为解决这个问题提供了硬件基础…

2026/7/22 11:02:56 阅读更多 →
Gradio安装配置及经典案例说明

Gradio安装配置及经典案例说明

1. Gradio 基本介绍 1.1 定义与核心概念 Gradio 是一个开源的 Python 库,用于为 机器学习 模型和函数创建交互式网页界面。它成立于 2020 年,由 Ali Faisal、Hamza Khan 和 Muhammad Furqan 持续开发,最新稳定版本为 5.49.1。 # 示例&…

2026/7/22 11:02:56 阅读更多 →
AI设计辅助插件:提升UI设计效率的智能工具

AI设计辅助插件:提升UI设计效率的智能工具

1. 项目概述:AI设计辅助插件的革命性突破这个名为"AI界面美化神器"的开源插件正在设计圈引发一场静默革命。作为一名经历过无数个深夜改稿的设计老兵,我最初看到这个工具时也持怀疑态度——直到它帮我3小时内完成了一个原本需要两天的工作量。…

2026/7/22 11:02:56 阅读更多 →
TI ISS ISP中断与DMA机制解析:嵌入式视觉系统核心驱动开发指南

TI ISS ISP中断与DMA机制解析:嵌入式视觉系统核心驱动开发指南

1. 项目概述:TI ISS图像子系统中的ISP核心 在嵌入式视觉系统里,图像信号处理器(ISP)是连接原始传感器数据与最终可用图像之间的“翻译官”和“美容师”。它负责将传感器输出的、充满噪声和失真的原始拜耳(Bayer&#x…

2026/7/22 11:02:56 阅读更多 →
iPhone查找功能全攻略:从设置到应急响应

iPhone查找功能全攻略:从设置到应急响应

1. iPhone查找功能全景解析:从基础设置到应急响应 作为一名从iPhone 4时代就开始使用苹果产品的老用户,我经历过三次手机丢失的惊魂时刻,也见证过查找功能从简单的"Find My iPhone"进化到现在集定位、远程控制、数据保护于一体的完…

2026/7/22 11:02:56 阅读更多 →
独居老人日常关怀AI系统设计:多模态感知、隐私保护与异常检测的架构方案

独居老人日常关怀AI系统设计:多模态感知、隐私保护与异常检测的架构方案

独居老人日常关怀AI系统设计:多模态感知、隐私保护与异常检测的架构方案 一、一个被技术忽视的刚需场景:独居老人的安全与陪伴缺口 中国60岁以上独居老人已超过1.2亿。现有解决方案集中在两个极端:一是24小时人工看护,成本每月800…

2026/7/22 11:01:56 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻