当前位置: 首页 > news >正文

ARM Cortex M内存屏障指令__dsb( )和__isb( )

ARM Cortex-M 系列处理器中的 __dsb()__isb() 是内存屏障指令,用于确保内存操作的顺序性和可见性,尤其在涉及外设、多核/多线程、自修改代码或关键系统配置时至关重要。

一,详细说明和典型应用场景


1. __dsb()(Data Synchronization Barrier)

  • 作用:确保所有在它之前的内存访问指令(如加载/存储)完成,后续指令(不限于内存操作)必须等待此屏障执行完毕。
  • 参数:通常指定作用域(如 DSB_SY/0xF 表示全系统屏障)。
  • 典型场景
    • 外设寄存器操作:修改硬件寄存器后,需确保写入完成再继续。
      *((volatile uint32_t*)0x40000000) = 0x1234; // 写入外设寄存器
      __dsb(0xF); // 等待写入完成
      
    • DMA 配置:启动 DMA 前,确保数据已写入内存。
    • 内存保护单元(MPU)配置:修改 MPU 寄存器后,需同步确保配置生效。
    • 自修改代码:写入新代码后,确保数据同步再执行 ISB。

2. __isb()(Instruction Synchronization Barrier)

  • 作用清空处理器流水线,确保后续指令从内存重新读取,且所有之前的屏障指令(如 DSB)已生效。
  • 参数:通常为 ISB_SY/0xF
  • 典型场景
    • 系统控制寄存器修改:如修改异常向量表基址(VTOR)后。
      SCB->VTOR = 0x20000000; // 设置新向量表地址
      __dsb(0xF); // 确保写入完成
      __isb(0xF); // 清空流水线,后续中断使用新向量表
      
    • 跳转到动态代码:执行新生成的代码前,确保指令更新。
    • 安全状态切换:如从非安全状态切换到安全状态后。

3. 联合使用场景

在关键系统配置中,通常需DSBISB,确保数据同步和指令重新取指:

// 示例:修改 MPU 配置
MPU->RBAR = ...;      // 写入 MPU 寄存器
MPU->RASR = ...;
__dsb(0xF);          // 等待配置写入完成
__isb(0xF);          // 清空流水线,确保后续指令使用新配置

4. 区别总结

指令作用对象关键行为典型场景
__dsb()内存访问等待数据访问完成外设操作、DMA、MPU 配置
__isb()指令流水线清空流水线并重新取指修改 VTOR、执行新代码、特权切换

5. 注意事项

  • 编译器屏障__dsb()/__isb() 是硬件级屏障,不同于 __asm volatile("" ::: "memory")(仅限制编译器重排)。
  • 性能影响:过度使用屏障会降低性能,仅在必要时使用。
  • ARMv7-M/Armv8-M 文档:具体行为参考 ARM Architecture Reference Manual。

通过合理使用这两种屏障,可确保代码在 Cortex-M 处理器上的正确性和可靠性。


二,内存屏障指令会被中断打断吗?

在 ARM Cortex-M 系列处理器中,内存屏障指令(如 __dsb()__isb())本身不会被中断打断。以下是详细分析和关键结论:


1. 内存屏障指令的原子性

ARM 处理器在设计上保证单条指令的原子性。当处理器执行一条指令时,会确保该指令完全执行完毕后再响应中断。因此:

  • __dsb()__isb() 作为单条指令,执行过程中不会被中断打断。
  • 中断的触发和响应发生在当前指令执行完成之后

2. 中断对屏障效果的影响

虽然屏障指令本身不会被中断打断,但中断处理函数的执行可能影响屏障的预期效果,需注意以下场景:

(1) 关键代码段的保护
  • 场景:在修改系统关键配置(如 MPU、VTOR)或外设寄存器后,若未完成屏障操作即被中断,中断处理函数可能访问到不一致的状态。
  • 解决方案
    // 示例:修改 VTOR 前关闭中断
    __disable_irq();          // 关闭全局中断
    SCB->VTOR = 0x20000000;   // 设置新向量表地址
    __dsb(0xF);               // 确保写入完成
    __isb(0xF);               // 清空流水线
    __enable_irq();           // 重新启用中断
    
(2) 中断处理中的内存访问
  • 若屏障指令后发生中断,中断处理函数中的代码默认不继承屏障的同步效果
  • 若中断处理函数需要依赖屏障前的内存操作,需在中断处理函数中显式使用屏障

