自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(117)
  • 资源 (7)
  • 收藏
  • 关注

原创 《嵌入式工程师自我修养》学习路线指南

2020-03-10 18:19:47 1703

原创 你为什么看不懂Linux内核驱动源码?

学习嵌入式Linux驱动开发,最核心的技能就是能够编写Linux内核驱动、深入理解Linux内核。而做到这一步的基础,就是你要看得懂Linux内核源码,了解其基本的框架和具体实现,了解其内核API的使用方法,然后才能根据自己的需求写出高质量的内核驱动程序。说易行难,很多新人、甚至工作1-2年的开发者刚接触Linux内核时,别说写了,看内核代码可能都是一脸懵逼:明明是C语言,但是就是看不懂是什么...

2018-04-28 14:34:05 6018

原创 linux内核编程13期:内存管理

从零开始,一步一步掌握Linux内存管理子系统框架

2022-11-17 08:05:11 694 1

原创 Linux内核编程12期:设备树overlay与ConfigFS文件系统

在嵌入式Linux下,设备树(device tree)用来描述硬件平台的各种资源,Linux内核在启动过程中,会解析设备树,获取各种硬件资源来初始化硬件。设备树的overlay功能是指可以在系统运行期间动态修改设备树。一般情况下,如上图所示,设备树经过DTC编译器编译为二进制的hello.dtb文件,加载到内存,随Linux内核一起启动后,一般就无法更改了。如果我们想修改设备树,需要修改hello.dts文件文件,重新编译成二进制文件:hello.dtb,然后重新启动内核,重新解析.

2022-05-17 17:11:36 2090

原创 Linux内核编程11期:设备树(device tree)

设备树(device tree)机制是Linux内核从linux-3.x版本开始引进的一种机制,目的是解决内核源码的arch/arm目录下代码混乱的问题:随着ARM生态的快速发展,在内核源码的arch/arm目录下,存放着几十种arm芯片和几百个开发板相关的源文件,很多开发板和处理器的中断、寄存器等相关硬件资源都在这个目录下以.c或.h的文件格式定义。而对于内核来说,与这些硬件耦合,会导致内核代码混乱不堪,每个开发板上运行的内核镜像都必须单独编译配置,无法通用。什么时候Linux内核能像Windows镜像那

2022-04-28 19:10:53 1840

原创 Linux内核编程10期:platform设备驱动

platform是Linux内核中的一种虚拟总线,在嵌入式ARM平台下用来管理设备资源和驱动。对于从事嵌入式Linux驱动开发者来说,platform是一个必须具备的基本技能,因为内核中大部分驱动都是使用platform模型封装的,设备驱动一般都会挂到platform总线上,统一进行资源管理。本期课程是一个编程实战课,主要分享platform总线型驱动的编程方法,包括总线驱动的match方法、设备资源resource的管理、驱动复用id_table、设备资源的自动释放等常用的机制。除此之外,更重要的

2022-02-16 15:25:03 317

原创 Linux内核编程09期:设备模型和sysfs文件系统

设备模型是Linux内核中一个非常重要的概念,很多复杂的驱动(比如platform、USB、I2C),都是以设备模型为基础进行构建的。如果你在阅读驱动源码时感觉很吃力,感觉太复杂,错综复杂,无法真正理解其全景框架和底层的运行逻辑,这里真诚地建议你可以尝试从设备模型学起:设备模型以最核心的kobject和kset数据结构构建了设备树的基本骨架,又通过device、bus、driver、class进一步封装,构建了设备模型的基本能力:总线匹配、电源管理、热插拔机制...本期课程从设备模型最核心的kobjec

2022-02-16 15:23:49 565

原创 Linux内核编程08期:debugfs文件系统

嵌入式Linux内核驱动的常规开发步骤,一般是这样的:看芯片手册,修改寄存器或驱动源码 重新编译内核镜像,或驱动模块 将编译好的镜像拷贝到SD卡 将SD卡镜像插到开发板 重启内核,或者重新加载驱动 测试驱动是否正常工作 如果驱动无法工作,返回第一步循环从编译、运行到调试,一圈走下来,通常需要10~15分钟,也就是说,哪怕你只修改了一行代码,也要把这个流程再走一遍,在宿主机的交叉开发效率,相比PC开发,效率会低很多。如果公司配套的有高端的调试器,比如TRACE32,可以通过仿真、单步

