自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(251)
  • 资源 (11)
  • 收藏
  • 关注

原创 java基础 --- 浅谈Java SE、Java EE、Java ME三者的区别

从C/C++转到Java,老是看到Java SE,Java EE,Java ME这几个名词,今天简单总结下这三者的区别。Java SE(Java Platform,Standard Edition),这个是标准版本Java EE (Java Platform,Enterprise Edition),java 的企业版本Java ME(Java Platform,Micro Edition),java的微型版本。1. Java SE(Java Platform,Standard Editio.

2021-05-10 21:22:08 2

原创 硬盘容量和宽带的计算

简单的小科普1. 硬盘容量是怎么算的(为什么厂家标明500G的移动硬盘在电脑上显示却只有465G)原因在于厂家和操作系统的计算方式不一样厂家: 1GB=1000MB=1 000 000KB=1 000 000 000B操作系统:1GB=1024MB=1024 * 1024KB=1024 * 1024 * 1024B据此换算一下:500G=500 000 000 000B打开计算器500 000000 000 /(1024*1024*1024)= 465.661...

2021-05-10 14:36:03 3

原创 java基础 --- java概述

1. Java发展史略2. Java跨平台平台指的是操作系统,包括Windows、MAC、Linux,Java可以保证在任意平台上运行。Java程序并非是直接运行的,Java编译器将Java源程序编译成与平台无关的字节码文件(class文件),然后由Java虚 拟机(JVM)对字节码文件解释执行。所以在不同的操作系统下,只需安装不同的Java虚拟机即可实现java程序的 跨平台。 3. JRE和JDK3.1 JRE(Java Runtime Environment)JRE是j

2021-05-03 12:36:09 51 1

原创 正则表达式(一) --- 理论

1. 正则表达式的概念正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符".

2021-04-29 21:55:29 4

转载 Linux网络编程 --- UDP广播特性

1. 广播的特点广播的 UDP 的特性之一,通过广播可以向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,每个广播消息都包含一个特殊的 IP 地址,这个 IP 中子网内主机标志部分的二进制全部为 1 (即点分十进制 IP 的最后一部分是 255)。点分十进制的 IP 地址每一部分是 1 字节,最大值为 255,比如:192.168.1.100前两部分 192.168 表示当前网络是局域网 第三部分 1 表示局域网中的某一个网段,最大值为 255 第四部分 100 用

2021-04-22 23:15:59 4

转载 Linux系统应用编程 --- 基于UDP的套接字通信

0. UDP通信特点udp 是一个面向无连接的,不安全的,报式传输层协议,udp 的通信过程默认也是阻塞的。UDP通信不需要建立连接 ,因此不需要进行 connect () 操作 UDP通信过程中,每次都需要指定数据接收端的IP和端口,和发快递差不多 UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息 UDP对接收到的数据报不回复确认信息,发送端不知道数据是否被正确接收,也不会重发数据。 如果发生了数据丢失,不存在丢一半的情况,如果丢当前这个数据包就全部丢失了1.

2021-04-22 23:15:34 5

转载 Linux网络编程 --- 服务器并发

1. 单线程/进程在 TCP 通信过程中,服务器端启动之后可以同时和多个客户端建立连接,并进行网络通信,但是在介绍 TCP 通信流程的时候,提供的服务器代码却不能完成这样的需求,先简单的看一下之前的服务器代码的处理思路,再来分析代码中的弊端:// server.c#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include &lt.

2021-04-22 22:11:15 7

转载 Linux网络编程 --- socket套接字基本概念

1. 网络相关的基本概念1.1 局域网和广域网局域网:局域网将一定区域内的各种计算机、外部设备和数据库连接起来形成计算机通信的私有网络。广域网:又称广域网、外网、公网。是连接不同地区局域网或城域网计算机通信的远程公共网络。1.2 IP(Internet Protocol)IP本质是一个整形数,用于表示计算机在网络中的地址。IP 协议版本有两个:IPv4 和 IPv6IPv4(Internet Protocol version4):使用一个 32 位的整形数描述一个 IP 地址,4

2021-04-22 21:27:13 12

转载 Linux系统应用编程 --- 多线程同步之信号量

1. 信号量函数信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作。信号量不一定是锁定某一个资源,而是流程上的概念,比如:有 A,B 两个线程,B 线程要等 A 线程完成某一任务以后再进行自己下面的步骤,这个任务并不一定是锁定某一资源,还可以是进行一些计算或者数据处理之类。信号量(信号灯)与互斥锁和条件变量的主要不同在于” 灯” 的概念,灯亮则意味着资源可用,灯灭则意味着不可用。信号量主要阻塞线程,不能完全保证线程安全,如果要保证线程安全,需要信

2021-04-18 16:27:46 19

转载 Linux系统应用编程 --- 多线程同步之条件变量

1.条件变量函数严格意义上来说,条件变量的主要作用不是处理线程同步,而是进行线程的阻塞。如果在多线程程序中只使用条件变量无法实现线程的同步,必须要配合互斥锁来使用。虽然条件变量和互斥锁都能阻塞线程,但是二者的效果是不一样的,二者的区别如下:1)假设有 A-Z 26 个线程,这 26 个线程共同访问同一把互斥锁,如果线程 A 加锁成功,那么其余 B-Z 线程访问互斥锁都阻塞,所有的线程只能顺序访问临界区2)条件变量只有在满足指定条件下才会阻塞线程,如果条件不满足,多个线程可以同时进入临界区,同时..