3. 屏障指令与中断的时序关系

  • __dsb() 的作用:确保此前所有内存访问完成。
    • 若在 __dsb() 后发生中断,中断处理函数能看到屏障前的内存修改
  • __isb() 的作用:清空流水线,确保后续指令重新取指。
    • 若在 __isb() 后发生中断,中断处理函数会从新指令流开始执行(例如修改后的代码或配置)。

4. 总结

关键点说明
指令原子性单条屏障指令不会被中断打断,确保自身操作完整执行。
中断对屏障的影响中断处理函数可能破坏屏障的上下文一致性,需通过关闭中断或显式同步规避。
典型场景修改关键硬件配置、动态代码加载、多核共享资源访问等。

5. 最佳实践

  1. 在关键代码段关闭中断
    修改系统关键状态(如 MPU、VTOR)时,先禁用中断,执行屏障后再启用。

    __disable_irq();
    // 修改关键配置
    __dsb(0xF);
    __isb(0xF);
    __enable_irq();
    
  2. 中断处理函数中显式同步
    若中断处理依赖屏障前的操作,需在中断处理函数内插入屏障。

    void ISR_Handler() {__dsb(0xF);  // 确保看到屏障前的内存修改// 处理逻辑
    }
    
  3. 避免过度使用屏障
    仅在必要时使用屏障,以减少对实时性的影响。


通过合理设计中断与屏障的交互,可确保 Cortex-M 系统的强实时性和数据一致性。

相关文章:

ARM Cortex M内存屏障指令__dsb( )和__isb( )