2022-02-16 15:19:54 653 1

原创 Linux内核编程07期:proc文件系统

打开一个Linux shell终端,进入/proc目录,你会发现该目录下有很多文件和子目录:root@ubuntu:/proc# ls1 1239 1944 218 231 260 293 7 920 locks10 124 1949 2181 2316 261 294 770 93 mdstat100 1241 1952 219 232 262 295 771 933 meminfo101 125

2022-02-16 10:09:17 538

原创 Linux内核编程06期:文件系统

Linux内核的哲学是:一切皆文件。无论是普通的磁盘文件、还是鼠标、键盘、显示器、SD卡,网卡,都可以使用文件模型进行封装,通过标准的系统调用:open、close、read、write来访问。本期课程录制背景在嵌入式项目开发中,很多人可以很快解决工程上的问题:通过busybox制作根文件系统、格式化和挂载一个磁盘、设置root/init等启动参数去挂载不同的根文件系统,通过read/write去读写文件,但对于底层文件系统的细节可能就不是很清楚了,比如:busybox到底是个什么东西?

2022-02-16 10:07:27 754

原创 Linux内核编程05期:字符设备驱动

字符驱动算是Linux驱动中比较简单的一种了,本期课程以上一期的课程为基础,在学员掌握了中断编程的基础上,以实时时钟RTC为例,在vexpress ARM开发板上,从零开始,一步一步学习编写第一个字符设备驱动。实现了RTC字符设备驱动的基本功能:字符设备的创建、注册、设备号申请 字符设备的中断处理 file_operation接口的填充 读取RTC实时时间 设置RTC时间 设置RTC闹钟为了更方便用户开发应用程序,在完成字符设备驱动功能的基础上,并对RTC驱动的ioctl接口进.

2022-02-16 10:03:26 434

原创 Linux内核编程04期:驱动中断编程实战

在Linux内核驱动开发中,中断是不可缺少的重要一环。CPU在和外部设备通信,绝大部分是通过中断完成的。本期课程,为《Linux内核编程》第四期,将会带领大家从中断的基础概念开始,以RTC为例,一步一步编写裸机环境下的中断程序,学习中断处理流程,理解GIC中断控制器的内部逻辑和在中断处理过程中发挥的作用。熟悉的底层的基本硬件之后,接下来会带领大家在Linux环境下,使用Linux内核提供的编程接口,来完成RTC驱动的中断程序的编写、调试和运行。最后,在中断下半部中,分别使用软中断、t

2022-02-14 12:58:59 674

原创 Linux内核编程03期:系统调用

高端的程序员往往采用最朴素的编程方式。能不能复用别人的代码,避免重复造轮子,是衡量程序员工作效率、是否能按时下班的关键。我们编写一个add()函数,只要封装得好,就可以给很多人使用,这样就可以减少他人重复劳动,避免重复造轮子。// add.c int add(int a, int b){ return a + b;}//add.hint add(int a, int b);其他的开发者,需要调用add()时,只要在自己的程序中使用#include包含对应的头文件add.h,就

2022-02-14 12:54:04 919

原创 Linux内核编程02:Kbuild子系统

Kbuild 即kernel build,是用来编译Linux内核的一套Makefile。Kbuild基于GNU make设计,但是又对Makefile进行了各种扩充: 基于图形界面的菜单式配置 各种预定义目标和变量:menuconfig、obj-y 提供各种跨平台工具和编译 递归式Makefile Linux内核可以灵活自由的高度裁剪和定制,其底层技术支撑除了模块机制之外,还有一项技术就是:可以使用Kbuild编译系统来方便地进行裁剪、配置、编译和安装。内核中的..

2022-01-29 09:42:22 1834

原创 Linux内核编程01:模块机制