2021-04-18 16:18:00 5

转载 Linux系统应用编程 --- 多线程同步之读写锁【rwlock】

1. 读写锁函数1.1 读写锁概念介绍读写锁是互斥锁的升级版,在做读操作的时候可以提高程序的执行效率,如果所有的线程都是做读操作, 那么读是并行的,但是使用互斥锁,读操作也是串行的。读写锁是一把锁,锁的类型为 pthread_rwlock_t,有了类型之后就可以创建一把互斥锁了:pthread_rwlock_t rwlock;之所以称其为读写锁,是因为这把锁既可以锁定读操作,也可以锁定写操作。为了方便理解,可以大致认为在这把锁中记录了这些信息:锁的状态:锁定 / 打开 锁定的是什

2021-04-18 16:11:36 6

转载 Linux系统应用编程 --- 多线程同步之互斥锁【mutex】

1. 互斥锁函数互斥锁是线程同步最常用的一种方式,通过互斥锁可以锁定一个代码块,被锁定的这个代码块,所有的线程只能顺序执行 (不能并行处理),这样多线程访问共享资源数据混乱的问题就可以被解决了,需要付出的代价就是执行效率的降低,因为默认临界区多个线程是可以并行处理的,现在只能串行处理。在 Linux 中互斥锁的类型为 pthread_mutex_t,创建一个这种类型的变量就得到了一把互斥锁:pthread_mutex_t mutex;在创建的锁对象中保存了当前这把锁的状态信息:锁定还是打

2021-04-18 15:17:09 9

转载 Linux系统应用编程 --- 线程同步

转载链接:作者: 苏丙榅链接: https://subingwen.cn/linux/thread-sync/#1-2-%E5%90%8C%E6%AD%A5%E6%96%B9%E5%BC%8F为什么需要线程同步,笼统的说,有下面三个原因:1.共享资源,多个线程都可对共享资源操作2.线程操作共享资源的先后顺序不确定3.处理器对存储器的操作一般不是原子操作假设有 4 个线程 A、B、C、D,当前一个线程 A 对内存中的共享资源进行访问的时候,其他线程 B, C, D 都不可以对这块内存.

2021-04-18 15:04:37 11 1

原创 Linux系统应用编程 --- 线程原语

1. pthread_create#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);pthread_t *thread:传递一个pthread_t变量地址进来,用于保存新线程的tid(线程ID)const pthread_attr_t *attr:线程属性设置,如使用默

2021-04-18 13:31:41 10

原创 Linux系统应用编程 --- 线程基本概念

1. 线程的概念LWP: light wight process,轻量级进程,本质还是进程(在Linux环境下)进程:独立地址空间,拥有PCB线程:也有PCB,但没有独立的地址空间(共享)区别:在于是否共享地址空间Linux下:进程:最小的执行单位线程:最小分配资源单元,可看成是只有一个进程的线程2. Linux线程实现原理1、轻量级线程也有PCB,创建线程使用的底层函数和进程一样,都是clone2、从内核里看进程和线程...

2021-04-18 12:23:37 6

原创 Linux系统应用编程 --- 信号

0. Linux提供了那些信号?信号编号32之前的信号,称之为unix经典信号。信号编号32之后的信号,称之为实时信号,驱动编程常用1. 信号产生种类1.1 特殊终端按键Ctrl+CSIGINTCrtl+Z SIGTSTPCtrl+\SIGQUIT1. 2硬件异常1)除0操作2)访问非法内存1. 3 Kill函数或者kill指令#include ...

2021-04-18 00:47:54 14

