流云的博客
文章平均质量分 97
主要介绍物联网相关的内容,比如嵌入式实时操作系统原理,多任务并发编程,TCP/IP协议栈开发,蓝牙/WIFI等无线局域网协议栈开发等。
流云IoT
这个作者很懒,什么都没留下…
展开
-
BLE 技术(九)--- SIG MESH Models 是如何设计的(下)?
SIG 设计或定义了哪些MESH Models?一个Model 通常定义了哪些 states、messages、behavior / procedure?MESH client model 与MESH server model 之间传输的messages 如何由Access Layer 承载、Transport Layer 加解密认证和分段重组的?MESH State transition 是如何进行的?用户如何配置MESH 节点元素?用户如何及时获知MESH 节点元素的故障或错误信息?原创 2021-06-22 22:08:08 · 5558 阅读 · 3 评论 -
BLE 技术(八)--- BLE MESH 各层报文是如何设计的(上)?
前篇博文从解决问题的角度介绍了SIG MESH 协议的设计方案,本篇博文从MESH 消息报文在各协议层的传递过程,介绍SIG 是如何设计MESH 报文结构的,又是如何处理MESH 报文消息的?Bearer Layer 有哪几种报文格式?各报文每个字段是如何实现设计功能的?Provisioning Process 是如何进行的?Key Refresh 和IV Update 是如何进行的?Network Layer 是如何实现认证加密和模糊混淆的?Transport Layer 是如何分段重组的?原创 2021-06-15 22:11:04 · 4628 阅读 · 1 评论 -
BLE 技术(七)--- BLE MESH 是如何设计的?
BLE 协议难以满足物联网时代大规模设备互相通信的需求,于是SIG 在2017 年发布了BLE MESH 协议。SIG MESH 是如何实现大规模设备间多对多通信的?SIG MESH 是如何定义消息报文的?SIG MESH 采用了怎样的消息传递模型?SIG MESH 设备间是如何寻址的?物联网通信的安全性日益重要,SIG MESH 是如何应对各种网络攻击,保证通信安全的?SIG MESH 设备需要持续接收可能发给自己的消息报文,如何支持低功耗节点入网呢?如何支持现有大量的BLE GATT 设备入网呢?原创 2021-05-31 21:57:27 · 9501 阅读 · 5 评论 -
IOT-OS之RT-Thread(十八)--- 如何使用MQTT 协议实现OneNET 远程监控?
物联网时代,我们想把周边的嵌入式设备接入Internet,依托云平台提供的各种服务,实现对嵌入式设备的远程监测和控制,甚至是远程OTA 升级等。各大云平台厂商经常谈到的“云-管/网-边-端”是什么?我们如何将本地设备接入云平台呢?以OneNET 云平台为例,平台域和设备域分别如何配置才能让设备顺利接入云平台?物联网设备接入云平台常用MQTT 协议通信,Paho-MQTT 的实现原理是怎样的?OneNET SDK的实现逻辑是怎样的?我们如何开发应用实现数据点上传、响应下发命令、远程OTA 升级等功能呢?原创 2021-05-16 23:10:24 · 2894 阅读 · 1 评论 -
Web技术(七):如何使用并实现MQTT 消息订阅-发布模型?
物联网时代,大量的嵌入式设备需要接入网络,并完成复杂的消息传递过程。基于请求响应的单对单同步通信协议 -- HTTP 已经难以满足大规模物联网设备的通信需求,因此需要为物联网通信设计一种新的消息传递机制,MQTT 实现的订阅-发布消息模型就可以满足物联网通信需求。什么是订阅-发布消息模型呢?这种消息传递模型有哪些应用呢?订阅-发布消息模型除了用于复杂网络节点间的通信,是否可用于进程或服务间通信呢?MQTT 是如何实现消息订阅-发布机制的呢?MQTT 又是如何保证网络通信安全的呢?原创 2021-05-12 19:09:19 · 10064 阅读 · 3 评论 -
如何为BLE 设备添加OTA DFU 空中升级服务(下)?
前文介绍了BLE 设备实现OTA DFU 的工作原理和执行过程,现在的重点是,如何为自己开发的BLE 工程添加BLE DFU Service 呢?DFU Service 根据是否需要配对绑定,还可以分为Buttonless DFU without bonds service 和Buttonless DFU with bonds service 两种,往我们的工程中添加这两种DFU 服务有何区别呢?这两种DFU Service 分别依赖哪些Libraries?我们如何解决添加DFU 过程中遇到的问题?原创 2021-04-21 21:04:27 · 3036 阅读 · 1 评论 -
如何为BLE 设备实现OTA DFU 空中升级功能(上)?
我们开发的BLE peripheral 设备通常都有代码升级的需求,不管是解决先前的bug,还是增加新的功能。很多BLE peripheral 仅留出一个BLE 无线通讯接口,我们如何通过OTA 方式实现BLE 程序代码的空中升级呢?BLE DFU 的工作原理和升级过程是怎样的?如何实现无任何人工干预的OTA 升级?我们如何保证BLE DFU 过程的安全性?如何校验DFU Package 与当前固件是否兼容?BLE DFU 对存储空间有何要求?Unbonded DFU 和Bonded DFU 有何区别?原创 2021-04-16 20:59:36 · 4966 阅读 · 2 评论 -
如何抓包分析BLE 空口报文(GAP + GATT + LESC procedure)?
对于通讯协议,我们要了解通讯过程的详细信息,需要获取通讯过程中交互的报文以及时间,如何抓取BLE 通讯报文呢?如何解析抓取到的BLE 报文呢?通过抓取到的BLE 数据包,我们可以看到BLE 设备都广播了哪些信息?如何建立连接的?如何交换feature、更新连接参数、payload length、PHY的?如何发现并访问Service、Characteristic、Characteristic Descriptor 的?如何配对并加密链路的?如何协商出LTK 的?如何分发IRK、CSRK 的?原创 2021-04-12 01:48:17 · 20054 阅读 · 4 评论 -
如何实现BLE 最大数据吞吐率并满足设计功耗要求?
我们开发BLE 设备多数都有两点要求:一是低功耗,电池供电需要持续工作数周甚至数个月;二是将BLE peripheral 产生的数据快速传送给central,传输数据功耗较高,提高传输速率缩短传输时间也有利于降低平均功耗。我们该如何设置广播参数与连接参数以达到我们要求的功耗呢?该如何设置连接参数与报文长度(PDU / MTU)以尽可能达到最大传输速率呢?原创 2021-04-08 23:54:25 · 4050 阅读 · 2 评论 -
代码调试跟踪与优化(三)--- 如何调试Fault 异常?
我们在开发嵌入式代码时,经常会遇到处理器无法启动或系统停止响应的情况,比较常见的是处理器触发了Fault 异常,并停留在Fault 异常处理程序内循环,我们如何分析产生Fault 异常的原因呢?如何借助fault status / address registers 获知产生fault 的原因呢?如何跟踪定位产生fault 的具体代码行呢?有哪些调试工具可以帮我们快速分析定位解决fault 呢?如何设计fault handlers 以输出fault log 帮我们快速定位分析解决系统bug?原创 2021-03-24 20:08:40 · 7123 阅读 · 4 评论 -
代码调试跟踪与优化(二)--- 如何调试嵌入式代码?
我们在进行嵌入式系统开发调试时,受限于嵌入式芯片资源和性能,一般采用远程调试。在调试嵌入式底层代码时,gdbserver 无法运行,我们该怎么调试底层代码呢?J-LINK、ST-LINK、CMSIS-DAP 等硬件调试器在嵌入式开发调试过程中扮演了怎样的角色呢?目标芯片内部是如何处理Debug and Trace 信号的?我们如何借助VS Code Cortex-Debug 或IDE 实现可视化调试的?如何借助SEGGER Ozone 和SystemView 实现可视化实时监测跟踪系统运行详情的?原创 2021-03-21 22:36:51 · 5024 阅读 · 2 评论 -
代码调试跟踪与优化(一)--- 如何用GDB 调试代码?
我们在开发软件时,免不了引入一些Bug,这就需要借助各种调试跟踪工具,通过查看当前的执行指令、内存数据、运行日志等信息,分析出产生bug 的可能原因,并给出解决方案。本文主要以GDB 为例,简单介绍GDB 的调试原理是怎样的?GDB 常用的调试命令有哪些?GDB 如何配合VSCode实现可视化调试?GDB 远程调试是如何实现的?原创 2021-03-17 01:09:11 · 4542 阅读 · 2 评论 -
数据结构与算法分析(十八)--- 如何使用动态规划高效寻找最优解?
对于多阶段决策问题,我们使用回溯剪枝算法虽然可以穷举所有可行解,但复杂度太高阶。现实问题通常只关注最优解,针对多阶段决策最优解问题,我们可以使用动态规划算法大幅降低求解复杂度。动态规划的核心是划分阶段和可供决策的状态,然后找到阶段递推的状态转移方程,以便从初始状态递推到目标最优解。由于动态规划后面阶段的最优解通常跟前一阶段多个状态相关,因此存在大量的重叠子问题,通常使用备忘录或状态转移表解决重叠子问题重复求解的问题。如果后面阶段的最优解跟前面阶段无关,只需要选择最快逼近目标值的状态分支,可用贪心算法更高效。原创 2021-01-15 22:56:18 · 2009 阅读 · 0 评论 -
数据结构与算法分析(十七)--- 怎么用回溯剪枝高效穷举所有可行解?
当我们遇到一个比较复杂的问题时,通常会想到将一个复杂的问题分解为多个简单的等价子问题去解决。关键是如何分解复杂问题呢?我们可以从两个大的维度去分解:一个是从空间维度上将原大规模问题分解为多个等价的小规模子问题,再把容易求得的小规模子问题的解合并即可得到原大规模问题的解,这就是分治算法;另一种是从时间维度上将原多阶段决策问题分解为多个等价的单阶段决策子问题,再按照DFS 深度优先遍历顺序尝试所以的决策组合,所有满足约束条件的解的组合共同构成原多阶段决策问题的解,这就是回溯剪枝算法,本文以排列组合为例介绍其原理原创 2021-01-10 23:20:29 · 1431 阅读 · 2 评论 -
数据结构与算法分析(十六)--- 如何设计更高效的字符串匹配算法?(BF + RK + KMP + BMH)
字符处理操作中最常用的是字符串匹配查找算法,本文从最基础的Brute Force 匹配算法开始,分析可能对其的优化方向,就像将基础排序算法优化为归并、快速等高级排序算法一样精彩。首先,从字符比较过程入手,借助哈希值唯一标识的作用,将模式串比较时间从O(m)降低到O(1)。然后,充分利用前面已经比较过的匹配信息,让主串游标不回退,将整个文本串比较时间从O(m*n) 降低到O(n)。最后,利用字符匹配自身的规律,从后往前寻找坏字符,跳过跟主串坏字符不可能匹配的情况,将最好情况时间复杂度提升到O(n/m)。原创 2020-12-20 16:55:19 · 1783 阅读 · 0 评论 -
数据结构与算法分析(十五)--- String 和Regex 支持的字符处理操作(C++11)
字符处理是计算机的核心任务之一,各种编程语言也为字符处理提供了丰富的库函数。由于字符处理中查找匹配操作很常用,C++ 为此设计了string class 和regex class,以保证整个字符串复制传递的最优化。本文介绍了string class 支持的字符串创建、赋值、销毁操作,元素访问、容量管理操作,字符序列比较、新增、删除、替换操作,字符数值转换操作,查找、匹配操作等。C++ 提供了regex class 允许开发者使用正则表达式实现更复杂的字符序列查找、匹配、替换、分割操作。原创 2020-12-15 21:57:02 · 1053 阅读 · 0 评论 -
数据结构与算法分析(十四)--- 字符串和字符处理函数库(C11)
计算机的两大核心任务是数值计算和字符处理,分别对应数学语言和自然语言,各种计算机编程语言也分别为数值计算和字符处理提供了丰富的库函数。本文从字符编码与字符类型开始,介绍常用的字符串和字符数组操作函数,包括字符类型识别、大小写转换,数值格式与字符串格式的互相转换,字符串和字符数组的比较、拼接、复制替换、查找匹配、分割等操作。原创 2020-12-11 00:54:31 · 994 阅读 · 0 评论 -
如何实现扫码连接BLE 设备的功能(以nRF5 为例)?
本文使用nRF52 开发板作为蓝牙主机,来实现扫码连接指定BLE设备并进行通讯的功能。PC 通过摄像头或扫码枪获得目标设备的MAC 地址信息,并经UART 传给nRF52 DK,蓝牙主机将接收到的地址信息处理为LSB 48-bit 格式后将其设置到扫描过滤器中,并启用匹配即连接功能,nRF52 DK 如果扫描到匹配的目标设备立即向其发起连接。连接建立后,蓝牙主机发现目标设备公开的NUS 服务,并借助该服务以Write/Notify 方式相互传输数据,同时实现了PC通过UART 指令获得RSSI 的功能。原创 2020-10-31 14:36:35 · 5829 阅读 · 2 评论 -
BLE 技术(六)--- GATT Profile + ATT protocol + L2CAP(Core_v5.2)
GATT Profile 采用“Server – Client” 架构,Server 专注于定义如何使用一个或多个属性来实现某种特定的服务,以及如何发现并使用这些服务;Client 专注于定义如何使用一个或多个服务来满足某种特定的应用需求。Server 定义的每个单独服务十分简单、而且是原子化的,可以让每个服务的行为更简单明确,同时让不同服务之间的组合更丰富多样。Client 使用不同的原子服务组合,可以满足丰富多样的场景需求,相同的服务可以在不同应用中复用,满足高内聚、低耦合的设计原则。原创 2020-09-26 00:46:56 · 10171 阅读 · 0 评论 -
BLE 技术(五)--- Generic Access Profile + Security Manager(Core_v5.2)
GAP(Generic Access Profile) 定义了蓝牙设备之间如何发现彼此、建立连接以及如何实现配对与绑定,同时描述了设备如何实现无需连接的数据传输、如何实现等时同步数据传输、如何建立ACL与CIS 连接、如何建立安全连接实现加密通信。GAP 规范为设备提供四种角色(可分为两组),每组角色都可以借助模式和过程来描述蓝牙设备的状态和行为,比如广播、发现、连接、绑定、周期广播、等时同步广播模式与过程。同时介绍了每组角色跟安全性相关的模式和过程,比如加密、认证、授权、数字签名模式和过程。原创 2020-09-16 22:11:09 · 6901 阅读 · 0 评论 -
BLE 技术(四)--- 链路层五种通信模式和空口协议设计 (Core_v5.2)
前篇博文LE States and Packets介绍了LE 设备链路层的七种状态与两种基本报文格式,接下来看通信双方如何在广播信道传输这些报文,如何建立并维持双方的连接,如何传输音频数据流,如何管理这些连接特性?原创 2020-08-06 21:52:28 · 9492 阅读 · 0 评论 -
BLE 技术(三)--- 链路层七种状态与空口报文设计(Core_v5.2)
一、LE 链路层 7种状态:Standby State、Advertising State、Scanning State、Initiating State、Connection State、Isochronous Broadcasting State;二、链路层两种基本报文结构:LE Uncoded PHYs、LE Coded PHY;三种PDU类型:Advertising PDU、Data PDU、Isochronous PDU原创 2020-08-01 01:08:42 · 10045 阅读 · 1 评论 -
BLE 技术(二)--- 协议栈架构与物理层设计 (Core_v5.2)
# 一、BLE System Architecture1. Physical Layer 指定BLE 所用的无线频段、调制解调方式、射频性能等;2. Link Layer 管理BLE 的链路状态和设备间的通信链路,保证上层数据安全可靠传输;3. L2CAP 提供多路复用、分片重组、流量控制等机制;4. SMP 管理BLE 连接通信的安全可靠;5. GATT 将带标签的"Attribute"封装为“Service”,实现面向服务的模块化设计;6. GAP 提供了如何发现、连接、绑定其它设备的方法。原创 2020-07-30 19:24:46 · 5548 阅读 · 1 评论 -
字符编码的设计与演进(ASCII,Unicode,UTF-8,GB18030…)
1. 从ASCII 码说起2. OEM 字符集的衍生3. 多字节字符集(MBCS)和中文字符集4. ANSI标准、国家标准、ISO标准5. Unicode字符集的出现6. 编码系统的变化7. 常见的Unicode编码UCS-2/UTF-16UTF-8GB180308. Unicode相关的常见问题Unicode是两个字节吗?带签名的UTF-8指的是什么意思?Unicode编码和以前的字符集编码有什么区别?乱码问题9. 必要的术语解释转载 2020-07-27 00:19:33 · 593 阅读 · 0 评论 -
Bluetooth 技术(一)--- 协议栈设计与演进(Core_v5.2 + 6LoWPAN + Mesh)
蓝牙设备最主要的应用领域有四个:数据传输、音频传输、位置服务、设备网络(包括IPv6 组网和mesh 自组网)。数据传输业务从BLE 低功耗蓝牙技术的发布开始快速增长;音频传输业务受限于传统EDR 技术的限制进入瓶颈,LE Audio 技术和LC3 编码技术的发布将会让蓝牙音频业务再次迎来爆发;LE iBeacon 和Direction Finding技术的发布,让蓝牙设备室内定位精度提升到厘米级;IPv6 Over BLE技术让蓝牙设备可以直接访问Internet,BLE mesh则让其支持大规模自组网。原创 2020-07-18 13:54:42 · 8443 阅读 · 2 评论 -
IOT-OS之RT-Thread(十七)--- 如何使用HTTP协议实现OTA空中升级
一、Bootloader OTA 原理Bootloader 框架底层由Flash 驱动提供ROM 或Flash 分区访问的能力,为搬移固件代码提供支持。Bootloader 还应提供解密、解压缩、必要的校验功能,经校验通过后将更新版本代码写入或搬移到Application 分区覆盖正在使用的固件代码,这就完成了固件升级过程。二、HTTP OTA Downloader 实现三、Bootloader OTA 示例原创 2020-06-25 00:13:33 · 10080 阅读 · 3 评论 -
ARM 代码烧录方案与原理详解 --- SWD/JTAG + Bootloader + OTA (ICP + ISP + IAP)
一、ICP(In Circuit Programing):可通过CPU的Debug Access Port 烧录代码,比如ARM 的SWD或JTAG;二、ISP(In System Programing):可借助MCU厂商预置的Bootloader 实现通过板载UART或USB接口烧录代码,比如STM32的System memory可预置ISP代码;三、IAP(In Applicating Programing):由开发者实现Bootloader功能,可提供代码烧录、差分升级、空中升级、一键恢复等功能。原创 2020-06-22 21:03:48 · 25951 阅读 · 4 评论 -
Web技术(六):QUIC 是如何解决TCP 性能瓶颈的?
一、QUIC 如何解决TCP的队头阻塞问题?1.1 TCP 为何会有队头阻塞问题1.2 QUIC 如何解决队头阻塞问题1.3 QUIC 没有队头阻塞的多路复用二、QUIC 如何优化TCP 的连接管理机制?2.1 TCP连接的本质是什么2.2 QUIC 如何减少TCP 建立连接的开销2.3 QUIC 如何实现连接的无感迁移三、QUIC 如何改进TCP 的拥塞控制机制?3.1 TCP 拥塞控制机制的瓶颈在哪?3.2 QUIC 如何降低重传概率3.3 QUIC 如何改进拥塞控制机制原创 2020-06-10 01:01:41 · 5433 阅读 · 1 评论 -
Web技术(五):HTTP/2 是如何解决HTTP/1.1 性能瓶颈的?
一、HTTP/2 概览1. HTTP/1.1 存在的队头阻塞问题,降低了TCP连接利用率;HTTP/2 通过多数据流并发复用TCP连接部分解决了该问题;2. HTTP/1.1 重复传输臃肿的首部字段,降低了网络资源利用率;HTTP/2 通过首部压缩HPACK,大幅减少了传输开销;3. HTTP/1.1 报文各字段长度不固定,只能串行解析;HTTP/2 整个报文都采用二进制编码,且每个字段长度固定,可以并行处理;4. HTTP/1.1 客户端不能接收除响应之外的报文;HTTP/2 支持服务端主动推送。原创 2020-06-03 00:47:49 · 3729 阅读 · 0 评论 -
Web技术(二):图解HTTP + HTTPS + HSTS
一、HTTP简介目前使用最广泛的仍是HTTP/1.1,截至2020年4月,W3Techs统计的前1000万网站中支持HTTP/2的大概占43.6%,支持QUIC的仅占4.2%。要了解HTTP/2离不开HTTP/1.1,因此本文先介绍主流的HTTP/1.1版本。HTTP属于应用层协议,底层依赖于TCP/IP协议完成数据报文的传输。如果对HTTP报文有加密传输的需求,在HTTP协议与TCP协议之间还可以增加SSL/TLS协议层,这就构成了HTTPS协议。二、HTTP报文2.1 HTTP Request原创 2020-05-10 19:52:40 · 6570 阅读 · 0 评论 -
Web技术(一):互联网的设计与演化(URL + HTML + HTTP)
一、Web技术简史1990年底,Tim Berners-Lee 领导的小组已经构建了Web技术的五大要素:HTML、HTTP、URL、Web浏览器、Web服务器。二、Web三大构建技术2.1 URL / URILinux上一切皆文件,Web上一切皆资源,URL可以唯一标识并定位任一MIME资源。2.2 HTML / XMLHTML语言关心的是信息的表现形式,而XML语言关心的是信息本身的格式和数据内容。2.3 HTTP / HTTPSHTTP基于底层的TCP/IP协议完成html页面的传输。原创 2020-04-27 19:39:30 · 6043 阅读 · 5 评论 -
IOT-OS之RT-Thread(十六)--- WLAN管理框架 + AP6181(BCM43362) WiFi模块
一、WLAN管理框架简介随着物联网快速发展,越来越多的嵌入式设备上搭载了 WIFI 无线网络设备,为了能够管理 WIFI 网络设备,引入了 WLAN 设备管理框架:对下连接具体的 WIFI 驱动,控制 WIFI 的连接、断开、扫描等操作;对上承载不同的应用,为应用提供 WIFI 控制、事件、数据导流等操作。二、WLAN Device实现与AP6181 WLAN驱动移植三、WLAN Protocol实现与LwIP协议栈移植四、WLAN Config 管理与自动连接六、WIFI与Socket网络开发原创 2020-04-10 20:45:28 · 18327 阅读 · 5 评论 -
IOT-OS之RT-Thread(十五)--- SDIO设备对象管理 + AP6181(BCM43362) WiFi模块
一、AP6181 Wi-Fi模块简介 AP6181 Wi-Fi 模组内部实际封装的是Broadcom 43362 芯片,该芯片内部是集成了ARM处理器及RAM/ROM存储空间的,用于运行 Wi-Fi 固件。AP6181 模块是基于SDIO 总线协议进行通信的,因此模块与主控端最底层应该分别是SDIO Card controller与Host controller。二、SDIO设备对象管理三、SDIO 驱动配置原创 2020-04-07 19:41:10 · 16757 阅读 · 2 评论 -
STM32之CubeL4(四)--- SD/MMC + SDIO + HAL
一、SD/MMC/SDIO概念区分MMC(MultiMediaCard)从本质上看,是一种用于固态非易失性存储的规范,定义了诸如卡的形态、尺寸、容量、电气信号、通信协议等方方面面的内容。后来基于不同的考量,进化出了MMC、SD、microSD、SDIO、eMMC等不同的规范。SDIO强调的是接口 I/O功能,不再关注另一端的具体形态(可以是Wi-Fi card、Bluetooth card、GPS card、GSM/GPRS card 、Camera card、Radio/TV card等)。原创 2020-03-31 02:03:27 · 9281 阅读 · 0 评论 -
IOT-OS之RT-Thread(十四)--- AT命令集 + ESP8266 WiFi模块
一、AT命令集简介AT 命令(Attention Commands)作为主芯片和通讯模块的协议接口,广泛应用于嵌入式开发领域,比如GPRS模块、3G 模块、WiFi/蓝牙/GPS模块等,这些网络扩展模块的硬件接口一般为串口,这样主控设备可以通过简单的命令和硬件设计实现多种网络服务功能。 为了方便用户使用 AT 命令,简单的适配不同的 AT 模块, RT-Thread 提供了 AT 组件用于 AT 设备的连接和数据通讯。二、ESP8266 WiFi模块简介三、AT组件实现原理与ESP8266模块移植原创 2020-03-24 23:23:24 · 8757 阅读 · 2 评论 -
IOT-OS之RT-Thread(十三)--- 网络分层结构 + netdev/SAL原理
一、网络分层结构我们单独介绍网络协议栈时,经常使用TCP/IP分层结构,方便了解每一层的作用及实现原理。但当我们在操作系统中使用网络协议栈(比如LwIP协议栈)时,常把其看作一个整体,只关心协议栈对下层硬件与上层应用的接口,并不关心协议栈内部具体的实现过程。二、RT-Thread网络分层结构2.1 ENC28J60设备驱动层2.2 设备无关接口层netdev2.3 网络协议层LwIP2.4 协议无关接口层SAL2.5 系统调用接口层Socket API三、HTTP Server示例程序原创 2020-03-18 21:33:36 · 6410 阅读 · 0 评论 -
C++多线程并发(一)--- 线程创建与管理
一、何为并发简单来说,并发指的是两个或多个独立的活动在同一时段内交替发生。与并发相近的另一个概念是并行,并行则强调的是多个独立的活动在同一时刻点同时发生。二、为什么使用并发在应用程序中使用并发的原因主要有两个:关注点分离和性能。事实上,甚至可以说它们差不多是使用并发的唯一原因;当你观察的足够仔细时,一切其他因素都可以归结到这两者之一(或者可能是二者兼有)。原创 2020-03-16 22:21:32 · 22667 阅读 · 9 评论 -
IOT-OS之RT-Thread(十二)--- 驱动分层与主从分离思想
一、驱动分层思想通过前面对RT-Thread设备模型框架,以及UART、IIC、SPI 等设备驱动实现过程的介绍,我们应该对驱动分层思想并不陌生了。操作系统为什么对设备驱动采用分层管理呢?驱动分层有什么好处呢?二、主从分离思想总线类型或主机控制器是跟SOC或CPU芯片平台相关的,外设或从设备是跟具体的硬件设备相关的。如果将主机控制器驱动与外设驱动分开描述管理,能在更换CPU/SOC和硬件外设时,更方便的进行驱动移植,极大减少驱动新增开发量,这就是Linux提出的总线设备驱动模型。原创 2020-03-12 23:52:33 · 4354 阅读 · 0 评论 -
数据结构与算法分析(十三)--- 集合与映射 + Set/Map容器(C++11)
一、集合与映射人们把一堆东西放到一起,就称之为集合了。一般来讲,集合是具有某种特性的事物的整体,或是一些确认对象的汇集,构成集合的事物或对象称作元素或是成员。集合的元素可以是任何事物,集合具有无序性、互异性、确定性等特性。在数学上,我们可以把映射看作是集合与集合之间的一种对应关系,比如函数实际上就是数的集合到数的集合之间的映射关系。计算机更擅长处理数字编号,我们的大脑更擅长处理概念词汇,因此我们经常需要通过某个关键词key来查询一组数据的信息value,于是就把这种映射关系抽象为一个数据结构:键值对。原创 2020-01-16 16:39:13 · 2542 阅读 · 0 评论 -
数据结构与算法分析(十二)--- 怎么实现并用好一个堆或优先队列?
一、如何理解堆?如果采用类似锦标赛的方法排出了一、二、三名来,第一大的数字可以完全按照锦标赛淘汰制的方式来。但是第二大的数字,就需要从所有与最大数字比较过被淘汰的数字中,再次比较选择才能确定,当第二大的数字确定后,就可以用这种方法找到第三大的数字了。如果我们只需要选出第一名,这种算法的复杂度只有O(N),如果还需要选出第二名,则额外增加O(logN)次计算就可以了,对第三名也是如此。也就是说,锦标赛排序算法在从N个选手中选出K个选手的事情中特别快。原创 2020-01-13 20:42:30 · 828 阅读 · 2 评论