- 博客(51)
- 收藏
- 关注
原创 嵌入式Linux驱动框架的理解——板级驱动层的抽象
本文介绍了基于Linux内核的LED驱动开发框架,采用分层设计思想实现硬件操作与驱动逻辑的解耦。整个系统分为四个层次:1) 接口层(led_opr.h)定义LED操作的标准函数指针结构体;2) 板级驱动层实现具体硬件寄存器操作;3) 通用驱动层通过file_operations对接应用层系统调用;4) 应用层提供用户控制接口。核心创新点是通过函数指针结构体实现硬件操作的抽象化,使驱动代码无需关心底层硬件差异,只需调用统一接口。
2025-12-17 09:18:14
661
原创 嵌入式Linux初探索——点灯背后的驱动层与应用层及其交互
本文介绍了基于Linux内核的LED设备驱动开发,包含驱动层和应用层实现。驱动层通过字符设备框架注册设备操作函数,使用ioremap映射GPIO寄存器地址,实现LED开关控制。应用层通过open/write系统调用与驱动交互,传递on/off指令。关键点在于用户态与内核态的数据交互,通过copy_from_user安全拷贝数据,并操作GPIO寄存器控制硬件。整个流程展示了从应用层命令解析、系统调用到驱动层硬件操作的全链路实现,体现了Linux设备驱动的典型开发模式。
2025-12-12 15:32:27
1246
原创 我的嵌入式权限踩坑实录
嵌入式Linux开发中权限问题频发,本文总结常见"坑点"及解决方案。核心问题包括:noexec分区导致程序无法执行、设备文件权限不足、传输后权限丢失等。文章从Linux权限机制出发,提出全流程避坑指南:1)编译阶段采用静态链接;2)传输后及时添加执行权限;3)设备文件手动开放666权限;4)执行时使用sudo提权;5)调试时通过ls、mount等命令快速定位。针对嵌入式系统精简特性,特别强调设备文件权限处理与noexec分区的应对策略,提供从源码到运行的完整权限管理方案。
2025-12-12 10:05:42
991
原创 嵌入式 Linux 字符设备驱动编写:从原理到实战
本文详细介绍了嵌入式Linux字符设备驱动的开发流程,通过一个完整的hello字符设备驱动案例,解析了驱动开发的核心步骤和关键知识点。主要内容包括:驱动层实现设备注册、文件操作接口定义和自动创建设备节点;应用层通过标准文件IO接口验证驱动功能。重点阐述了file_operations结构体的作用、内核与应用层的数据交互机制(copy_to/from_user)、驱动入口/出口函数实现,以及自动创建设备节点的方法。
2025-12-10 11:41:10
1221
原创 16×16 点阵汉字 LCD 显示程序解析
该程序基于Linux帧缓冲驱动,实现16×16汉字和8×16英文字符在LCD屏幕上的显示。通过直接操作帧缓冲内存完成像素绘制,结合HZK16汉字库解析字形。程序包含五大模块:基础变量、像素绘制、字符显示、汉字显示和主函数。关键技术包括:1)帧缓冲内存映射实现像素级控制;2)HZK16字库的GB2312编码解析;3)16×16汉字点阵数据定位与绘制。程序执行流程为:初始化帧缓冲→加载字库→清屏→显示字符→释放资源。其中汉字显示需通过区码/位码计算点阵位置,与ASCII字符相比具有更复杂的编码解析和绘制逻辑。
2025-12-09 16:54:28
698
原创 嵌入式Linux—点阵字符显示原理与代码实现(从困惑到通透)
本文解析了8x16点阵字符显示的两层坐标逻辑:屏幕全局坐标(x,y)和字符内部局部坐标(i,b)。详细说明了点阵数据的二进制映射原理,每个字符由16字节数据组成,每位对应一个像素点。提供了完整的字符显示函数实现,包括核心函数lcd_put_ascii、像素绘制函数lcd_put_pixel和字库数据定义。重点强调了坐标转换关系、字库匹配、坐标越界检查和颜色格式适配等关键注意事项。该方案可直接应用于嵌入式LCD显示开发,实现高效的点阵字符渲染。
2025-12-09 16:49:56
990
原创 STM32F的 PLL 锁相环对「分频 / 倍频系数组合」有严格的硬件约束
摘要:STM32F407在使用USB HID键盘功能时,若PLL锁相环配置不当会导致枚举失败。关键原因在于PLL对分频/倍频系数组合有严格硬件约束,即便数学计算得到48MHz,若PLL输入频率低于1MHz或PLLVCO频率超出192-432MHz范围,都会导致时钟失稳。USB模块对时钟精度要求极高(±0.25%),不满足约束时会出现频率漂移或抖动,使主机拒绝枚举。正确配置需确保PLL参数符合手册要求,才能保证USB时钟稳定工作。
2025-12-05 09:11:03
937
原创 嵌入式Linux学习——Framebuffer 应用编程详解(理论知识)
本文详细介绍了Linux系统中Framebuffer(帧缓冲)的编程原理与应用。Framebuffer将显示设备抽象为可直接读写的内存区域,通过标准文件接口操作显存实现图形显示。文章从核心概念、编程流程、关键操作到实战案例,系统讲解了Framebuffer的五大编程步骤:打开设备→获取参数→映射显存→操作像素→关闭资源。重点包括像素格式解析、显存地址计算、RGB颜色处理等核心内容,并提供了完整的可运行示例代码,涵盖填充全屏、绘制像素和直线等基础操作。该教程特别适合初学者快速掌握Linux底层图形显示原理,通
2025-12-01 15:24:45
711
原创 嵌入式Linux学习——dup函数的使用
摘要:dup/dup2是Unix/Linux系统中用于复制文件描述符的系统调用,使多个描述符指向同一文件表项并共享偏移量和状态。dup自动分配新描述符,而dup2可指定目标描述符。主要用途包括重定向标准I/O(如将printf输出重定向到文件)和管道通信(父子进程间数据传输)。典型应用场景如:通过dup2(fd,1)将标准输出重定向到指定文件,或使用pipe+dup2实现进程间通信。dup2比dup更常用,因其能直接指定目标描述符,避免手动关闭和分配步骤。
2025-11-29 14:30:01
822
原创 嵌入式Linux学习——从一个CSV处理程序深入理解嵌入式Linux文件I/O与字符串操作
该程序实现了一个CSV文件处理工具,主要功能是读取学生成绩数据并计算总分和评级。程序采用Linux系统调用进行文件操作,使用read_line()函数逐行读取输入文件,process_data()函数处理数据(包括解析姓名、各科成绩,计算总分和评级),最后将结果写入输出文件。关键点包括:1)使用sscanf/sprintf进行字符串解析和格式化;2)基于文件描述符的低级I/O操作;3)UTF-8文件头处理。程序体现了嵌入式开发中常见的底层文件处理技术,适合处理结构化数据文件。
2025-11-28 15:46:58
791
原创 嵌入式Linux学习—文件IO
本文对比分析了Linux系统中的open()和fopen()两个文件操作接口。open()是POSIX系统调用,直接返回文件描述符,无缓冲机制,适用于底层开发;fopen()是C标准库函数,返回文件指针并自带缓冲,适合普通文件操作。文章详细说明了二者的函数原型、参数用法及典型示例,并指出open()支持更多底层特性,而fopen()提供更友好的高级接口。最后解释了open()创建文件时的权限计算规则(mode & ~umask),并通过示例展示了最终权限的形成过程。
2025-11-28 15:35:02
802
原创 嵌入式Linux学习——gcc编译程序的整个过程
GCC编译流程详解:GCC将C程序编译为可执行文件需经历预处理、编译、汇编和链接四个阶段。预处理阶段处理宏定义和头文件,生成.i文件;编译阶段将预处理代码转为汇编代码.s文件;汇编阶段将汇编代码转为机器码.o文件;最后链接阶段合并目标文件和库文件生成可执行文件。开发者可通过gcc命令分步执行各阶段,也可直接使用gcc source.c -o output一键完成编译。理解完整编译流程有助于程序调试和性能优化。
2025-11-21 13:13:34
560
原创 嵌入式Linux学习——fork函数
嵌入式Linux中fork()函数通过复制父进程创建子进程,采用写时复制优化内存使用。子进程继承父进程资源但拥有独立PID,适用于多任务并发场景(如设备控制与日志记录)。使用时需注意资源限制、僵尸进程处理、实时性要求及文件描述符冲突。典型用法是父进程运行主逻辑,子进程执行辅助任务。编译需使用交叉编译器,适用于需要任务隔离或独立执行的嵌入式应用场景。
2025-11-18 14:32:02
274
原创 嵌入式Linux学习——环境变量与配置文件的关系(⭐难理解)
Shell环境变量与配置文件的关系涉及多个维度,包括配置文件详解、执行顺序、作用范围及启动方式影响。主要配置文件如/etc/profile(系统级)、~/.bash_profile(用户登录式)和~/.bashrc(非登录交互式)分别在不同场景下加载环境变量。登录式Shell按顺序加载/etc/profile、~/.bash_profile等,而非登录式则加载/etc/bash.bashrc和~/.bashrc。环境变量分系统级、用户级和临时生效三种作用范围。
2025-11-11 15:57:32
664
原创 嵌入式Linux——Shell脚本编程
摘要:Shell脚本是一种通过编写命令集合实现自动化任务的技术,广泛应用于系统管理和批量处理。本文介绍了Shell脚本的基础概念、基本结构与运行方式,详细讲解了变量、输入输出、条件判断、循环结构、函数等核心语法,并以文件备份脚本为例进行实战演示。文章还总结了执行权限、变量引用、条件判断等常见问题及解决方法,为Shell脚本编程提供入门指南。
2025-11-11 13:36:15
866
原创 嵌入式Linux学习——Shell
在嵌入式 Linux 中,Shell 是 **“瑞士军刀” 般的工具 **:既是用户与系统交互的入口,也是自动化任务的载体,更是调试和管理资源受限设备的核心手段。其轻量级实现与嵌入式场景高度适配,通过简单的命令和脚本,即可高效完成硬件控制、系统配置、问题排查等关键工作。
2025-11-10 17:22:44
578
原创 嵌入式Linux学习——文件目录
摘要:嵌入式Linux的文件目录结构遵循FHS标准,但会根据硬件资源进行精简定制。核心目录包括存放命令的/bin、/sbin,配置文件/etc,动态库/lib,以及虚拟文件系统/proc、/sys。嵌入式系统中常移除/home、/boot等非必要目录,优化存储空间。BusyBox工具将常用命令集成到单个可执行文件,显著缩小系统体积。开发时需合理配置交叉编译工具链,并利用/proc、/sys进行系统监控调试。
2025-11-10 16:18:24
889
原创 STM32串口发送时使用奇偶校验学习感悟——Even(偶校验)
本文介绍了串口通信中数据校验奇校验的实现方法,并详细说明了每种校验方式的工作原理。通过STM32CubeMX配置9位数据格式(8位数据+1位校验位),实现了包含偶校验的串口通信方案。文章展示了核心代码实现,包括USART初始化、DMA配置以及中断处理逻辑,重点说明了如何在数据接收时处理校验错误并实现数据回显功能。该方案能有效检测传输过程中的数据错误,提高通信可靠性。
2025-11-07 17:57:38
1032
原创 一文看懂常用的串口标准——RS232、RS422(待完善)、RS485
摘要:RS232、RS422和RS485是三种串行通信标准,主要区别体现在电气特性、传输方式、拓扑结构和应用场景上。RS232采用单端传输,适合短距离点对点通信;RS422和RS485采用差分信号传输,抗干扰能力强,适合长距离通信。其中RS422支持全双工,RS485支持半双工和多设备组网,是工业场景首选。实际应用中,通过电平转换芯片(如SP3232)可实现TTL与RS232/RS485的转换,满足不同设备的通信需求。
2025-11-07 16:16:19
886
原创 FATFS文件系统——中文名及长文件名支持
FATFS支持长文件名及中文命名的关键配置步骤:1.修改ffconf.h开启FF_USE_LFN(1/2/3)并设置FF_MAX_LFN长度;2.配置FF_CODE_PAGE选择适当编码(中文GBK需设为936);3.添加对应编码转换文件(中文需cc936.c替代默认ccsbcs.c)。注意工程中不能同时存在多个编码转换文件,且需确保系统编码与配置一致(如GBK)。这些配置可支持255字符长度的中文文件名,但会略微增加代码体积。
2025-11-03 14:36:30
674
原创 FATFS 文件系统学习2——移植的常规流程指南
FATFS文件系统移植指南:1. 准备阶段需下载源码包(ff.c、ff.h等)并明确硬件存储介质类型;2. 核心配置需修改ff.h文件,包括数据类型适配、功能特性选择及字符编码设置;3. 关键步骤是实现diskio.c中的5个底层函数(初始化、状态检查、读写操作等);4. 可选实现时间戳和内存分配函数;5. 最后通过挂载、格式化、文件操作等基础功能进行测试验证。移植重点在于正确配置系统参数和完整实现底层驱动接口。
2025-11-03 11:43:24
959
原创 一文看懂SPI通讯协议 附W25Q128实战代码(为FATFS文件系统移植做准备)
本文介绍了HAL库中SPI接口的使用方法。SPI是一种高速全双工同步串行通信接口,具有主从模式、四线连接等特点。文章详细解析了SPI的通信协议,包括四种工作模式(CPOL/CPHA组合)、数据采样时序等核心概念。通过STM32CubeMX和HAL库简化了SPI配置过程,使原本复杂的底层操作只需几行代码即可完成。教程以STM32F407ZGT6芯片为例,展示了如何创建SPI例程并移植读写程序,重点讲解了硬件SPI的配置和使用方法。
2025-11-03 11:13:36
1128
2
原创 为什么在开发时我们很少考虑堆和栈的溢出?
摘要:在STM32开发中,堆和栈溢出是常见隐患。栈用于存储局部变量和函数调用,从高地址向低地址增长;堆用于动态内存分配,从低地址向高地址增长。简单程序通常不会溢出,主要得益于默认配置充足、编程习惯间接规避以及程序规模较小。但对于复杂场景,必须采取预防措施:通过静态估算和动态检测监控内存使用,优化编程习惯(如避免大局部变量、减少动态分配),必要时调整堆栈大小。建议采用栈底标记法和内存跟踪等监控手段,并预留安全余量以确保系统稳定运行。
2025-10-30 15:21:12
856
原创 Git的学习之路——迈向高效的版本管理之路
本文摘要:Git快速入门指南聚焦3个关键点:核心概念(工作区/暂存区/本地库/远程库)、高频命令(init/add/commit/push等10个)和实战演练。重点解析暂存区机制,演示文件添加、版本回退和修改撤销等核心操作,强调通过「概念理解+场景练习」掌握Git,而非死记命令。特别提醒配置用户信息,并区分不同撤销场景(工作区/暂存区/已提交)的操作方法。附廖雪峰Git教程参考链接。
2025-10-30 09:55:24
1592
原创 通过 UART 串口打印格式化字符串(灵活进行printf函数封装)
改进点原因优点✅一次性发送整个字符串原代码逐字符调用提高效率,避免频繁中断✅增加长度检测与截断保护可能溢出缓冲区安全性更高✅参数类型更规范防止误改格式字符串更符合 C 规范✅通用函数支持任意 UART通过传入更灵活✅可保留快速封装兼容旧调用方式(易迁移。
2025-10-29 20:53:32
876
原创 SPI NOR Flash 家族的常见存储结构
SPI NOR 是一种非易失性存储器SPI 接口和NOR 存储类型,两者结合决定了它的通信方式和存储特性。页(Page):最小写入单位,通常为 256 字节、512 字节或 1024 字节(主流 256 字节)。写入数据时必须按整页或页内连续地址操作(不能跨页写入单字节)。扇区(Sector):最小擦除单位,通常由多个页组成(如 16 页 = 4KB,32 页 = 8KB)。擦除操作必须按整扇区执行(不能擦除单个页或字节)。块(Block)
2025-10-28 17:30:20
968
原创 STM32——使用定时器+按键中断来实现长按事件检测触发
该程序实现"长按3秒触发LED状态翻转"功能,核心流程为:1)按键按下时启动3秒定时器;2)定时期间若松开则终止计时;3)定时结束时若按键仍按下,则调用Key_ExitEvent翻转LED状态(通过flag变量切换GPIO输出);4)最终停止定时器。程序采用"外部中断+定时器二次校验"机制,确保只有持续3秒的长按才会触发操作,中途松开会取消动作。
2025-10-26 19:29:39
591
原创 STM32F103C8T6学习——直接存储器访问(DMA)HAL库实战(DMA串口接收与回显 (DMA-RX))(对比学习)
HAL 库通过 “句柄 + API 封装” 隐藏了大量与硬件相关的细节操作(如寄存器配置、状态管理、错误处理),开发者只需调用高层函数即可实现功能。而标准库需要显式编写每一步硬件操作,虽然灵活性更高,但代码更冗长且容易因遗漏细节(如标志位清除)导致 bug。任何一个 HAL API 都可能包含多步底层操作,其内部逻辑可通过查看源码(如)深入了解,这也是解决 HAL 库兼容性问题的核心方法。因为你每次都用重新启动接收,所以 Normal 和 Circular 都能用;
2025-10-15 10:10:52
824
原创 FATFS文件系统学习(1)——初识文件系统
FATFS是一个轻量级开源文件系统,专为嵌入式系统设计,采用标准C编写,支持FAT12/16/32格式。其核心创新是"簇"机制——将多个扇区合并管理,通过FAT表记录簇链而非单个扇区,大幅降低存储开销和查找时间(用空间碎片换取管理效率)。典型配置中,每簇包含2^n个扇区(512B-32KB),簇号从2开始编号。源码采用模块化设计,核心层(ff.c/h)必需,介质层(diskio.c)需适配硬件,其余功能插件可选。最小系统仅需5个文件即可实现基本功能,具有高度可裁剪性。
2025-10-13 09:51:51
654
2
原创 嵌入式开发基础知识补充—内存的种类和C语言变量的存储位置(非易失性存储和易失性存储)
这篇文章通过“开公司”的比喻,生动解释了MCU中Flash和SRAM的区别与联系: 硬件基础 Flash(仓库):非易失性存储,存放程序代码和常量数据,容量大但读写慢,适合长期存储。 SRAM(办公室):易失性存储,存放变量和运行时数据,速度快但容量小,适合频繁读写。 C语言映射 SRAM分为.data(已初始化变量)、.bss(未初始化变量)、堆(动态内存)和栈(函数局部变量)。
2025-10-10 22:16:17
1063
原创 微信小程序中 index.js文件
摘要:微信小程序的index.js是页面逻辑控制核心,通过Page()构造器管理数据、生命周期、交互事件和网络请求。它负责数据绑定(需用setData()更新)、处理页面生命周期钩子(如onLoad/onShow)、响应用户操作(按钮点击/输入等)、发起网络请求(wx.request)及调用微信API(如弹窗/跳转)。与同目录下的wxml(结构)、wxss(样式)、json(配置)共同构成完整页面,其中与wxml通过数据绑定实现动态渲染。
2025-10-04 19:52:47
581
原创 FreeRTOS—任务优先级和改善任务状态
FreeRTOS任务调度机制摘要: 优先级管理:0~(MAX-1),数值越大优先级越高,最高优先级任务优先执行。支持两种优先级查找方法,通用方法无限制但效率低,优化方法限32个优先级。 调度规则: 高优先级任务抢占执行 同优先级任务时间片轮转(默认1ms) 切换触发条件包括时间片耗尽、任务阻塞或主动让出CPU 任务状态: 运行态:正在执行 就绪态:准备就绪等待调度 阻塞态:等待事件(时间/同步) 暂停态:通过API手动挂起 优先级修改:提供uxTaskPriorityGet/vTaskPrioritySet
2025-09-27 14:41:58
810
原创 Vivado SDK 中 XScuGic(ARM Cortex-A9 SCU GIC 中断控制器)相关函数
摘要:本文介绍了Xilinx中断控制器(XScuGic)的关键API函数,包括初始化配置(XScuGic_CfgInitialize)、中断连接管理(Connect/Disconnect)、中断使能控制(Enable/Disable)、软件触发中断(SoftwareIntr)、优先级与触发类型设置(SetPriorityTriggerType)、多核中断映射(InterruptMaptoCpu等)以及CPU核心ID管理(SetCpuID/GetCpuID)。
2025-09-12 15:27:56
1307
原创 if-else 基本的条件判断结构剖析
本文总结了编程中if-else结构的常见用法与注意事项。从最基础的单分支if语句,到双分支if-else结构,再到多分支if-else if-else应用,详细说明了每种结构的语法特点和使用场景。特别强调了else就近匹配的原则,并通过示例代码演示了如何正确判断进入哪个else分支。文章还介绍了嵌套if-else的使用方法,指出大括号的重要性,并提醒避免嵌套过深。最后总结了if-else结构的关键规则:else就近匹配、多分支执行顺序、嵌套结构范围以及大括号的使用建议。
2025-09-11 14:36:45
355
原创 Xilinx GPIO 驱动库中相关函数的汇总解释
本文介绍了Xilinx GPIO驱动库的核心功能函数,包括初始化配置、方向控制、输出使能、数据读写和中断处理等。重点函数有:XGpioPs_LookupConfig()用于获取设备配置信息;XGpioPs_SetDirectionPin()和XGpioPs_SetOutputEnablePin()用于引脚配置;XGpioPs_WritePin()和XGpioPs_ReadPin()实现电平控制;XGpioPs_SetIntrTypePin()和XGpioPs_IntrEnablePin()处理中断功能。
2025-09-11 14:04:59
755
原创 FPGA—硬件电路一旦上电配置完成,各个功能模块会并行地持续工作
本文介绍了一个基于Verilog的LED闪烁控制模块,通过28位计数器实现0.25秒间隔的4位LED循环移位效果。该设计展示了FPGA的硬件并行特性,包括时钟驱动的时序逻辑、组合逻辑的即时响应以及状态机的工作机制。与软件程序不同,FPGA模块通过硬件并行处理实现持续运行,无需CPU顺序执行指令。文中详细解释了计数器逻辑、LED控制逻辑的实现原理,以及复位信号、时钟信号的处理方式,体现了FPGA设计中硬件描述语言与软件编程的本质差异。
2025-09-04 10:43:51
856
原创 兴趣爱好——虾哥开源小智AI机器人搭建(丐版—最低成本)ESP32开发板 MicroPython V1.0.0 Rev1
本文介绍了ESP32在VSCode+ESP-IDF环境下的丐版搭建教程,重点解决烧录成功后无现象的常见问题。主要原因是ESP32处于下载模式而非运行模式,表现为rst:0x1和boot:0x7的启动状态。提供了三种解决方案:硬件复位操作、检查GPIO0连接状态以及强制退出下载模式。特别提醒初学者在前期测试阶段不要过早引出GPIO0作为唤醒开关,建议先确保OLED正常显示后再进行相关操作。文中还提供了源码版本信息(1.5.6)和硬件连接参考。
2025-08-18 19:44:56
1016
原创 STM32F103C8T6学习——直接存储器访问(DMA)标准库实战3(ADC数据采集+DMA回传)
本文介绍了一个基于STM32F103C8T6微控制器的双通道模拟信号采集系统。系统采用ADC1(光敏和红外传感器输入)、DMA1(双通道数据自动传输)和USART1(串口通信)等外设,构建了高效的数据采集流水线。通过DMA实现ADC数据自动搬运至内存数组,CPU仅需定期格式化数据并通过DMA发送至上位机,显著降低了CPU占用率。重点阐述了ADC连续扫描模式配置、DMA循环传输机制及volatile关键字的使用,展示了硬件并行工作的嵌入式系统设计思想。该系统实现了2Hz的数据采集频率,具有高实时性和低功耗特点
2025-08-15 15:08:35
1827
原创 STM32F103C8T6学习——直接存储器访问(DMA)标准库实战2(DMA串口接收与回显服务器 (DMA-RX))
本项目基于STM32F103C8T6微控制器与标准外设库(SPL),成功实现了一个高性能、高健壮性的DMA串口回显服务器。该系统巧妙运用DMA循环模式接收数据,并结合串口的IDLE线路空闲中断来精确判断不定长数据帧的结束,极大降低了CPU开销。项目的关键和精髓在于中断服务函数中对DMA通道的精细化状态管理。通过在每次任务循环后,手动重置DMA接收通道的数据计数器、并清除DMA发送通道的“传输完成”标志位,我们最终解决了因硬件状态残留导致的“仅首次成功”和“数据错乱”等典型“坑点”。
2025-08-14 19:26:40
743
STM32F103C8T6学习-直接存储器访问(DMA)HAL库实战(DMA串口接收与回显 (DMA-RX))(对比学习)
2025-10-15
STM32F103C8T6学习-直接存储器访问(DMA)标准库实战3(ADC数据采集+DMA回传)
2025-08-15
STM32F103C8T6学习-直接存储器访问(DMA)标准库实战2(DMA串口接收与回显服务器 (DMA-RX))
2025-08-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