原创 Linux系统应用编程---进程间通信(二)【内存共享映射mmap】

参考链接:https://blog.csdn.net/qq_44361695/article/details/99075993https://segmentfault.com/a/1190000014616732http://www.cppblog.com/jerryma/archive/2011/08/02/152279.html1. 内存共享映射的概念mmap的作用就是把磁盘文件的一部分直接映射到进程的内存中,那么进程就可以直接对该内存文件进行操作。mmap也设置了两种...

2021-04-17 23:58:11 7

原创 Linux系统应用编程---进程间通信(一)【管道pipe fifo】

0. 进程间通信(IPC inter process communication)的概念每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。1. 管道的工作原理2. pipe(有名管道)函数原型#include <u...

2021-04-15 23:13:40 5

原创 Linux系统应用编程 --- Linux下C进程内存布局

1. C进程下,内存是怎么布局的?C进程内存布局如下图

2021-04-15 22:06:30 6

原创 Linux系统应用编程 --- 进程原语(三)

wait & waitpdi1. 僵尸进程和孤儿进程的概念僵尸进程(1)子进程先于父进程结束。子进程结束后父进程此时并不一定立即就能帮子进程“收尸”,在这一段(子进程已经结束且父进程尚未帮其收尸)子进程就被称为僵尸进程。(2)子进程除 task_struct 和栈外其余内存空间皆已清理(3)父进程可以使用 wait 或 waitpid 以显式回收子进程的剩余待回收内存资源并且获取子进程退出状态。【父进程帮子进程收尸是要调用函数的】(4)父进程也可以不使用 wait 或者 wa

2021-04-14 23:34:26 24

原创 Linux系统应用编程 --- 进程原语(二)

exec函数1. exec函数作用用fork创建子进程后执行的是和父进程相同的程序,可以通过if判断pid的返回值让子进程执行不同的代码分支,这样设计程序不灵活。通过调用exec函数,用新程序将子进程的用户空间代码和数据替换,直接去执行新程序。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。2. execc族函数原型其实有六种以exec开头的函数,统称exec函数:#include <unistd.h> int execl(const char .

2021-04-14 22:56:36 6

原创 Linux系统应用编程 --- 进程原语(一)

进程原语一. fork函数1. 函数原型pid_t fork(void);子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。2. 以具体的程序讲解fork函数特点第一段代码#include <stdio.h>#include <sys/types.h>#include <unistd.h> int main(void){ //fork创建一个新进程 pid_t p1 = -1;

2021-04-13 23:32:18 7

原创 Linux系统应用编程 --- 虚拟地址空间的理解

操作系统会为每个进程分配0-3G的虚拟空间,3G-4G是留给内核空间的假设物理内存为2G,那个操作系统如何给每个进程分配内核空间和用户空间?1、为什么不同进程的内核空间可以共用?因为应用层是无法修改内核空间的内容的2、操作系统是怎么管理内存空间的?(1)虚拟内存映射表,按照page去管理内存的,1page = 4096bytes所以我们在malloc内存的时候,如果先malloc2000字节,在malloc 3000字节,就会分配两个page,造成内存浪费,所以应该按照409

2021-04-13 21:51:09 6

原创 Linux系统应用编程 --- ext2文件系统

参考链接:https://www.linuxidc.com/Linux/2019-08/159814.htmhttps://www.linuxidc.com/Linux/2019-08/159815.htm1. 文件系统的概念文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,.

2021-04-10 23:54:06 8

原创 Linux系统应用编程 --- 文件I/O实现输出重定向

实现输出重定向,当用C标准printf打印 时,打印到指定的output.log文件思路:1)printf默认输出到标注输出文件描述符指向的终端2)关闭标准输出文件描述符,那么新建文件的文件描述符就替代了标准输出文件描述符。#include <sys/stat.h>#include <sys/types.h>#include <fcntl.h>#include <unistd.h>#include <stdlib.h>#

2021-04-10 22:35:51 9

原创 Linux系统应用编程 --- 文件I/O

1. 文件描述符Linux系统将所有设备都当作文件来处理,而Linux用文件描述符来标识每个文件对象。文件描述符是一个非负整数,用于唯一标识计算机操作系统中打开的文件。 它描述了数据资源,以及如何访问该资源。下面这张图, 不同进程拥有自己独立的PCB,PCB是存放进程管理和控制信息数据的一个结构体,其中包含了管理文件的指针,每个进程都会默认打开三个文件,对应文件描述符为0,1,2.标准输入(standard input)的文件描述符是 0,标准输出(standard output)的文件

