Xenomai RTOS 编程与实践
文章平均质量分 90
Xenomai 3 + Dovetail
三问Linux社区
分享过往数年服务器和Linux相关工作经验,关注当下热点技术,紧着未来发展趋势。
欢迎关注 “三问Linux社区” 公众号,探讨技术,共同进步!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
《Xenomai RTOS 编程与实践》目录
《Xenomai RTOS 编程与实践》目录原创 2025-12-07 20:02:19 · 148 阅读 · 0 评论
-
9.4贡献自己的第一个patch
介绍如何为Xenomai项目贡献第一个patch。首先需要寻找合适的修改机会,如修复编译警告、规范代码格式或认领社区bug。提交代码时需遵循Linux内核编码规范,使用git commit -s -m -e命令生成包含详细描述的提交信息。然后通过git format-patch -1生成patch文件,该文件含代码变更、提交信息和签名。最后建议使用内核的checkpatch.pl工具检查patch是否符合规范后再提交。整个过程详细说明从发现问题到生成合规patch的完整流程,为新手贡献者提供了清晰的操作指南原创 2026-03-20 10:52:23 · 589 阅读 · 0 评论 -
9.3工欲善其事必先利其器
本文介绍了开发者常用工具的配置方法。在VSCode中设置80字符自动换行和垂直标尺,通过修改settings.json文件实现代码格式规范。Git配置部分详细说明了用户名、邮箱、编辑器等基本设置,以及SMTP邮件发送配置,包括加密方式、服务器地址和端口设置。最后简要提及了Vim编辑器的配置,作为Git默认编辑器服务于代码编写和社区参与任务。这些配置旨在提高开发效率和规范化工作流程。原创 2026-03-20 10:32:10 · 484 阅读 · 0 评论 -
9.2向社区寻求帮助
摘要: Xenomai社区求助指南指出,寻求帮助应通过邮件列表而非私人邮件。提交求助请求时需提供详细系统配置(处理器架构、内核版本、Xenomai版本等),简洁描述问题并附上错误代码。建议先搜索邮件列表存档寻找类似解决方案。关键是要提供可复现问题的自包含测试用例,这将显著提高问题解决优先级。配置信息可通过xeno-config --info获取,内核日志需包含早期引导信息。遵循这些准则能获得更高效的社区支持。原创 2026-03-19 10:22:52 · 395 阅读 · 0 评论 -
9.1订阅社区邮件与互动
摘要:本文介绍了Linux内核开发者如何订阅Xenomai社区邮件列表并进行互动。主要内容包括:1) 推荐使用网易163邮箱注册并开启IMAP/SMTP服务,获取授权码用于第三方客户端;2) 通过Subspace邮件列表服务器订阅Xenomai社区邮件,详细说明了订阅和退订流程;3) 介绍了Neomutt邮件客户端的优势,特别适合开发者参与社区讨论和补丁审核。文章强调使用纯文本格式邮件的重要性,并提供了完整的配置指导,帮助开发者高效参与开源社区协作。原创 2026-03-19 10:11:10 · 2855 阅读 · 0 评论 -
8.6内存分配与竞争
本文探讨了实时系统中内存分配与竞争对任务性能的影响。首先分析了Page Fault的两种主要类型(未映射内存和页面换出)及其优化策略,包括预分配内存和禁用swap。其次讨论了内存页面大小对TLB命中率的影响,比较了4KB小页与2MB/1GB大页的性能差异,并详细介绍了Linux系统中显式大页的配置方法。最后提出了针对实时系统的优化建议,如静态内存分配、预加载内存和使用大页技术,以减少内存访问延迟,确保实时任务的确定性执行。原创 2026-03-18 11:00:28 · 584 阅读 · 0 评论 -
8.5CPU隔离与亲和性
本文介绍了在SMP系统中实现CPU隔离与绑定的关键技术。通过内核参数isolcpus隔离指定CPU核心,配合managed_irq避免托管中断处理,使用irqaffinity控制非托管中断分配。同时采用nohz_full关闭时钟中断,通过rcu_nocbs将RCU回调任务移出隔离CPU,确保实时任务独占CPU资源。这些措施有效减少了上下文切换和缓存失效带来的延迟,为实时任务提供了稳定的执行环境。文中详细说明了各参数的配置方法和作用原理,并给出了ARM64虚拟机中的具体配置示例。原创 2026-03-18 10:51:38 · 881 阅读 · 0 评论 -
8.4通过延迟补偿来提高实时性
Xenomai 3通过延迟补偿机制提高实时性,其核心是提前设置定时器触发时间以抵消系统固有延迟。该系统定义了irq、kernel、user三个独立的重力值,分别补偿不同执行上下文的延迟。重力值可在编译时设置默认值,也可通过/proc文件系统动态调整,还支持自动调优功能。合理设置重力值能显著改善实时性能,但过度补偿可能导致负延迟。该机制有效解决了从定时器触发到实际执行之间的硬件和软件延迟问题。原创 2026-03-17 11:29:36 · 441 阅读 · 0 评论 -
8.3负载生成工具
本文介绍了负载生成工具在实时系统测试中的应用,重点分析了Xenomai测试套件中的dohell工具和hackbench工具。dohell能够模拟多种高负载场景(包括CPU、内存、磁盘I/O和网络负载),通过命令行参数灵活配置测试条件,并支持与LTP测试套件集成。hackbench则专注于调度器压力测试,通过创建大量通信实体来评估系统调度性能。文章详细说明了两个工具的参数配置和使用方法,强调了在实时性测试中使用统一负载参数的重要性,为系统稳定性评估提供了有效手段。原创 2026-03-17 11:22:40 · 446 阅读 · 0 评论 -
8.2延迟测量工具cyclictest详解
cyclictest是Linux系统中用于测试内核实时性能的重要工具,通过创建高优先级实时线程周期性睡眠并记录唤醒时间偏差来测量延迟。文章详细介绍了cyclictest的工作原理、参数分类(包括基本选项、Timer/时间选项、输出显示选项和Tracing调试选项)以及常用命令示例。特别说明Xenomai基于Alchemy skin重新实现的版本可用于比较Xenomai与Linux系统的实时性能。文章还提供了直方图生成方法,帮助分析延迟分布情况。该工具对评估系统实时性具有重要意义,参数配置灵活,可满足不同测试原创 2026-03-12 12:08:01 · 630 阅读 · 0 评论 -
8.1延迟测量工具latency详解
Xenomai的latency工具用于测量系统定时器延迟性能,提供三种测试模式:用户任务、内核任务和定时器中断模式。默认情况下,它创建1000微秒周期的采样线程,输出包含最小/平均/最大延迟等统计信息。工具支持多种选项调整采样参数、打印输出和直方图显示,还能通过gnuplot可视化延迟分布。测试中若出现模式切换会给出警告,帮助用户评估系统实时性能。直方图功能可直观展示延迟分布情况,通过调整桶大小可获得更精细的测量结果。原创 2026-03-12 11:26:37 · 767 阅读 · 0 评论 -
7.7实时内核调试支持
摘要 本文介绍了Xenomai/Cobalt实时内核的调试支持功能,主要包括4个方面:1) Cobalt实时内核支持的断言系统,包括COBALT、CONTEXT和LOCKING子系统的各类断言;2) 用户态软件调试支持,如互斥锁持有检测和遗留特性使用警告;3) 用户/内核空间trap信息的打印机制;4) Spinlock调试支持功能,可统计CPU核心的锁竞争情况。这些调试功能通过menuconfig选项控制,有助于开发者诊断实时系统中的潜在问题,但部分功能会带来性能开销,不建议在生产环境中启用。原创 2026-03-11 10:13:59 · 616 阅读 · 0 评论 -
7.6如何定位导致relax的错误代码
摘要:Xenomai双内核架构中,实时任务从主模式切换到次模式(relax)会影响实时性。定位可疑relax行为需从三方面入手:1)内核空间开启TRACE_RELAX功能记录调用栈;2)libcobalt库自动处理SIGSHADOW信号;3)应用程序需设置XNWARN状态。通过/proc/xenomai/debug/relax获取调用栈后,可使用slackspot工具解码地址定位具体代码位置。该方法结合内核调试功能和用户空间工具,有效追踪导致实时性丢失的根本原因。原创 2026-03-11 10:08:18 · 525 阅读 · 0 评论 -
7.5堆内存管理与信息统计
本文介绍Cobalt实时内核的堆内存管理机制,重点分析了system heap、private heap和shared heap的功能与用途。system heap(默认4MB)是内核主堆,用于实时内存分配;private heap(默认256KB)存储各进程的IPC对象状态;shared heap(默认256KB)存放全局实时线程状态。文章详细阐述了各堆的初始化过程、内存分配方式及用户态访问机制,并指出通过/proc/xenomai/heap可监控堆内存使用情况。这些堆机制有效保障了实时系统的性能与稳定性原创 2026-03-10 11:25:05 · 426 阅读 · 0 评论 -
7.4时钟定时器与看门狗
本文介绍了Xenomai实时内核中的时钟定时器与看门狗机制。主要内容包括:1)通过/proc/xenomai/clock和/proc/xenomai/timer接口可查看时钟设备、定时器等信息;2)详细解析时钟底层硬件架构,包括clocksource和clockevent的作用;3)Gravity重力值机制用于补偿定时器延迟;4)看门狗机制监控实时任务占用CPU情况,防止Linux内核无法获得时间片。文章还介绍了相关配置参数和超时处理机制。原创 2026-03-10 11:19:28 · 583 阅读 · 1 评论 -
7.3实时任务状态与统计信息
Cobalt实时内核通过/proc/xenomai/sched目录提供实时任务监控功能,主要包含两个关键文件:/proc/xenomai/sched/stat显示任务状态统计信息,包括CPU使用率、模式切换次数(MSW)、上下文切换次数(CSW)等;/proc/xenomai/sched/threads展示任务调度详情,如优先级、调度类等。通过分析这些信息可以诊断实时任务是否意外进入次模式(XNRELAX状态)、CPU资源分配是否合理等问题。原创 2026-01-23 10:19:45 · 717 阅读 · 0 评论 -
7.2实时进程如何打印输出
摘要:Xenomai 3针对实时进程的打印输出需求,通过符号包装技术重写了标准I/O函数。核心设计包括:1)使用环形缓冲区暂存输出;2)实时线程无锁写入;3)非实时线程异步处理。系统提供rt_printf()专用接口,并支持通过--print-buffer-size等参数调节缓冲区大小和刷新周期,在保证实时性的同时实现可靠输出。这种机制避免了标准I/O的不确定延迟,满足硬实时系统的确定性要求。原创 2026-01-23 10:14:41 · 866 阅读 · 0 评论 -
6.5RTIPC之IDDP实例分析
Xenomai实时系统中的RTIPC IDDP协议实现,通过两个示例程序展示其核心特性: iddp-sendrecv.c演示无连接通信模式,使用端口号寻址,并独立申请32KB内存池进行数据传输; iddp-label.c采用标签化端口寻址("iddp-demo"),支持动态端口分配,默认使用系统内存池。两者均实现实时线程间的数据报通信,前者使用sendto/recvfrom,后者采用connect+write组合。程序运行结果显示内存池分配正确,消息传输正常,验证协议在实时通信中的有效性原创 2026-01-12 10:57:48 · 787 阅读 · 0 评论 -
6.6RTIPC之BUFP实例分析
本文分析了Xenomai实时系统中的BUFP通信协议,通过两个实例程序展示了其特性。BUFP是一种面向字节的流式缓存通信机制,支持缓冲区管理、数字端口号和端口标签化功能。在bufp-readwrite.c中,程序通过指定端口号实现类连接通信;而bufp-label.c则演示了通过标签动态查找端口的通信方式。两个示例都分配了16KB缓冲区,并展示了实时线程间的高效数据传输。文章详细解析了线程创建、套接字操作、数据读写等核心代码逻辑,为开发者理解BUFP协议提供了实用参考。原创 2026-01-12 11:03:06 · 720 阅读 · 0 评论 -
6.7RTIPC之XDDP实例分析
XDDP协议支持Xenomai与Linux域间的实时通信,包含数据报与流式缓存模式。内存管理通过bind前配置独立池或缓冲区实现,支持数字端口与标签化寻址。示例程序展示了实时与非实时线程间的数据回显、流传输及标签化端口通信。原创 2026-01-13 10:57:49 · 800 阅读 · 0 评论 -
7.1Xenomai常见问题汇总
本文总结了Xenomai实时系统常见问题及解决方案。主要内容包括:内核配置时应避免启用CPU频率调节、深度睡眠等影响实时性的选项;解决内核启动失败、OOPS、日志缺失等问题的方法;处理Xenomai计时器不可用、IRQ共享等特定问题的技巧;以及应用程序层面的权限设置、ABI兼容性等常见错误。文章提供了详细的技术参考链接,帮助用户快速定位和解决Xenomai使用过程中遇到的各种问题。原创 2026-01-13 11:03:49 · 861 阅读 · 0 评论 -
6.4非POSIXskin进程间通信
摘要 Xenomai非POSIX skin的进程间通信机制依赖于--enable-pshared编译选项。该选项启用后,通过CONFIG_XENO_PSHARED宏定义支持进程间共享资源。核心原理是通过libcopperplate库创建私有堆和共享堆内存,其中共享堆基于POSIX共享内存实现,进程可通过指定相同session名称共享内存。此外,--enable-registry选项允许通过FUSE导出实时对象信息到/var/run/mai目录,由sysregd守护进程管理。原创 2026-01-05 12:03:18 · 1173 阅读 · 0 评论 -
6.3POSIX进程间通信
POSIX进程间通信的核心概念是pshared属性,它决定了同步对象(如互斥锁、信号量等)能否跨进程共享。主要分为两种情况: fork生成的父子进程间通信: 守护进程场景通常不需要共享对象 确需共享时必须显式设置pshared属性 提供了互斥锁和信号量的代码示例,展示如何实现父子进程同步 。独立进程间通信: 可通过共享内存映射或命名对象实现 示例展示了使用命名信号量的跨进程同步方法。 关键点在于正确设置PTHREAD_PROCESS_SHARED属性原创 2026-01-05 11:52:16 · 612 阅读 · 0 评论 -
6.2POSIX线程间通信
Xenomai POSIX线程间通信不支持静态初始化方式必须通过pthread_mutex_init和pthread_cond_init函数显式初始化同步对象。虽POSIX标准允许使用PTHREAD_MUTEX_INITIALIZER等静态初始化器,但Xenomai为实现确定性实时性能,要求开发者主动调用初始化函数,避免在关键路径上进行隐式初始化带来的不确定性。实例代码如clocktest和cyclictest展示了正确的初始化方式,尽管后者仍保留静态初始化形式,实际开发中应遵循显式初始化原则确保系统实时性原创 2026-01-04 11:12:13 · 402 阅读 · 0 评论 -
6.1进程线程IPC方法概述
本文概述了Xenomai实时系统中的进程线程IPC通信机制。主要介绍了标准POSIX IPC(包括互斥锁、条件变量、消息队列、信号量和共享内存)和Xenomai特有的RTIPC(XDDP、IDDP、BUFP协议)。同时说明了如何通过/proc/xenomai/registry查看IPC对象信息,包括注册表使用情况和具体对象实例。文章还列举了Xenomai源码中相关示例程序,为开发实时应用提供了实用参考。这些机制对构建高性能实时系统具有重要意义。原创 2026-01-04 11:04:34 · 569 阅读 · 0 评论 -
5.4基于RTDM的RTIPC
RTIPC是Xenomai基于RTDM框架实现的实时进程间通信机制,包含RTIPC核心和三种协议:XDDP(跨域数据报协议)、IDDP(域内数据报协议)和BUFP(流式缓冲区协议)。RTIPC核心通过定义RTDM协议设备实现PF_RTIPC协议族,支持实时域内及跨域通信。XDDP支持Xenomai与Linux域间通信,IDDP和BUFP则分别实现域内数据报和高效流式数据传输。使用时需在内核配置中启用相关模块,RTIPC以RTDM驱动形式运行,确保实时任务通信时不离开Xenomai域,保障实时性。原创 2025-12-25 12:11:04 · 1057 阅读 · 0 评论 -
5.3RTDM用户层驱动
Xenomai的RTDM用户层驱动框架(UDD)通过内存映射和实时中断处理机制,实现了用户态程序对硬件设备的直接访问。UDD框架将设备物理内存映射到用户空间,并提供两种中断通知方式:基于I/O多路复用或信号机制。核心结构体udd_device定义了设备属性,包括内存区域、中断处理及操作函数。该框架优势在于确保从硬件中断到用户响应的全路径实时性,满足严格实时需求。原创 2025-12-25 12:06:57 · 914 阅读 · 0 评论 -
5.2RTDM驱动编程接口
RTDM驱动编程接口为实时设备开发提供了一套核心功能,包括设备管理(open/close/ioctl)、数据传输(read/write)和网络通信(socket相关操作)。这些接口定义在rtdm.h等头文件中,支持设备文件操作、套接字创建绑定、消息收发等功能。所有接口均返回操作状态,成功时返回描述符或字节数,失败返回错误码。该抽象层实现了实时设备驱动开发所需的底层服务,为构建确定性实时系统提供基础支持。原创 2025-12-23 11:00:13 · 1120 阅读 · 0 评论 -
5.1RTDM框架
RTDM是Xenomai的实时驱动模型,旨在统一实时设备驱动程序的开发接口。它解决了传统实时Linux驱动存在的接口碎片化、平台移植成本高的问题。RTDM提供独立于Linux内核的驱动模型,通过统一设备抽象层支持协议设备和命名设备两类模型,并定义设备规范实现应用与硬件解耦。其层次结构在应用程序和驱动间充当调解者,提供POSIX兼容的上层API和RTOS抽象底层API。RTDM还支持驱动堆叠,通过双域设计保证实时性,使Cobalt内核更专注于核心功能。该框架为实时驱动开发提供了标准化解决方案。原创 2025-12-23 10:49:24 · 1148 阅读 · 0 评论 -
4.7POSIX进程与线程实例
摘要:本文介绍了Xenomai测试套件中的latency应用程序,用于测量系统实时性能。详细说明了其编译过程(通过POSIX skin和wrap-link.sh进行构建),并分析了源码中遗留的cobalt/uapi/syscall.h头文件的历史原因。演示了latency执行时的参数选项和输出结果,展示了实时线程信息(通过/proc/xenomai/sched/threads查看)和Linux进程状态(使用top -H命令)。测试在QEMU ARM64虚拟机环境下完成,虽然延迟较大但验证了功能实现。原创 2025-12-22 10:58:42 · 851 阅读 · 0 评论 -
4.6POSIX应用启动流程
Xenomai 3应用启动流程详解:文章介绍了Xenomai 3实时系统的应用启动机制,包括内置命令行选项和初始化流程。首先详细解析了自动支持的标准命令行选项,涵盖配置诊断、会话管理、内存分配、CPU亲和性、调试输出等关键功能。随后阐述了Xenomai应用的启动入口过程,说明如何通过定制初始化程序将普通Linux进程转化为实时进程。重点分析了Shell环境下应用启动的fork-exec机制,以及Xenomai如何在此过程中介入以实现实时性保证。这些机制共同确保了实时应用的高性能运行和灵活配置能力。原创 2025-12-22 10:53:18 · 798 阅读 · 0 评论 -
4.5POSIXskin详解
本文介绍了Xenomai实时系统的POSIX skin接口实现细节。POSIX skin通过包装标准POSIX API为实时应用提供支持。文章重点分析了rtdm.c文件中的系统调用实现,涵盖文件操作(open/read/write等)和网络操作(socket/bind/connect等)两大类功能。这些API通过COBALT_IMPL宏定义实现,并优先尝试调用实时系统调用,失败后回退到标准Linux系统调用。该设计既保持了POSIX兼容性,又确保了实时任务的确定性执行。原创 2025-12-17 11:32:41 · 1305 阅读 · 0 评论 -
4.4POSIXskin的API特征
摘要:Xenomai 3采用双内核架构,通过主模式(Cobalt实时核心调度)和次模式(Linux内核调度)实现实时线程管理。系统提供API上下文标签(context tag)明确各API的调用权限,并引入模式切换标签(switch tag)标识API可能触发的调度模式转换。这些机制帮助开发者优化实时性能,减少不必要的模式切换开销,确保系统的实时性。通过静态分析和运行时检查,可有效避免错误的API调用上下文。原创 2025-12-17 11:23:36 · 1069 阅读 · 0 评论 -
4.3POSIXskin的不兼容性
Xenomai实时系统通过mlockall()锁定内存页以避免页面错误带来的延迟问题,但这也导致线程栈空间立即分配并锁定。系统将默认线程栈大小优化为64KB,并建议开发者通过pthread_attr_setstacksize()显式设置栈大小。主线程栈需通过ulimit命令调整或预分配策略确保实时性。此外,Xenomai扩展了Linux调度策略,支持SCHED_FIFO/SCHED_RR等实时调度类,优先级范围1-99,确保实时线程的确定性执行。开发者需合理配置内存和调度策略以平衡实时性能与系统稳定性。原创 2025-12-16 10:57:49 · 936 阅读 · 0 评论 -
4.2符号机制详解
Xenomai的符号包装机制通过链接参数和cobalt.wrappers文件实现POSIX函数重定向,在保证二进制兼容性的前提下增强实时性。该机制利用--wrap链接器技术,将POSIX函数调用重定向到Cobalt实现,同时通过宏定义和弱符号属性提供灵活的函数调用方式。对于静态程序编译,Xenomai提供了两阶段链接的wrap-link.sh脚本以避免glibc符号污染。这一机制使开发人员能够在POSIX兼容环境中便捷地构建实时应用。原创 2025-12-16 10:49:21 · 781 阅读 · 0 评论 -
4.1用户空间RTOSAPI
Xenomai 3采用双内核架构,通过Cobalt实时核心与Linux内核并行运行,提供微秒级精度的实时任务处理。系统提供多种RTOS API接口(POSIX、Alchemy、pSOS、VxWorks),其中POSIX接口为原生实现,其他接口通过copperplate转换层模拟。用户空间程序通过libcobalt库与内核通信,xeno-config工具简化了不同API接口的编译链接过程。新开发建议使用POSIX接口以降低复杂度。原创 2025-12-15 10:56:55 · 879 阅读 · 0 评论 -
3.5启动QEMUARM64虚拟机
本文介绍了在QEMU中启动ARM64虚拟机的详细步骤及参数配置。通过qemu-system-aarch64命令启动4核4G内存的虚拟机,指定内核镜像和根文件系统,并配置VirtIO设备和网络端口转发。重点验证了Xenomai Cobalt实时内核的安装情况,通过检查内核日志、/proc/xenomai目录和运行latency测试工具,确认实时子系统正确加载。文中还解释了虚拟机CPU占用率显示100%的原因,并展示了Xenomai内核参数的查看方法。这些步骤为ARM平台下的实时系统开发提供了基础环境搭建指南。原创 2025-12-15 10:50:51 · 1346 阅读 · 0 评论 -
3.4制作根文件系统
本文介绍了基于Ubuntu-base构建ARM64根文件系统的方法。Ubuntu-base作为轻量化基础镜像,通过APT包管理系统可便捷扩展功能。文章详细阐述了构建流程:1)下载基础镜像并解压;2)安装QEMU实现跨架构仿真;3)配置网络和软件源;4)使用chroot进入虚拟环境进行定制。该方法相比传统构建方案更简便,适用于嵌入式开发场景,特别是需要Xenomai实时扩展的场景。通过挂载关键目录(proc/sys/dev)和使用QEMU静态仿真器,实现了在x86主机上对ARM64系统的完整配置。原创 2025-12-10 11:51:01 · 1279 阅读 · 0 评论 -
3.3编译Xenomai用户层
本文介绍了Xenomai用户层在ARM64平台上的编译过程。首先通过bootstrap脚本生成configure文件,然后使用特定配置参数进行交叉编译,包括指定目标架构、编译器工具链和核心类型(cobalt)。重点说明了configure阶段的目录设置和关键选项,如共享库构建、调试模式选择等。编译完成后,生成的文件可直接部署到嵌入式系统的/usr目录下。文中还提供了从源码生成configure脚本的方法,并详细解释了各配置参数的作用,为Xenomai在嵌入式系统的移植提供了实用指导。原创 2025-12-10 11:45:30 · 1066 阅读 · 0 评论 -
3.2编译Xenomai内核
本文介绍了Xenomai内核镜像的编译过程。主要内容包括:1)Xenomai代码仓库迁移至GitLab;2)内核层分为Dovetail和Cobalt两部分;3)详细说明了如何应用Dovetail补丁到Linux内核,包括版本匹配、分支选择及补丁生成方法;4)提供了在中国地区优化Git仓库克隆的实用技巧。文章重点演示了Xenomai v3.2.4与Linux 5.10.199-dovetail1组合的移植过程,并给出了工作目录结构建议。原创 2025-12-09 12:00:08 · 1320 阅读 · 0 评论
分享