ARM Cortex-M 系列处理器中的 __dsb() 和 __isb() 是内存屏障指令,用于确保内存操作的顺序性和可见性,尤其在涉及外设、多核/多线程、自修改代码或关键系统配置时至关重要。 一,详细说明和典型应用场景 1. __dsb()(Data Synchron…...

deepseek热度已过?

DeepSeek的热度并没有消退,以下是具体表现: 用户使用量和下载量方面 • 日活跃用户量增长:DeepSeek已经成为目前最快突破3000万日活跃用户量的应用程序。 • 应用商店下载量:1月26日,DeepSeek最新推出的AI聊天机器人…...

使用 Datadog 和 Slack Alerts 监控 minikube

为什么要监控 minikube 集群?这是一个不错的练习,可以让你了解 DataDog 的设置过程并探索 K8s 指标产品。 本文将分享我的以下经验: 设置最新的 minikube部署示例应用程序创建 DataDog(试用)帐户使用 Helm 安装 Data…...

深入 Redis 持久化:从原理到企业级应用的全景图

🧠 什么是 Redis 持久化?为什么需要? Redis 是内存型数据库,默认所有数据都存在内存中,一旦断电,数据就会消失。为了避免重要数据丢失,Redis 提供了持久化机制,用于将内存中的数据保…...

NET模式下如何配置虚拟机的IP地址为静态的

1.查看网关: 2.找到虚拟机的网络配置文件 cd ./etc/sysconfig/network-scripts/ vim ifcfg-ens33 3.修改配置 BROWSER_ONLY"no" IPADDR192.168.122.120 NETMASK255.255.255.0 GATEWAY192.168.122.2 DNS18.8.8.8 4.重启网路服务 sudo systemctl rest…...

VMWare Workstation Pro17.6最新版虚拟机详细安装教程(附安装包教程)

目录 前言 一、VMWare虚拟机下载 二、VMWare虚拟机安装 三、运行虚拟机 前言 VMware 是全球领先的虚拟化技术与云计算解决方案提供商,通过软件模拟计算机硬件环境,允许用户在一台物理设备上运行多个独立的虚拟操作系统或应用。其核心技术可提升硬件…...

磐石云智能语音客服系统——技术革新引领服务新体验

在人工智能技术飞速发展的今天,企业对于智能化客户服务的需求日益增长。磐石云智能语音客服系统凭借其前沿技术架构与深度场景适配能力,正在重新定义人机交互的边界。本文将深入解析该系统如何通过技术创新实现服务效率与体验的双重突破。 一、意图识别…...

什么是iPaaS?

在当今数字化时代,企业面临着日益复杂的IT环境和不断增长的业务需求。随着云计算、微服务、物联网等技术的快速发展,企业需要更加高效、灵活且安全的方式来进行数据集成和应用集成。集成平台即服务(iPaaS)应运而生,成为…...

Vue3 中 Pinia 持久化的全面解析和最佳实践

Vue3 中 Pinia 持久化的全面解析 一、Pinia 简介​ Pinia 是 Vue 的新一代状态管理库,它提供了简洁的 API,支持 Composition API,并且拥有良好的代码拆分和热更新能力。相比于 Vuex,Pinia 的代码结构更加扁平,易于理…...

蓝桥杯最后一天警告!!!

1.万能头文件 #include <bits/stdc.h> 2.一道题实在一点都不会&#xff0c;直接碰运气骗分 #include <bits/stdc.h> using namespace std;int main() {srand(time(0));printf("%d",rand()%101);//生成一个1到10之间的随机整数&#xff0c;并输出print…...

el-time-picker标签的使用

需求&#xff1a; 实现培训日期&#xff0c;用户可以选择某一天的日期&#xff0c;这个比较简单 <el-form-item label"培训日期" prop"startTime"><el-date-picker clearablev-model"form.startTime"type"date"placeholder…...

Mysql--基础知识点--85.1--Innodb自适应哈希索引

1. 自适应哈希索引的用途 InnoDB 的自适应哈希索引&#xff08;Adaptive Hash Index, AHI&#xff09;是 MySQL 数据库引擎中一项智能优化查询性能的功能。其核心作用如下&#xff1a; 加速等值查询 哈希索引通过哈希函数将键映射到固定位置&#xff0c;实现 O(1) 时间复杂度的…...

Matlab 考虑电机激励力的整车垂向七自由度的被动悬架和LQR控制

1、内容简介 Matlab 200-考虑电机激励力的整车垂向七自由度的被动悬架和LQR控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

统一功能处理

SpringBoot统一功能处理 本节目表 1.掌握拦截器的使用&#xff0c;及其原理 2.学习统一数据返回格式和统一异常处理的操作 3.了解一些Spirng的源码 文章目录 SpringBoot统一功能处理前言一、拦截器是什么&#xff1f;二、使用步骤1.定义拦截器2.注册配置拦截器 三&#xff0c;适…...

LibreOffice Writer使用01去除单词拼写判断的红色下划线

这个软件还是非常有特色的&#xff0c;因为大家需要office的全部功能&#xff0c;常常忽略了这个软件的使用体验。 csdn不是特别稳定&#xff0c;linux也没有什么比较好的md编辑器&#xff0c;所以我选择这个软件来记录我的临时博客&#xff0c;原因无他&#xff0c;它可以保存…...

JAVA基础 - 高效管理线程隔离数据结构ThreadLocalMap

欢迎光临小站&#xff1a;致橡树 ThreadLocalMap 是 ThreadLocal 的核心底层数据结构&#xff0c;负责在每个线程中存储与 ThreadLocal 实例绑定的数据。它的设计目标是高效管理线程隔离数据&#xff0c;同时尽量减少内存泄漏风险。以下是其核心实现细节。 数据结构与设计目标…...

每日一题(小白)暴力娱乐篇25

由题意直知&#xff0c;要求将给定的字符串转为符合格式的字符串。首先我们来思考一下例如02/02/02这样的数字日月肯定不用进行修改&#xff0c;修改后需要加上对应的年份的前两位&#xff0c;题目要求1960年1月1日~2059年12年12月31日&#xff0c;&#xff08;对1960年至2059年…...

地表水-地下水耦合建模全景解析暨SWAT-MODFLOW地表与地下协同模拟及多情景专题应用

第一、模型原理与层次结构 1.1流域水循环与SWAT模型 1.2 地下水模拟与MODFLOW模型 1.3 SWAT-MODFLOW地表-地下耦合模型 1.4 QSWATMOD 插件与功能介绍 1.5 模型实现所需软件平台 第二、QGIS软件 2.1 QGIS平台 2.2 QGIS安装 2.3 QGIS界面认识 2.4 QGIS常见数据格式 2.…...

在线论坛系统

在线论坛 项目介绍项目使用技术介绍前端技术栈后端技术栈 项目运行步骤说明后端运行步骤前端运行步骤 项目使用说明用户端功能管理员端功能 部分功能说明运行截图用户端管理员端 系统源码 项目介绍 这是一个基于现代技术栈开发的在线论坛系统&#xff0c;提供用户交流、内容分享…...

webrtc pacer模块(一) 平滑处理的实现

Pacer起到平滑码率的作用&#xff0c;使发送到网络上的码率稳定。如下的这张创建Pacer的流程图&#xff0c;其中PacerSender就是Pacer&#xff0c;其中PacerSender就是Pacer。这篇文章介绍它的核心子类PacingController及Periodic模式下平滑处理的基本流程。平滑处理流程中还有…...

新能源车「大三电」与「小三电」

一、‌大三电系统‌ ‌动力电池‌ 作为整车的能量核心&#xff0c;目前主流类型包括三元锂电池&#xff08;NCM/NCA&#xff09;和磷酸铁锂电池&#xff08;LFP&#xff09;&#xff0c;前者能量密度高&#xff0c;后者安全性和成本优势显著‌。动力电池通过模组串联形成电池包…...

xlinx GT传输器学习

xlinx有2路refclk会输入到gtbank。此2路bank输入时钟是差分输入&#xff0c;经过IBUFDS_GTE2源语转换为单端。如下图。 从fpga外输入高速差分时钟。 差分时钟转换为单端。 单端时钟输入到gt_common模块 下图为gt内部结构图...

C++笔记之父类引用是否可以访问到子类特有的属性?

C++笔记之父类引用是否可以访问到子类特有的属性? code review! 参考笔记 1.C++笔记之在基类和派生类之间进行类型转换的所有方法 文章目录 C++笔记之父类引用是否可以访问到子类特有的属性?1.主要原因2.示例代码3.说明4.如何访问子类特有的属性5.注意事项6.总结在 C++ 中,…...

基于SSM框架的房屋租赁小程序开发与实现

概述 一个基于SSM框架开发的微信小程序房屋租赁管理系统&#xff0c;该项目实现了用户管理、中介管理、房源信息管理等核心功能。 主要内容 一、管理员模块功能实现 ​​用户管理​​ 管理员可对通过微信小程序注册的用户信息进行修改和删除操作&#xff0c;确保用户数据的准…...

大模型评估论文粗读“AGIEval: A Human-Centric Benchmark for Evaluating Foundation Models“

Zhong W, Cui R, Guo Y, et al. Agieval: A human-centric benchmark for evaluating foundation models[J]. arXiv preprint arXiv:2304.06364, 2023. 摘要翻译 评估大模型在处理人类层级的任务时的通用能力&#xff0c;是AGI发展和应用中至关重要的一环。传统的衡量标准通常依…...

程序化广告行业(76/89):行业融资全景剖析与代码应用拓展

程序化广告行业&#xff08;76/89&#xff09;&#xff1a;行业融资全景剖析与代码应用拓展 大家好&#xff01;在之前的文章里&#xff0c;咱们一起了解了程序化广告行业的发展趋势以及PC端和移动端投放的差异。今天&#xff0c;咱们接着深入学习&#xff0c;这次聚焦在程序化…...

网工基础 | 常见英文术语注解

原创&#xff1a;厦门微思网络 以下是一些网工专业常见的英文术语注解&#xff1a; IP Address&#xff08;Internet Protocol Address&#xff09; 互联网协议地址&#xff0c;是分配给连接到互联网的设备的唯一标识符&#xff0c;用于在网络中定位和通信。例如&#xff0c;“…...

【FPGA开发技巧】Modelsim仿真中,显示状态机的名称,而非编码数字

示例 被仿真的文件名为&#xff1a;cmd_handle.v&#xff0c;其中有r_st_current和r_st_next两个状态机变量。 该模块在tb文件中&#xff0c;被例化的名称为cmd_handle_u0 按照如下格式写&#xff1a;cmd_handle_u0.r_st_current 示例tb文件&#xff1a; timescale 1ns / 1…...

二分答案----

二分答案 - 题目详情 - HydroOJ 问题描述 给定一个由n个数构成的序列a&#xff0c;你可以进行k次操作&#xff0c;每次操作可以选择一个数字&#xff0c;将其1&#xff0c;问k次操作以后&#xff0c;希望序列里面的最小值最大。问这个值是多少。 输入格式 第一行输入两个正…...

Nginx 命令大全:Linux 与 Windows 系统的全面解析

Nginx 是一个高性能的 HTTP 和反向代理服务器&#xff0c;广泛应用于 Web 服务、负载均衡和反向代理等场景。本文将从 Linux 和 Windows 系统的角度出发&#xff0c;详细解析 Nginx 的常用命令&#xff0c;并区分两种系统之间的差异&#xff0c;帮助你高效地管理和维护 Nginx 服…...

我的计算机网络(总览篇)

总览--网络协议的角度 在一个庞大的网络中&#xff0c;该从哪里去了解呢&#xff1f;我先细细的讲一下我们访问一个网站的全部流程&#xff0c;当我们的电脑连上网络的时候&#xff0c;就会启动DHCP协议&#xff0c;来进行IP地址&#xff0c;MAC地址&#xff0c;DNS地址的分配…...

开源CMS的模块化设计和API接口如何具体影响其扩展性?

优秀的CMS系统都有自己主打的特点&#xff0c;开源CMS凭借其灵活性和低成本优势占据了市场主流地位&#xff0c;而模块化设计与API接口正是其扩展性的两大基石。本文将深入探讨这两大技术特性是如何影响cms的扩展性的。 一、模块化设计&#xff1a;功能解耦与生态繁荣的引擎 …...

【网络原理】网络通信基础

目录 一. 网络发展史 &#xff08;1&#xff09;局域网 &#xff08;2&#xff09;广域网 二. 网络基础知识 &#xff08;1&#xff09;IP地址 &#xff08;2&#xff09;端口号 &#xff08;3&#xff09;协议 &#xff08;4&#xff09;五元组 一. 网络发展史 网络的发…...

Win11系统 VMware虚拟机 安装教程

Win11系统 VMware虚拟机 安装教程 一、介绍 Windows 11是由微软公司&#xff08;Microsoft&#xff09;开发的操作系统&#xff0c;应用于计算机和平板电脑等设备 。于2021年6月24日发布 &#xff0c;2021年10月5日发行 。 Windows 11提供了许多创新功能&#xff0c;增加了新…...

新手宝塔部署thinkphp一步到位

目录 一、下载对应配置 二、加载数据库 三、添加FTP​ 四、上传项目到宝塔​ 五、添加站点​ 六、配置伪静态 七、其他配置 开启监控 八、常见错误 一、打开宝塔页面&#xff0c;下载对应配置。 二、加载数据库 从本地导入数据库文件 三、添加FTP 四、上传项目到宝塔…...

MCU如何查看系统有没有卡死

前言&#xff1a;在我们调试单片机的时候&#xff0c;经常会遇到系统非预期运行的状况。造成系统卡死的原因有很多&#xff0c;主要有&#xff1a;野指针&#xff0c;数组越界&#xff0c;死锁&#xff0c;还有一些while写入的一些逻辑错误。本文就如何排查这些问题&#xff0c…...

有哪些反爬机制可能会影响Python爬取视频?如何应对这些机制?

文章目录 前言常见反爬机制及影响1. IP 封禁2. 验证码3. 请求头验证4. 动态加载5. 加密与混淆6. 行为分析 应对方法1. 应对 IP 封禁2. 应对验证码3. 应对请求头验证4. 应对动态加载5. 应对加密与混淆6. 应对行为分析 前言 在使用 Python 爬取视频时&#xff0c;会遇到多种反爬…...

【辰辉创聚生物】提供上万种单抗/多抗及其偶联物

辰辉创聚生物致力于提供高质量的一抗&#xff08;Primary Antibodies&#xff09;、二抗&#xff08;Secondary Antibodies&#xff09;和对照抗体&#xff08;Control Antibodies&#xff09;&#xff0c;支持分子生物学、免疫学及生物医学科学领域的前沿研究。我们拥有超过40…...

Google Chrome Canary版官方下载及安装教程【适用于开发者与进阶用户】

谷歌浏览器&#xff08;Google Chrome&#xff09;以其高性能、强扩展性和良好的用户体验深受全球用户喜爱。在其多个版本中&#xff0c;Chrome Canary因具备最前沿的功能测试环境&#xff0c;成为开发者和技术探索者的首选。如果你希望第一时间体验Google Chrome最新功能&…...

BERT - BERT 模型综述

1. BERT的两个任务 &#xff08;1&#xff09;Pre-Training 预训练 Masked LM (MLM) - 让模型预测被隐藏&#xff08;Mask&#xff09;掉的token。 例如&#xff1a;输入“我喜欢吃[MASK]”&#xff0c;Label是“我喜欢吃苹果”&#xff0c; 模型需要预测出“苹果”。这种…...

Vue 大文件分片上传组件实现解析

Vue 大文件分片上传组件实现解析 一、功能概述 1.1本组件基于 Vue Element UI 实现&#xff0c;主要功能特点&#xff1a; 大文件分片上传&#xff1a;支持 2MB 分片切割上传实时进度显示&#xff1a;可视化展示每个文件上传进度智能格式校验&#xff1a;支持文件类型、大小…...

Matlab 电机激励模型和仿真

1、内容简介 Matlab 191-电机激励模型和仿真 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 clc close all clear Tn 165;%电机转矩 R 0.05;%定子半径 n0 1800;% 电机转速 i 2;%额定电流 Lmin 4.95;%最小电感 k 82.5; Nr 6;%转子级数 T 60/Nr/n0;%周期 b 0…...

GPU算力优化

GPU&#xff08;图形处理单元&#xff09;算力优化是提升计算性能的重要任务&#xff0c;在深度学习、科学计算等领域有重要意义。下面从硬件层面、软件层面和算法层面为你介绍一些优化方法&#xff1a; 硬件层面 选择合适的 GPU&#xff1a;不同的 GPU 在算力、显存、功耗等…...

微服务拆分的原则、时机、方法以及常见问题

前言# 在平常情况下&#xff0c;技术架构会随着业务规模大小、团队人数多少、技术债积累速度等动态变化。当然&#xff0c;引起架构变化最主要的因素还是业务发展速度。 在以前的单体架构到微服务架构演进历程 文章2 等文章中&#xff0c;有一张架构演进的图&#xff0c;如下…...

第十八天 - ELK日志体系集成 - 自定义Logstash插件 - 练习:分布式日志分析平台

前言 在分布式系统和微服务架构中&#xff0c;日志管理是监控系统健康、排查故障的核心环节。ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;作为业界领先的日志分析解决方案&#xff0c;能够实现日志采集、处理、存储与可视化的全链路管理。本文将手把手带你掌…...

HBuilderX中uni-app打包Android(apk)全流程超详细打包

一、Android生成打包证书 1、Android平台签名证书(.keystore)生成指南_android 签名生成-CSDN博客&#xff08;如果不上架应用商店可以跳过&#xff0c;可以使用云端证书&#xff09; 二、打开manifest.json配置基础设置 三、配置安卓应用图标 四、配置安卓启动页图片 五、…...

CTF web入门之命令执行

web29 文件名过滤 由于flag被过滤,需要进行文件名绕过,有以下几种方法: 1.通配符绕过 fla?.* 2.反斜杠绕过 fl\ag.php 3.双引号绕过 fl’‘ag’.php 还有特殊变量$1、内联执行等 此外 读取文件利用cat函数,输出利用system、passthru 、echo echo `nl flag.php`; ec…...

安宝特案例 | 某户外机房制造企业应用AR+作业流,规范制造过程,记录施工节点,保障交付质量

行业特点&#xff1a;产品客制化、依赖人工&#xff0c;工程量大、细节多&#xff0c;验收困难 户外通讯机房无疑是现代工业社会的“信息心脏”&#xff0c;承载着信息交换、传输与处理的重任。建设一座质量过关的户外通讯机房是保障通信稳定运行的基石。 通常建设一个户外通信…...

学习MySQL的第八天

海到无边天作岸 山登绝顶我为峰 一、数据库的创建、修改与删除 1.1 引言 在经过前面七天对于MySQL基本知识的学习之后&#xff0c;现在我们从基本的语句命令开始进入综合性的语句的编写来实现特定的需求&#xff0c;从这里开始需要我们有一个宏观的思想&…...

ESP8266 采集 DHT11 和 DS18B20 温湿度数据 MQTT 上传至 Home Assistant

ESP8266 采集 DHT11 和 DS18B20 温湿度数据 MQTT 上传至 Home Assistant DHT11 采集 DHT11 温湿度数据并通过 MQTT 联网上传至 Home Assistant 智能家居平台&#xff1b; Arduino 代码 #include <ESP8266WiFi.h> #include <PubSubClient.h> #include <Ardui…...