- 博客(100)
- 资源 (2)
- 收藏
- 关注
原创 C++多线程并发(一)--- 线程创建与管理
一、何为并发简单来说,并发指的是两个或多个独立的活动在同一时段内交替发生。与并发相近的另一个概念是并行,并行则强调的是多个独立的活动在同一时刻点同时发生。二、为什么使用并发在应用程序中使用并发的原因主要有两个:关注点分离和性能。事实上,甚至可以说它们差不多是使用并发的唯一原因;当你观察的足够仔细时,一切其他因素都可以归结到这两者之一(或者可能是二者兼有)。
2020-03-16 22:21:32
22828
9
原创 IOT-OS之RT-Thread(十二)--- 驱动分层与主从分离思想
一、驱动分层思想通过前面对RT-Thread设备模型框架,以及UART、IIC、SPI 等设备驱动实现过程的介绍,我们应该对驱动分层思想并不陌生了。操作系统为什么对设备驱动采用分层管理呢?驱动分层有什么好处呢?二、主从分离思想总线类型或主机控制器是跟SOC或CPU芯片平台相关的,外设或从设备是跟具体的硬件设备相关的。如果将主机控制器驱动与外设驱动分开描述管理,能在更换CPU/SOC和硬件外设时,更方便的进行驱动移植,极大减少驱动新增开发量,这就是Linux提出的总线设备驱动模型。
2020-03-12 23:52:33
4509
原创 数据结构与算法分析(十三)--- 集合与映射 + Set/Map容器(C++11)
一、集合与映射人们把一堆东西放到一起,就称之为集合了。一般来讲,集合是具有某种特性的事物的整体,或是一些确认对象的汇集,构成集合的事物或对象称作元素或是成员。集合的元素可以是任何事物,集合具有无序性、互异性、确定性等特性。在数学上,我们可以把映射看作是集合与集合之间的一种对应关系,比如函数实际上就是数的集合到数的集合之间的映射关系。计算机更擅长处理数字编号,我们的大脑更擅长处理概念词汇,因此我们经常需要通过某个关键词key来查询一组数据的信息value,于是就把这种映射关系抽象为一个数据结构:键值对。
2020-01-16 16:39:13
2584
原创 数据结构与算法分析(十二)--- 怎么实现并用好一个堆或优先队列?
一、如何理解堆?如果采用类似锦标赛的方法排出了一、二、三名来,第一大的数字可以完全按照锦标赛淘汰制的方式来。但是第二大的数字,就需要从所有与最大数字比较过被淘汰的数字中,再次比较选择才能确定,当第二大的数字确定后,就可以用这种方法找到第三大的数字了。如果我们只需要选出第一名,这种算法的复杂度只有O(N),如果还需要选出第二名,则额外增加O(logN)次计算就可以了,对第三名也是如此。也就是说,锦标赛排序算法在从N个选手中选出K个选手的事情中特别快。
2020-01-13 20:42:30
851
2
原创 数据结构与算法分析(十一)--- 平衡二叉树 + 红黑树
一、什么是平衡二叉查找树发明平衡二叉查找树这类数据结构的初衷是,解决普通二叉查找树在频繁的插入、删除等动态更新的情况下,出现时间复杂度退化的问题。所以,平衡二叉查找树中“平衡”的意思,其实就是让整棵树左右看起来比较“对称”、比较“平衡”,不要出现左子树很高、右子树很矮的情况。AVL 树是一种高度平衡的二叉树,所以查找的效率非常高,但是,有利就有弊,AVL 树为了维持这种高度的平衡,就要付出更多的代价。红黑树只是做到了近似平衡,并不是严格的平衡,在维护平衡的成本上,要比 AVL 树要低。
2020-01-11 18:43:13
1033
原创 数据结构与算法分析(十)--- 二叉树的本质与实现 + 递归树与决策树应用
一、为何要有二叉树?世界上有什么样的问题,就有什么样的工具,或者说工具的发明是针对问题来的。在计算机中,由于经常要做的事情是判断真假、比较大小、排序、挑选最大值这类的操作,而它们在计算机的世界里又如此重要,当然也就值得为这些事情专门设计一种数据结构这种数据结构被称为二叉树。二叉树虽然是一种抽象的东西,在自然界中并不存在,但是它却浓缩了自然界很多事物的共性,那就是分叉、层层递进和有序。而针对这些共性,科学家们又总结出一些具有普遍性的算法,能够回过头来,应用到各种实际问题中。
2020-01-09 00:29:55
2332
原创 密码学简史(三)--- 量子计算中的未来密码学
在加密与解密的大战中,RSA加密法取得了暂时的胜利,那它有没有破解法呢?坦率的说,现在还没有,但理论上存在破解的可能,那就是量子计算机和配套的量子算法。7. 量子加密法RSA加密法我们之前也说过,它之所以坚固就是因为要分解一个大数N的因子,这个问题的计算量随N的增加以指数形式增加。但量子计算机一次操作就相当于传统计算机很多次操作,所以如果能设计出一些连续的操作来分解质数的话,即便是一个超大数,用量子计算机也能很快的找出它的因数。这样,RSA加密法就被破解了。
2020-01-03 22:08:10
1647
原创 密码学简史(二)--- 区块链中的现代密码学
从计算机时代开始,字母作为操作的最小单位的概念就消失了。在计算机里,所有的数据都被表示成0和1的数字组合(二进制),字母也不例外,把字母数字化得有个标准,现在这个标准就叫做ASCII。字母一旦变成数字,在计算机中字母的符号属性、发音属性等语言规律就完全消失了,它只是一个二进制数字,我们可以随意对它做改变,且这种改变发生在字母内部。所以说,数字化使加密法步入一个新的世代。5. 对称钥匙:魔王加...
2020-01-03 09:30:30
2872
原创 密码学简史(一)--- 谍战中的古典密码学
古典密码学,在加密和解密的过程中,最小操作单位都是单个字符或者符号。现代密码学,把研究对象用数来描述,再对数进行运算,不但突破了字母作为最小变化单位的限制,还可以使用更高等的数学工具做运算,因此破译就变得越来越困难。可以说,加密时所用的数学工具,决定了一个密码能否被破译。把研究对象用数来描述,主要是伴随着计算机出现的,计算机要想处理字符或符号信息,需要把所有字符或符号编码为二进制的0和1,才能使用更高等的数学工具对这些数进行运算处理。因此,可以把计算机出现之前的密码学叫做古典密码学,之后的叫做现代密码学
2020-01-02 00:33:34
4957
2
原创 数据结构与算法分析(九)--- 哈希算法能用来干啥?
一、什么是哈希算法哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。哈希算法的应用非常非常多,这里选了最常见的七个,分别是安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储。
2020-01-01 20:17:14
2559
原创 数据结构与算法分析(八)--- 如何实现并用好一个散列表?
一、如何快速完成搜索这种可以将关键词key映射为数组下标的函数称作散列(hash)函数,借助hash函数保存key--value索引条目的数组称为散列表(hash table)。散列表的插入、删除、查找或替换操作都需要两步:先通过hash函数将关键词key映射为数组下标,再通过数组下标访问关键字key对应的元素值value。散列表的插入、删除、访问或替换时间复杂度都是O(1)。散列表并不是线性表,可以把散列表看作一个元素集合。
2020-01-01 13:15:14
1002
原创 数据结构与算法分析(七)--- 排序算法分析 + 排序优化
一、如何分析一个排序算法1.1 排序算法的执行效率对于排序算法执行效率的分析,我们一般会从这几个方面来衡量: - 最好、最坏、平均情况时间复杂度 - 时间复杂度的系数、常数 、低阶 - 比较、交换或移动的次数1.2 排序算法的内存消耗1.3 排序算法的稳定性
2019-12-26 00:45:12
1652
原创 数据结构与算法分析(四)--- 时间与空间复杂度
一、复杂度分析数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间。所以,执行效率是算法一个非常重要的考量指标。那如何来衡量你编写的算法代码的执行效率呢?这里就要用到一把衡量标尺:时间、空间复杂度分析。大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。
2019-12-23 23:56:19
865
原创 数据结构与算法分析(三)--- 队列、栈的实现与应用
一、队列的实现想要理解队列很简单,因为它的性质和我们日常生活中的排队很类似,线性、先到先处理、后到排末尾。很显然,队列也是一种线性表,但比线性表的要求更严格,线性表可以对中间的元素进行访问和操作,队列则只能从首尾两端访问或操作元素,队列是一种操作受限的线性表,队列的所有特性都可以由线性表实现。要理解栈也不难,弹匣只有一个子弹出入口,弹匣中有弹簧和卡子,我们最先装填进弹匣的子弹(可称为”入栈“或”压栈“)最后从弹匣中弹出(可称为”出栈“或”弹栈“),可谓是”先到进栈底,后到压上头“。
2019-12-23 22:54:32
1165
原创 数据结构与算法分析(二)--- STL简介 + 线性表容器(C++11)
STL是由一些可适应不同需求的集合类和一些能够在这些数据集合上运作的算法构成,STL内的所有组件都由模板构成,所以其元素可以是任意类型。STL组件包括以下部分: - 容器(container):用来管理某类对象的集合,容器可以是array、list、set、map等; - 迭代器(iterator):用来在一个对象集合内遍历元素,这个对象集合或许是个容器,或许是容器的一部分; - 算法(algorithm):用来处理集合内的元素,它们可以出于不同的目的而增、删、改、查、排序、使用元素。
2019-12-19 19:18:43
2256
原创 数据结构与算法分析(一)--- 数据结构的本质 + 线性表的实现
一、什么是数据结构将现实世界的数据组织成为一些具有特定关系的逻辑结构,再把这些逻辑结构的数据映射到计算机的物理存储结构中,这便是计算机科学中的数据结构要解决的问题。数据按照一定的关系结构映射到计算机内存中后,需要在内存中处理这些数据结构,如何在内存中操作这些数据结构就是算法要解决的问题了。对同一个现实问题,使用不同的数据结构和算法进行存储和计算,表现出来的效率是不一样的,如何评价这些数据组织与存储结构及其对应的操作方法,这便需要引入时间和空间复杂度这把标尺了。
2019-12-18 23:39:47
1482
原创 数据结构与算法分析(六)--- 分治与减治 + 分治排序与二分查找
一、分治算法分治(divide and conquer)的全称为“分而治之”,分治算法主要由两部分构成: - 分(divide):递归求解所有从原问题分解出来的相似子问题; - 治(conquer):从子问题的解构建原问题的解。分治算法将原问题划分成若干个规模较小而结构与原问题相似的子问题,然后递归求解所有子问题,最后合并所有子问题的解,即可得到原问题的解。在函数正文中至少含有两个递归调用的例程叫做分治算法,而函数正文中只含一个递归调用的例程不是分治算法(可以称为减治算法)。
2019-12-13 18:53:19
2940
原创 数据结构与算法分析(五)--- 递推与递归 + 减治排序
一、递归与尾递归人有人的思维,计算机有计算机的思维,它们很不相同。如果你要问其中最大的不同是什么,那就是一种被称为递归(recursive)的逆向思维。相比之下,人的正向思维被称为递推(iterative)。要了解什么是递归,我们先了解什么是递推。递归就在于使用计算机自顶向下、从整体到局部的思维方式分析问题,找到把原问题自顶向下层层展开(或分解)的递推公式,通过不断重复使用递推公式,把原问题展开(或分解)到有已知解的递归边界处,再从递归边界的已知解,自底向上递推(或回归)求得原问题的解。
2019-12-09 22:37:18
2164
原创 TCP/IP协议栈之LwIP(十一)--- LwIP协议栈移植
一、移植环境准备前面主要是基于QEMU虚拟机环境进行LwIP协议栈开发调试的,如果手头没有开发板可以先在个人电脑上运行QEMU虚拟机以便学习LwIP协议栈的实现原理或者开发调试过程。在实际产品中,就需要在真实的开发板上移植LwIP协议栈,并在此基础上进行开发调试了。1.1 IoT-OS准备现在物联网设备越来越需要操作系统支持,所以本文在有操作系统的基础上移植LwIP协议栈,选择的操作系统环境...
2019-11-30 14:08:32
5302
原创 TCP/IP协议栈之QEMU(零)--- LwIP开发调试环境搭建
一、QEMU环境搭建嵌入式软件开发离不开开发板,在没有物理开发板的情况下,可以使用 QEMU 等类似的虚拟机来模拟开发板。QEMU 是一个支持跨平台虚拟化的虚拟机,它可以虚拟很多开发板。为了方便大家在没有开发板的情况下体验 RT-Thread,RT-Thread 提供了 QEMU 模拟的 ARM vexpress A9 开发板的板级支持包 (BSP), 我们可以在此基础上学习LwIP协议栈的开发...
2019-11-22 01:01:21
3447
原创 IOT-OS之RT-Thread(八)--- IIC设备对象管理与Sensor管理框架
一、IIC协议简介1.1 IIC总线简介I2C(Inter Integrated Circuit)总线是 PHILIPS 公司开发的一种半双工、双向二线制同步串行总线。I2C 总线传输数据时只需两根信号线,一根是双向数据线 SDA(serial data),另一根是双向时钟线 SCL(serial clock)。SPI 总线有两根线分别用于主从设备之间接收数据和发送数据,而 I2C 总线只使用...
2019-11-19 00:46:59
2683
2
原创 IOT-OS之RT-Thread(十一)--- FAL分区管理与easyflash变量管理
FAL (Flash Abstraction Layer) Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API。FAL抽象层位于SFUD框架的上层,可以将多个Flash硬件(包括片内Flash和片外Flash)统一进行管理,并向上层比如DFS文件系统层提供对底层多个Flash硬件的统一访问接口,方便上层应用对底层硬件的访问操作。
2019-10-24 01:17:11
13638
9
原创 IOT-OS之RT-Thread(十)--- DFS文件系统管理与devfs/elmfat示例
文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型 (Abstract data type),是一种用于向用户提供底层数据访问的机制。文件系统通常存储的基本单位是文件,即数据是按照一个个文件的方式进行组织。当文件比较多时,将导致文件繁多,不易分类、重名的问题。而文件夹作为一个容纳多个文件的容器而存在。
2019-10-22 20:14:35
7896
原创 IOT-OS之RT-Thread(九)--- SPI设备对象管理与SFUD管理框架
一、SPI设备对象管理前篇博客介绍了I/O设备模型框架,并以PIN设备驱动框架为例说明了RT-thread I/O设备模型框架的实现原理,下面以SPI设备驱动框架为例再做进一步介绍。SPI设备与QSPI设备CubeMX配置及HAL API库函数的使用可参考博客:SPI + QSPI + HAL。最上层的I/O设备管理层在前篇博客已经介绍过了,下面从中间的SPI设备驱动框架层开始介绍。1.1...
2019-10-19 00:52:17
5915
1
原创 STM32之CubeL4(三)--- SPI + QSPI + HAL
# 一、SPI简介SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步通信总线,常用于短距离通讯,主要应用于 EEPROM、FLASH、实时时钟、AD 转换器、还有数字信号处理器和数字信号解码器之间。QSPI 相比SPI增加了队列传输机制,其最大结构特点是以 80 字节的 RAM 代替了 SPI 的发送和接收数据寄存器,极大的提高了传输速率。
2019-10-14 23:43:22
12579
2
原创 IOT-OS之RT-Thread(七)--- I/O设备模型框架与PIN设备对象管理
一、I/O设备模型RT-Thread中对于I/O设备的抽象是很有特点一个地方,是ucos,freertos都没有的一个地方。RT-Thread提供了一个简单的I/O设备管理框架,希望所有的I/O设备驱动都通过这个框架编写,实现统一的管理。RT-Thread 提供的 I/O 设备模型框架如下图所示,它位于硬件和应用程序之间,共分成三层,从上到下分别是 I/O 设备管理层、设备驱动框架层、设备驱动层:
2019-09-25 20:26:18
3289
原创 IOT-OS之RT-Thread(六)--- 线程间同步与线程间通信
二、IPC对象管理2.1 IPC对象控制块再回顾下内核对象的派生和继承关系:前面已经介绍过直接继承自基对象rt_object的定时器对象rt_timer、内存池对象rt_mempool、线程对象rt_thread,下面要介绍线程间的同步与通信,线程间同步对象rt_sem / rt_mutex / rt_event和线程间通信对象rt_mb / rt_mq都直接继承自rt_ipc_objec...
2019-09-21 21:55:03
2345
原创 IOT-OS之RT-Thread(五)--- 线程调度器与线程对象管理
之前的博客UCOS任务调度器与UCOS任务间通信介绍了多任务并行机制、任务调度原理、任务间同步、任务间通信等的实现原理,本文主要从RT-Thread与UCOS的对比与差异看RT-Thread线程管理与线程间同步/通信的实现。一、线程对象管理RT-Thread 线程管理的主要功能是对线程进行管理和调度,系统中总共存在两类线程,分别是系统线程和用户线程,系统线程是由 RT-Thread 内核创建的...
2019-09-21 12:06:41
2415
原创 IOT-OS之RT-Thread(四)--- 时钟管理与内存管理
操作系统要想协调好各线程的调度管理,离不开时间与空间的管理:时间管理主要靠时钟节拍systick实现,时钟节拍是特定的周期性中断,这个中断可以看做是系统心跳(心跳频率一般设为10-1000HZ,时钟节拍率越快,系统额外开销越大),供系统处理所有和时间有关的事件,如线程的延时、线程的时间片轮转调度以及定时器超时等;空间管理主要是对可用存储空间的管理,一般MCU的存储空间可分为片内RAM与片内FLAS...
2019-09-17 23:55:26
1596
原创 IOT-OS之RT-Thread(三)--- C语言对象化与内核对象管理
一、RT-thread内核对象模型RT-Thread的内核对象模型是一种非常有趣的面向对象实现方式。由于C语言更为面向系统底层,操作系统核心通常都是采用C语言和汇编语言混合编写而成。C语言作为一门高级计算机编程语言,一般被认为是一种面向过程的编程语言:程序员按照特定的方式把要处理事物的过程一级级分解成一个个子过程。面向对象源于人类对世界的认知多偏向于类别模式,根据世界中不同物品的特性分门别类的组织在一起抽象并归纳,形成各个类别的自有属性。
2019-09-14 14:37:15
2901
4
原创 IOT-OS之RT-Thread(二)--- CPU架构与BSP移植过程
一、RT-Thread内核简介将RT-Thread内核移植到某款芯片或板卡上,可以分为两大部分:CPU芯片移植和板级支持包BSP移植。RT-Thread为了能更方便的在不同CPU架构和不同板卡上移植,分别抽象出libcpu抽象层和BSP设备驱动层,两个抽象层向上对内核提供统一的调用接口,向下分别提供一套CPU架构和BSP移植接口,方便用户将RT-Thread移植到多数CPU架构和板卡上,降低了移植难度和工作量。
2019-09-13 00:48:48
4855
1
原创 IOT-OS之RT-Thread(一)--- 系统启动与初始化过程
一、RT-Thread简介1.1 IOT-OS简介之前已经介绍过RTOS(Real Time Operating System)的原理并分析过UCOS的源码(系列博客链接:https://github.com/StreamAI/UCOS_STM32),这里介绍的IOT-OS(Internet of Things Operating System)跟RTOS有什么区别呢?简单讲,传统RTOS只...
2019-09-10 00:40:41
7332
原创 STM32之CubeL4(二)---USART + DMA + HAL
一、UART简介1.1 串口通信简介一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种,它们的区别是:通信方式并行通信串行通信传输原理数据各个位同时传输数据按位顺序传输优点传输速度快占用引脚资源少缺点占用引脚资源多传输速度相对较慢在集成电路芯片的内部、同一硬件板上各部件之间等(比如指令总线、数据总线、系统总线等)的数据传送通常采用...
2019-09-06 01:17:24
5691
6
原创 STM32之CubeL4(一)---HAL详解与CubeMX使用(GPIO + EXIT示例)
一、HAL库与STD库对比之前使用STM32系列芯片都是基于STD(Standard Peripheral Libraries)标准外设库,标准外设库将相关寄存器以结构体的形式组织起来,使用库函数操作外设有点轻度面向对象编程的感觉,比寄存器操作方便不少。但在不同芯片上使用标准外设库开发的程序可移植性比较差,换个芯片常需要重新做大量的开发工作,为了解决这个问题,ST推出了全新的HAL(Hardwa...
2019-08-30 01:03:49
14243
4
原创 TCP/IP协议栈之LwIP(十)---Socket API编程
一、BSD Socket简介BSD Socket最初是由加州伯克利大学为Unix系统开发出来的,因此也被称为伯克利套接字(Internet Berkeley Sockets),它是一种采用C语言进程间通信库的应用程序接口(API),经常用在计算机网络间的通信,大多数其他的编程语言也都使用类似的接口。BSD Socket作为一种API,允许不同主机或者同一个计算机上的不同进程之间的通信,它支持多...
2019-08-15 21:38:59
13744
4
原创 TCP/IP协议栈之LwIP(九)---Sequetia API编程
一、Sequetia API实现原理LwIP协议栈针对上述特点提供了Sequetia API,它的出发点是上层已经预知了协议栈内核的部分结构,API可以使用这种预知来避免数据拷贝的出现,Sequetia API与BSD Socket具有很大的相似性,但工作在更低的层次(Sequetia API操作的是一个网络连接,BSD Socket像操作普通文件那样来操作一个网络连接,充分贯彻linux一切皆文件的理念),用户进程可以直接操作内核进程中的数据包数据。
2019-08-10 09:34:51
3820
原创 TCP/IP协议栈之LwIP(七)---内核定时事件管理
一、协议栈定时结构管理网络协议要想实现高效的通信,离不开对定时事件的管理,比如ARP协议中的缓存表项定时、IP协议中的分片数据重组定时、TCP协议中的快定时与慢定时,它们都是协议栈功能实现的基本保障。LwIP设计时保证了与操作系统或底层硬件间的独立性,它自身并不维护硬件定时器,更不会对硬件定时器进行管理,那LwIP怎样实现上述定时机制呢?1.1 定时结构描述LwIP中的定时完全是基于软件方式...
2019-08-04 13:44:04
4234
3
原创 TCP/IP协议栈之LwIP(六)---网络传输管理之TCP协议
一、TCP协议简介在传输层协议中,UDP是一种没有复杂控制,提供面向无连接通信服务的一种协议,它将部分控制转移给应用程序去处理,自己却只提供作为传输层协议的最基本功能。与UDP不同,TCP则是对传输、发送、通信等进行控制的协议。TCP(Transmission Control Protocol)与UDP(User Datagram Protocol)的区别相当大,它充分实现了数据传输时各种控制...
2019-07-31 08:58:27
3698
1
原创 TCP/IP协议栈之LwIP(八)---Raw/Callbck API编程
一、UDP RAW编程控制块操作函数构成了UDP编程的核心,用户程序使用UDP传输数据的关键在于使用内核提供控制块操作函数注册、管理控制块,同时最重要的是编写用户自定义报文处理函数。使用UDP编程,基本就是调用控制块操作函数对UDP控制块进行操作,UDP相关的函数比较简单,它没有流量控制机制、没有确认机制,它完成的简单工作就是根据接收到的报文查找UDP控制块,然后调用注册的用户函数处理报文数据...
2019-07-31 00:50:44
5516
1
原创 TCP/IP协议栈之LwIP(五)---网络传输管理之UDP协议
一、传输层简介TCP/IP协议栈为了区分一台计算机上运行的多个程序,引入了端口号的概念,由于端口号是用来识别同一台计算机中进行通信的不同应用程序,它也被称为程序地址。再回想下TCP/IP协议栈的分层模型,数据链路层有MAC地址用来识别同一链路中不同的计算机,网络层有IP地址用来识别网络中互连的主机或路由器,这里引入的程序地址(即端口号Port)是在传输层用来识别本机中正在进行通信的应用程序,并准确的进行数据传输。例如提供www服务的HTTP程序端口号为80,提供文件传输服务的FTP程序端口号为21
2019-07-27 00:13:41
2710
ATK-ENC28J60以太网模块资料.rar
2020-03-25
ATK-ESP8266 WIFI模块资料.rar
2020-03-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