模块机制是Linux内核非常重要的一个功能,如果从C语言的模块化编程角度来看,Linux内核其实就是由大大小小、层次不同的模块构成的。有的模块比较小,一个C源文件就实现了;有的模块比较复杂,由多个源文件构成。Linux内核的发展史,其实也是内部各个模块的发展史,一个小小的模块,从单一的功能、单一的源文件,慢慢成长发育,成长为多个文件的模块,甚至逐渐迭代成框架、子系统...模块机制给Linux宏内核增加了更多的灵活性:一个内核模块,不需要重新编译内核,就可以在内核运行时动态加载运行,或者动态卸载结束运

2022-01-29 09:38:41 1380

原创 如何快速构建嵌入式全栈知识体系

嵌入式是一门交叉学科。一个嵌入式电子产品(比如手机)从底层到上层,一般会涉及半导体芯片、电子电路、计算机、操作系统、多媒体等不同专业领域的知识。很多从事嵌入式开发的朋友,通常来自不同的专业(电子、电气、计算机、机械、自动化、物理,甚至一些文科专业),在实际学习和开发中,由于专业背景的限制,经常会遇到各种技术壁垒:搞硬件的不懂软件,搞软件的不懂硬件,搞底层芯片的不懂上层软件,搞上层软件的不懂底层芯片。嵌入式技术栈太深,除了极少数人,一般人很难实现“技术破圈”,将整个技术栈从上到下捋一遍,彻底打通。相对于桌

2021-04-27 08:16:40 3800 11

原创 【新书出版】《嵌入式C语言自我修养》预售正在进行中...

几年前,专门为嵌入式工程师打造的C语言进阶视频教程:C语言嵌入式Linux高级编程,收到了几千名学员的中肯建议和好评。如今,纸质书籍也要出版啦!书籍名为:《嵌入式C语言自我修养:从芯片、编译器到操作系统》,在原版视频教程的基础上,又增加了新的干货:新增了芯片设计流程、芯片制造、封装等技术、CPU内部架构与工作原理、异构计算、GPU、NPU等新知识。从底层芯片到编译器,从编译器到操作系统,从操作系统到进程、线程、协程,意在帮大家构建一个更加完整的嵌入式全栈知识体系。独家GNU C 扩展语法精讲

2021-04-23 00:20:40 2613 13

原创 Ubuntu-20.04+qemu-5.1.0,Linux内核学习平台:小宅实验室发布了

大约4年前,宅学部落录制了互联网上第一家qemu教程使用qemu搭建嵌入式U-boot+Linux+NFS学习环境4年过去了,积累了众多学员也积累了不少反馈和问题比如网络配置桥接脚本、网络服务、IP配置对于新手来说总要折腾一段时间才能配置正确、正常使用为了减少学习困扰一款更傻瓜、更好用的qemu平台重新发布了不需要配置,下载后即可使用无论是联网,还是断网还是拷贝到不同的电脑上开机即可使用,方便快捷按照说明文档编译U-boot、kernel源码.

2020-10-25 09:39:03 1384

原创 VMware重新安装VMware tools一直显示灰色怎么办?

解决方法:关闭VMware虚拟机,点击“编辑虚拟机设置”,将光驱和软盘都设置为:使用物理驱动器:自动检测重启虚拟机,此时就会看到重装VMware tools不再是灰色,重新安装即可。

2020-10-16 10:13:07 4145 1

原创 编译qemu-5.1.0,出现编译错误:ERROR: glib-2.48 gthread-2.0 is required to compile QEMU

ERROR: glib-2.48 gthread-2.0 is required to compile QEMU解决方法:apt-get install build-essential zlib1g-dev pkg-config libglib2.0-dev binutils-dev libboost-all-dev autoconf libtool libssl-dev libpixman-1-dev libpython-dev python-pip python-capstone virt

2020-10-12 16:11:06 11486 9

原创 编译Linux内核出现错误:make vexpress_defconfig & menuconfig

在编译Linux内核时出现错误:wit@ubuntu:/home/linux-5.4.14# make vexpress_defconfig LEX scripts/kconfig/lexer.lex.c/bin/sh: 1: flex: not foundmake[1]: *** [scripts/Makefile.host:9: scripts/kconfig/lexer.lex.c] Error 127make: *** [Makefile:568: vexpress_defco...

2020-07-15 10:17:53 1783 1

原创 跟涛哥一起学习嵌入式 33:《嵌入式C语言自我修养》书稿V1.0版