2021-04-08 22:50:27 9

原创 链表反转问题

方法一实现链表翻转最直接的方法就是:从链表的头部开始遍历每个结点,改变每个结点的指向,即将原本指向下一个结点的指针改为指向上一个结点。遍历原链表,将结点依次插入到新链表的头部。要完成这一步操作,我们需要新添加两个指针(分别命名为P和tmp):P 指针用于遍历链表,并将遍历到的结点插入到新链表中; tmp 指针永远指向指针 P 所在结点的下一个结点,充当原链表在每次移除头部结点后的新头指针;List * reverse(List * H){ if(H == NULL || H...

2021-03-27 13:44:02 19

原创 死锁的理解

一、死锁的概念死锁(英语:deadlock),又译为死结,计算机科学名词。当两个以上的运算单元,双方都在等待对方停止运行,以获取系统资源,但是没有一方提前退出时,就称为死锁。在多任务操作系统中,操作系统为了协调不同行程,能否获取系统资源时,为了让系统正常运作,必须要解决这个问题。另一种相似的情况称为“活锁”。(wiki)死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永.

2021-03-27 12:45:13 21

原创 【C语言】 --- 段错误

一、段错误的概念存储器区段错误(英语:Segmentation fault,经常被缩写为segfault),又译为存储器段错误,也称访问权限冲突(access violation),是一种程序错误。它会出现在当程序企图访问CPU无法寻址的存储器区段时。当错误发生时,硬件会通知操作系统产生了存储器访问权限冲突的状况。操作系统通常会产生核心转储(core dump)以方便程序员进行调试。通常该错误是由于调用一个地址,而该地址为空(NULL)所造成的,例如链表中调用一个未分配地址的空链表单元的元素。数组访

2021-03-26 23:45:59 32

原创 内存泄露和内存溢出

一、内存泄露的概念内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。(摘抄自百度百科)内存泄露是由于疏忽或者错误造成程序未能释放已经不再使用的内存。内存泄露并非值内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成内存的浪费。(摘抄自wiki)二、内存泄露的后果内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降

2021-03-26 23:39:00 24

转载 【C】 --- # 和 ## 作用于宏的理解

一、一般用法“#”用来把宏参数变为一个字符串“##”把两个宏参数贴合在一起#include <stdio.h>#include <iostream>using namespace std;#define STR(s) #s#define CONS(a, b) int(a##e##b)int main(void){ printf("%s\n", STR(abcdefg)); printf("%d\n", CONS(2, 3)); syste

2021-03-25 23:41:30 13

原创 怎么理解优先级翻转

使用信号量会导致的另一个潜在问题是线程优先级翻转问题。1. 优先级翻转的概念所谓优先级翻转,即当一个高优先级线程试图通过信号量机制访问共享资源时,如果该信号量已被一低优先级线程持有,而这个低优先级线程在运行过程中可能又被其它一些中等优先级的线程抢占,因此造成高优先级线程被许多具有较低优先级的线程阻塞,实时性难以得到保证。如下图所示:有优先级为 A、B 和 C 的三个线程,优先级 A> B > C。1)线程 A,B 处于挂起状态,等待某一事件触发,线程 C 正在运行,此时线程.

2021-03-23 22:10:04 14

原创 C --- 自定义一个宏打印当前文件名、函数名、行号

#include <stdio.h>#define MY_PRINT printf("%s, %s, %d\n", __FILE__, __FUNCTION__, __LINE__);int main(void){ MY_PRINT; return 0;}

2021-03-16 14:30:14 21

原创 for-if-break/do-while-break嵌套的问题

C语言一个小的知识点。for中嵌套if,if中包含break,当执行到break的时候,是跳出if还是跳出for循环?同样的do-while中包含if,if中包含break,当执行到break的时候,是跳出if还是跳出do-while循环先说答案,两种情况下都是跳出循环。上code,测试一下#include <stdio.h>int main(void){ int i = 0; for(i=0; i<5; i++) .

2021-02-26 13:24:04 58

转载 C回调函数

https://www.runoob.com/w3cnote/c-callback-function.html

2021-02-23 22:06:27 23

转载 快速理解ISP图像信号处理

原文链接:http://www.voycn.com/article/5fenzhonglijiexiangjiisptuxiangxinhaochuli引言凡是和图像领域工作的人,都会经常听到ISP(Image Signal Process,图像信号处理),知道ISP对图像质量非常重要。比如华为和小米竞争手机拍照和录像效果,主要的竞争领域就是ISP;做AI(Artificial Intelligence,人工智能)的人也知道,如果ISP不给力,后续的AI处理效果会受到影响。ISP在图像输入流中.

2021-01-11 23:40:47 566

转载 IIC clock strech【转载IIC七宗罪之IIC clock stretch】

由于前段时间工作上的事情比较杂乱, 导致第七罪姗姗来迟,既然是大结局,当然就应该让大家更加深刻的来理解I2C.。我们先来复习一下大家共有的对I2C的认知:1. I2C的SCL(Clock)总是由Master来驱动;2. I2C的SDA (Data)则不同,Master和Slave分别都驱动。这两点想必读者都没有什么疑问,因为前面的六宗罪都已经说得比较多了,我们今天要说的是另外一种特殊情况,就是Slave也会去Drive。先来看一个例子,我的一个项目发生过这样一件事情,CPU在访问板子上的另外

2020-11-10 23:02:16 280

原创 vs2018 设置了包含路径还是提示说打不开头文件

这个问题,主要还是对编译和调试工具不熟悉导致的 。编译工具选择和设置的不同导致即使设置了包含路径,依然提示找不到。项目 - 属性 - CV++目录 注意上方的平台是否选错,设置后再设置包含路径选择的编译平台是 下图这个:设置属性包含的路径要设置一致的平台,如下图:...

2020-11-10 22:54:13 109

转载 raw GRB YUV数据格式

RawRGB图像采集的过程为:光照在成像物体被反射 -> 镜头汇聚 -> Sensor光电转换-> ADC转换为rawRGB。因为sensor上每个像素只采集特定颜色的光的强度,因此sensor每个像素只能为R或G或B,形成的数据就成为了rawRGB数据。rawRGB数据是sensor的经过光电转换后通过ADC采样后直接输出数据,是未经处理过的数据,表示sensor接受到的各种光的强度。对于不同的sensor,在其内部形成的rawRGB数据格式也是有区别的。rawRGB数据

2020-11-02 21:08:50 277

原创 嵌入式Linux开发环境搭建之七---正确设置网络使开发板ping同Ubuntu(使用NAT方式,推荐)

背景: 我们配置网络是为了方便后续调试开发板系统或者应用程序时使用 tftp 协议 nfs 协议等拷贝文件或者设置文件系统启动方式为 nfs 挂载启动。 以前我们在 VMware 中使用桥接,这需要保证 Windows、 Ubuntu、开发板三者互通,而很多人的电脑有多个网卡,这涉及的网络设置太复杂了。 现在我们使用 NAT 方式,这样会简单很多。硬件连接形式Ubuntu端的操作1. 开启虚拟机,设置NAT模式2. 设置ANT...

2020-10-04 16:23:04 310

大彩串口屏-正点原子STM32DEMO

广州大彩屏,STM32程序,用正点原子的例程移植的,他们自带的例程是Keil4的,改了很多地方。

2018-06-21

LD3320语音模块STM32

硬件基于正点原子F1开发板,控制LD3320模块,用于语音控制,程序只是给出了控制LED示范。

2018-10-04

STM驱动有刷电机源码

STM32驱动25GA370电机,PWM驱动,可以直接改引脚去用到自己的项目

2018-10-04

根文件系统

参考朱有鹏老师嵌入式视屏课程,自己制作的根文件,跟视屏里面一样的操作

2018-09-25

STM32 L298N代码

STM32控制L298N驱动电机,通过按键实现控制,是调节PWM脉宽以及正反转

2018-10-04

C语言中如何使用全局变量示例

C语言中如何使用全局变量简单示例,多文件.c中如何使用全局变量

2018-11-20

CanFestival3.10源码

从CanFestival官网下载的最新的源码,可以自己移植到工控机或者单片机

2002-10-11

F1正点原子开发板移植CanOpen源码

硬件是正点原子开发板,移植CanFestival源码,可以直接发CAN报文,亲测可用

2002-10-13

龙邱SYN7318非特定语音识别模块程序

SYN7318语音模块,代码已经移植到正点原子F1开发板,只需要简单的实验下,就可以移植到自己的项目

2018-10-28

PCB封装库---经过很多次画板检验

常见的各种接口封装包括DB9、USB内存等等、芯片封装(常见的sTM32、DSP、以及常见电源芯片)、元器件封装(0603、SOT23等等)

2018-09-27

GNU_Makecn.rar

GNU_make ,用makefile管理工程的时候,很好的参考文档,比一起学makefile更具体

2019-08-14

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除