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

嵌入式软件知识点自存

I2C时序

空闲:SCL=1,SDA=1

起始:SCL=1,SDA 高→低

停止:SCL=1,SDA 低→高

数据传输:SCL 高,采样 SDA,SDA 不能变化;SCL 低,SDA 允许改变电平。SDA 高 = 1,SDA 低 = 0。

ACK:接收方拉低 SDA;NACK:SDA 保持高电平。

volatile关键字的作用

禁止编译器把变量缓存到寄存器,强制每次读写访问真实内存,消除读写优化。

三大适用场景:

  1. 外部硬件状态寄存器(内存映射外设)
  2. 中断处理函数与主程序共享全局标志
  3. 裸机 RTOS 多任务 / 多线程共享标志位

MQTT

概念

基于TCP的轻量级、发布订阅消息协议,客户端-broker代理-客户端架构。

特点

开销小、带宽占用低,适合弱网设备。

三个角色

Publisher发布者(发消息)、Broker代理服务器(接收、转发信息)、Subscriber订阅者(接收信息)

topic主题

层级用/分割,单层通配符+(例:school/+/teacher),多层通配符#(例:school/#)

QoS服务质量

发布者与Broker之间、Broker与订阅者之间分别协商,两端取最小值。

QoS0最多一次,消息发出去就不管,不重传,可能丢包,适合不重要传感器上报。

QoS1至少一次,保证消息一定到达,可能重复。PUBLISH->PUBACK。

QoS2恰好一次,四次握手PUBLISH PUBREC PUBREL PUBCOMP,开销最大,保证不丢不重复

重要报文

  1. CONNECT:客户端连接 Broker
  2. CONNACK:Broker 回复连接结果(返回码非常重要:0 成功,1 协议不支持,2 身份拒绝等)
  3. PUBLISH:发布消息
  4. SUBSCRIBE/SUBACK:订阅主题
  5. UNSUBSCRIBE/UNSUBACK:取消订阅
  6. PINGREQ / PINGRESP:心跳保活!

保留消息

发布消息设置retain=1,Broker保存这条消息;新订阅该主题的客户端上线立即收到该最新消息。

使用场景:设备最新状态上线。

清楚保留消息:发布一条retain=1,payload为空的消息。

遗嘱消息

客户端在CONNECT报文中提前注册好遗嘱,当客户端异常断开,Broker自动向对应主题发送遗嘱消息。

端口

1883:MQTT明文

8883:MQTT+TLS加密

HTTP

概念

超文本传输协议,应用层协议,请求-应答模式:客户端发起请求,服务端返回响应,服务端不能主动推消息给客户端。

端口

HTTP80 HTTPS443

报文结构

请求报文:请求行(请求方法、请求URI、HTTP版本)、请求头(属性名:属性值)、空行、请求体

响应报文:状态行(HTTP版本、状态码、状态描述)、响应头、空行、响应体(实际返回的数据)

常用请求方法

  • GET:获取资源,参数放 URL;不应该修改服务器数据。
  • POST:提交数据,数据放在 body,新增操作。
  • PUT:全量更新资源。
  • DELETE:删除资源。
  • PATCH:局部修改资源。

状态码

  • 1xx 信息:100 继续
  • 2xx 成功200 OK 成功;201 Created 创建成功
  • 3xx 重定向301 永久重定向;302 临时重定向;304 Not Modified 协商缓存(资源没有变化,返回缓存)
  • 4xx 客户端错误400 参数错误;401 未认证;403 没有权限;404 资源找不到;405 方法不允许
  • 5xx 服务端错误500 服务器内部错误;502 网关错误;503 服务不可用

长连接区别

HTTP Keep-Alive:同一个tcp连接可以连续发多次http请求响应,不用每次请求建立tcp三次握手。

MQTT长连接:依靠心跳保活,broker可以随时主动推送消息给客户端。

缓存机制

强缓存:浏览器看本地缓存是否过期,不发请求到服务器,直接用本地缓存。

协商缓存:发送请求给服务器,服务器判断资源有没有修改,没有返回304,使用本地缓存。

http://www.cnnetsun.cn/news/4279773.html

相关文章:

  • 数学建模竞赛实战指南:从模型构建到算法求解的完整流程解析
  • AI蛋白质结构“缩小射线”:原理、部署与批量处理指南
  • 432道MySQL面试题 61 - 80 题
  • Python长教程怎么学?把648集当知识地图而非追剧清单
  • Java内推笔试复盘:从冒泡排序到JVM基础考点解析
  • Keil uVision2 C51版详解:从安装配置到工程实战与报错排查
  • 发布订阅模式实战指南:从事件总线原理到消息队列选型与避坑
  • 大厂校招上岸指南:技术干货与面试实战全拆解
  • 从“策略为王”源码看MFC股票行情3秒刷新机制
  • 300集Python零基础教程怎么用?从爬虫到数据分析的学习路径拆解
  • App信息管理系统:从核心功能到技术实现的完整指南
  • HoRain云--Node.js 全局对象
  • LSM303AGR电子罗盘开发:磁校准与倾斜补偿实战
  • Agentic Coding实践:夜间编码智能体(Nightshift)的工程化落地
  • Latent Reasoning隐空间推理:从思维链到DeepSeek-V4
  • Spring Boot 整合 Drools:复杂业务决策与热更新实战
  • 基因组语言模型:从读取序列到生成新型噬菌体
  • 蓝桥杯国赛嵌入式系统设计:基于STM32的测量控制与通信综合实战
  • VB.NET+SQL Server构建BS架构订餐系统:从数据库设计到三层架构实战
  • 美团2016研发工程师笔试题解析:从数据结构到算法的核心考点复盘
  • 单片机毕业设计-基于 STM32 的多传感器户外遇险预警定位设备开发 基于 STM32 的跌倒检测与水坑障碍物综合安防装置设计(013505)
  • 大模型本地化的经济账:DeepSeek V4 Flash 部署实测
  • 基于TensorFlow的线路定价预测模型:从特征工程到LSTM实战
  • 服装吊牌OCR容错的完整技术栈:检测→识别→后处理→匹配
  • 无界趣连2.0使用指南 无界趣连2.0怎么用
  • 南非最大钻石矿停产,南非被河南打败了?
  • Barret Zoph重返谷歌DeepMind:Gemini推理模型与RLHF工程化提速
  • 【AI原生研发转型·第4篇】没有计划不写码,机构知识变成文件
  • 开发者博客停更后如何重启?从11000关注者账号出发的完整行动方案
  • 用Gemini API构建法律合同自动审查与知识库增强系统