经常有网友要我推荐一些关于嵌入式方面的书,尤其是一些转行学嵌入式的朋友,该看那些书能快速构建嵌入式学习所需要的知识体系呢?嵌入式是一门交叉学科,没有足够的知识储备,上来就学习的话,往往也就成了走过场,跟着操作走一遍,深入不下去,学不到精髓。有没有一本书,专门针对嵌入式学员设计,嵌入式开发所需要的所有理论知识和常用的技能点都涉及到,都刚刚好,不会讲太深,讲太偏,也不会泛泛而谈,都是工程结合理论,在实际嵌入式开发中都用得到的知识。学员读了这本书,能快速构建嵌入式开发所需要的全套知识体系,学员遇到问题,能快速

2020-07-07 21:18:04 3555 1

原创 跟涛哥一起学习嵌入式 32:Linux内核编译和启动分析

在Linux环境下,我们想运行一个应用程序,在shell交互环境下直接敲命令就可以了,操作系统给程序提供了运行环境和进程管理。那Linux操作系统本身是如何运行和启动的呢?在分析之前,我们先做一个Linux内核启动的实验:通过u-boot加载Linux内核镜像uImage到内存不同地址,观察Linux内核启动流程。实验环境:硬件平台:使用 QEMU 仿真ARM vexpress A9 开发板 RAM大小配置:512 MB RAM内存地址:0x60000000 ~ 0x7FFFFFFF实验过程:

2020-05-15 17:46:56 729

原创 跟涛哥一起学嵌入式 31:深入浅出CPU流水线工作原理

现在的CPU处理器一般都是超流水线工作,动不动就是10级以上流水线,超高主频,这两者之间有什么关系呢?今天就跟大家科普下CPU流水线的工作原理,以及他们之间的关系。说到流水线,很多人会想到富士康;说到富士康,很多人会想到张全蛋。作为富士康 3 号流水线资深质检员,下面就请张全蛋给大家科普下什么是流水线,大家鼓掌欢迎。Micheal Jack 眼中的流水线大家好,我是张全蛋,英文名叫Micheal Jack,法文名叫霍雷呆-杰Q赖,大家也可以叫我查理。作为iPhone 手机 3 号流水线的资.

2020-05-15 17:44:40 3939

原创 跟涛哥一起学嵌入式 30:C语言枚举类型深入剖析

枚举(enum)是C语言的一种特殊类型。当我们在编程中遇到定义一些固定长度或范围的数值时,可以考虑使用枚举类型。使用枚举可以让我们的程序可读性更强、看起来更加直观。举个例子,如果我们在编程中需要使用数字0~6分别表示星期日~星期六,程序的可读性就不高,我们需要翻手册或者看程序注释才能知道每个数字具体代表什么意思。如果我们使用枚举呢,基本上不需要看注释或手册就可知晓其大意。enum week ...

2020-03-06 15:30:55 1121

原创 跟涛哥一起学嵌入式 29:为什么很多人编程喜欢用 typedef?

1. typedef 的基本使用1.1 typedef与结构体的结合使用typedef 是 C 语言的一个关键字,用来给某个类型起个别名,也就是给C语言中已经存在的一个类型起一个新名字。大家在阅读代码的过程中,会经常见到 typedef 与结构体、联合体、枚举、函数指针声明结合使用。比如下面结构体类型的声明和使用:struct student{ char name[2...

2020-03-04 20:19:03 480

原创 跟涛哥一起学嵌入式 20:一段C语言代码编译、运行全过程解析

很多嵌入式初学者,不明白一个简单的C语言程序,是如何通过一步步编译、运行变成一个可运行的可执行文件的,程序到底是如何运行的?运行的过程中需要什么环境支持?今天就跟大家一起捋一捋这个流程,搞清程序编译、链接、加载、运行的整个脉络,以及在运行过程中的内存布局、堆栈变化。1. 程序的编译、链接过程就以hello.c为例:从一个C语言源文件,到生成最后的可执行文件,基本流程如下;C 源文...

2020-01-18 16:39:22 971

原创 跟涛哥一起学嵌入式10:关于校招,应届生都应该看一看

金九银十,是应届生求职的黄金时期。每年这个时候,各大企业、名企一般都会到校园去做各种宣讲、面试招聘。对于大部分应届生来说,通过校园招聘渠道,找到一份靠谱工作的概率远远胜过社会招聘。然而很多应届生却对校招的重视度不够、准备不充分,结果跟一些好的工作机会错失交臂。尤其是一些福利待遇、发展空间较好的大公司、名企,错过校招这个机会,以后再想从社招其他渠道应聘,难度往往会大很多。校招对应届生为什么如此...

2020-01-18 15:20:51 683

原创 设计一款CPU到底有多难?

文章结构导读 一颗芯片是怎么诞生的? 一款CPU是如何设计出来的? 设计一款CPU到底难在哪里?导读这几天,刷遍朋友圈的新闻就是:中兴被“一剑封喉”,被美国停止一切芯片进口和系统软件服务。这对于芯片依赖美国的中兴来说,基本上一下子就处于休克状态,上下游的生产线面临停产,8万员工前途未卜。中兴事件给IT/IC届带来的冲击,甚至给普通百姓带来的冲击相当大,以至于各个自媒体、公众...

2020-01-18 15:15:38 1851

原创 跟涛哥一起学嵌入式 28:Linux下的时间管理和定时器编程

时间是我们生活中非常重要的一个概念,我们的生活处处离不开时间:你跟朋友定在晚上7点去吃火锅;你老板让你半个小时后去他办公室;还有一周就要放假过年了...。在现代社会中,没有时间的度量,我们的生活将寸步难行。除非你去终南山隐居,去过日出而作,日落而息的生活。计算机中处处需要时间在计算机系统中,也是处处需要时间,离开时间寸步难行:你的电影播放时间、系统日志log、QQ 微信聊天记录、电脑每周一...

2020-01-18 15:09:06 395

原创 跟涛哥一起学嵌入式 27:一个小故事,让你明白进程、线程和协程的区别

进程、线程和协程,是多任务编程中的常用术语。很多初学者分不清它们之间的区别,今天就以一个小故事为引子,让大家搞清楚他们之间的本质区别。话说在西凉女儿国,大唐文化传播有限公司CEO唐僧招聘了三个员工做游戏直播,他们分别是:孙悟空、猪八戒和沙僧。唐僧分别给他们租了三套一室一厅的房子,独门独户,他们三个每人各住一套,独享各自的卫生间和厨房,互不干扰。这有点类似于进程,在Linux环境下,每个进程有...

2020-01-18 15:08:09 490

原创 跟涛哥一起学嵌入式 26:深入浅出计算机编码、乱码问题

很多新手在编写程序、使用软件打开文档或者浏览网页时,经常遇到乱码显示、全角半角的问题。网上也有很多解决的方法,大部分都是跟编码有关:比如Unicode、UTF-8、ASCII码、GB2312...,令人眼花缭乱,今天就给大家理一理它们之间的关系。计算机只认识0和1这两个数字,我们输入的程序代码、文字都要经过编码,然后才能被计算机识别、解析和存储。早期的计算机环境是主要是英文,我们...

2020-01-18 15:07:11 358

原创 将博客搬至CSDN

将博客搬至CSDN,from知乎

2020-01-17 21:58:41 167

原创 跟涛哥一起学嵌入式 25:我接触过近50块嵌入式开发板,分享一下教训和总结...

最近老是有学员问我:涛哥,你的嵌入式教程针对哪款开发板鸭?到底使用哪款开发板学习?我的回答往往是:暂时不用开发板,学习嵌入式,不一定非得用开发板,在qemu仿真平台上学习就可以了。3年前我发布了互联网上第一套《使用QEMU搭建嵌入式U-boot+Linux+NFS学习环境》的视频教程(现已部分免费分享到B站),三年来累积了大量学员,也收到了很多积极反馈和建议,现在也吸引了同行去基于...

2019-12-27 03:24:05 1052 2

原创 跟涛哥一起学嵌入式 24:使用qemu搭建U-boot+Linux+NFS嵌入式Linux学习环境

视频教程免费分享啦: 使用qemu在Ubuntu上仿真一块ARM开发板,然后在上面移植u-boot、Linux,挂载NFS文件系统,想研究嵌入式u-boot、Linux内核,又没有开发板,或者不想每次搭建开发板环境的同学,可以直接使用仿真环境就可以了,非常方便。 视频教程在B站: 1.为什么要使用QEMU学习嵌入式开发_带片头_哔哩哔哩 (゜-゜)つロ 干杯...

2019-12-10 10:24:51 554 1

原创 《C标准库函数新编手册》开源项目上手指南

作为一个新手,这个文档将会介绍如何参与到这个项目中(以gitee代码托管网站为例) 第0步:环境准备 Linux环境,可以使用VMware虚拟机跑Ubuntu 在Windows或Linux下已经安装Git工具 熟练使用Git、vim、Markdown、Linux基本命令 参加开源活动的同学通过赠送的激活码学习《Lin...

2019-11-23 10:31:32 240

原创 跟涛哥一起学嵌入式 23:参加开源项目,免费获取《Linux三剑客》教程

项目背景 很多学员,尤其是在校学生,很多人都想通过一些项目锻炼自己的,以提高自己的编程技能,为未来的就业增加筹码。其实只要用心,项目无处不在,只是对于很多学生来说,没有经历过一次完整项目流程的历练,没有经验,无法入门。为了帮大家体验一下开源项目流程,特发起 2 个小小的开源项目,旨在帮助大家学会使用开源工具去发起和参与一个开源项目,打开开源世界的大门。每个项目限招10人,具...

2019-11-20 15:37:29 373

原创 跟涛哥一起学嵌入式 22:理性下的选择:就业还是考研?

2个多月前的第一次网友分享课(9月23日),由于视频质量问题,以及谈及的问题不太适合网上发布,这一期视频就不发布了,PPT截图分享给大家。 ...

2019-11-17 15:21:12 306

原创 跟涛哥一起学嵌入式 19:从零实现一个shell解释器

shell初体验在Linux环境下工作,我们经常去打开一个Terminal终端,然后在终端下敲入shell命令和运行,如:在终端下运行ls命令我们也可以编写一个简单的脚本文件并运行它shell脚本的编辑、修改权限和运行爱好思考的同学可能就会有疑问了:为什么我们在终端下敲入命令,就可以直接运行? 为什么我们在终端下可以直接运行一个脚本? 这个脚本是如何运行的? ...

2019-11-06 17:07:43 520

原创 C语言库函数新编手册

C标准库函数大全 新编API手册

2019-11-02 15:08:05 267

公众号文章专栏:跟涛哥一起学嵌入式.rar

关于嵌入式、C语言、Linux相关的干货文章集锦。分享关于嵌入式、C语言、内核驱动开发、求职面试、行业分享等最近几年的公众号文章精华版

2020-04-25

跟涛哥一起学嵌入式 23:零基础扫盲什么是人工智能.pdf

该篇文档是人工智能科普文档,给新手科普人工智能的基本概念:什么是人工智能?AI和大数据、云计算、物联网的关系;什么是机器学习?大脑的学习原理;人工神经网络;神经网络的训练过程;什么是深度学习?什么是边缘计算?索菲亚骗局;未来的人工智能是什么样的?

2020-03-09

跟涛哥一起学嵌入式30:C语言枚举类型深入剖析.pdf

C语言枚举类型深入讲解,超详细:enum经常使用的三种方法;枚举的本质;枚举和宏定义的对比分析;Linux内核中的枚举类型及使用技巧分析;使用枚举需要注意的一些细节,在这篇文档中都会详细讲解。

2020-03-08

跟涛哥一起学嵌入式 29:为什么很多人编程喜欢用typedef?.pdf

C语言typedef定义类型精讲(超详细),typedef的常用使用方法:与结构体、数组、指针、函数指针、枚举的结合使用;使用typedef的优势:不仅可以让代码更加简洁,还可以增加代码的可移植性。使用typedef需要注意的一些细节,都会详细讲解。

2020-03-08

Git零基础实战视频教程

Git零基础入门实战视频教程,Git在实际开发中的常用技能零基础讲解

2019-01-26

git零基础实战

零基础学习git,值得收藏的一份文档

2016-05-29

空空如也

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

TA关注的人

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