news 2026/10/21 2:08:21

瑞萨RA嵌入式开发必备:61个GitHub仓库分类图鉴与使用指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
瑞萨RA嵌入式开发必备:61个GitHub仓库分类图鉴与使用指南

干过嵌入式开发的朋友应该都有这种体会:拿到一块新板子,第一件事不是读数据手册,而是去 GitHub 上翻仓库。瑞萨 RA 系列这几年在 Arm Cortex-M 阵营里存在感越来越强,从入门级 RA2 到高性能 RA6、RA8,覆盖的场景相当广。但它的 GitHub 生态有个特点——官方仓库和社区仓库非常分散,FSP 配置器、例程、驱动、工具链、评估板支持包散落在几十个仓库里,新人进去基本是懵的。

我自己在给团队搭建 RA 项目模板的时候,把瑞萨官方和社区的部分仓库翻了个底朝天,按用途和配套关系梳理出了一份 61 个仓库的清单。这其实不是什么机密资料,但 GitHub 上搜索、筛选、试错的时间成本很高,我踩过不少弯路,包括 FSP 版本和编译器不配套导致编译失败、例程仓库和实际板卡型号对不上、以及拿到一个驱动仓库却不知道怎么集成进 e2 studio 这类问题。这篇就把我整理的这 61 个 RA 仓库的图鉴清单分享出来,按类别拆开讲清楚每个仓库到底是干什么的、该在什么场景下用、里面有什么值得参考的东西。

1. 瑞萨 RA 的 GitHub 生态到底是怎么回事

1.1 为什么仓库这么分散

先解释一个很多人都会困惑的点:瑞萨的 GitHub 组织下为什么有那么多仓库,不像有些厂商一个 SDK 仓库打天下?

这背后其实反映了 RA 生态的设计思路。RA 系列既有硬件抽象层(BSP),又有 Flexible Software Package(FSP)中间件体系,还有基于 e2 studio 的图形化配置工具。这三层是横向解耦的,分别被拆成独立仓库维护。比如 FSP 本身的源码是一个仓库,FSP 的例程集合是另一个仓库,针对特定评估板(EK 系列)的支持包又分别建仓库。再加上社区贡献者上传的驱动、中间件移植、板级例程,仓库数量自然就上去了。

这种分散方式的好处是职责清晰、可以独立迭代,坏处是初次接触的人很难判断"我要找的东西到底在哪个仓库"。所以我整理清单的第一个原则,就是按功能类别而不是按仓库名去归类。

1.2 仓库清单的价值不只是收藏

很多人看到这种"XXX 仓库清单"的第一反应是赶紧收藏,其实整理这份清单的意义不在收藏,而在于建立一张"资源地图"。

举个例子,你要给一块 RA6M4 的板子做以太网通信,至少要涉及三类仓库:FSP 基础包(提供中间件和驱动)、板级支持包或例程仓库(提供具体引脚的初始化配置)、以及通信协议栈相关仓库(提供应用层的示例)。如果你不知道它们之间的配合关系,单独打开任何一个仓库都会觉得内容不完整。

另一层价值是版本配套。嵌入式开发最忌讳"新版强迫症",GitHub 上主分支的代码往往比稳定版超前很多,直接拉最新代码和你的 FSP 版本、编译器版本对不上,会出现一堆莫名其妙的编译错误。这份清单里我会特别标注哪些仓库要跟着正式 Release 走,哪些仓库可以放心追主分支。

2. 61 个仓库全景分类地图

先把整体分类摆出来。我按照实际用途,把这 61 个仓库分成九大类。这个分类不一定和 GitHub 的官方分类一致,但它是从"我作为一个开发者,拿到仓库之后要干什么"这个角度去分的,更贴近真实使用场景。

分类数量典型用途重要程度
核心 SDK 与 FSP 体系6基础框架、配置工具、BSP 源码必看
官方例程与评估板支持12EK 系列例程、开发板启动工程必看
驱动与中间件8外设驱动、协议栈、文件系统高频
工具链与构建系统7CMake 模板、编译器适配、烧录脚本高频
操作系统与 RTOS 集成8FreeRTOS、RT-Thread、Zephyr 透传按需
网络与无线通信6WiFi、BLE、以太网、云连接按需
图形与显示4GUI、LCD、触摸屏按需
低功耗与电源管理3功耗优化、唤醒源、LPT 例程按需
社区贡献与扩展7第三方驱动、外设移植、Demo参考

先说明一点,GitHub 上的仓库是动态变化的,官方会不定期调整目录结构,社区仓库也可能归档,所以 61 这个数字代表的是我整理时的一个快照。相比死记这 61 个名字,更重要的是掌握每个类别的特征,这样即使仓库名变了,你也能靠规律找到替代品。

2.1 核心 SDK 与 FSP 体系

这是整个 RA 生态的基石。FSP 里包含硬件抽象层、HAL 驱动、中间件协议栈,以及基于配置器的代码生成逻辑。你写任何 RA 程序,不管用什么 IDE,最终都会落到 FSP 生成的代码上。

这一类的典型仓库包括 FSP 主仓库(源码、文档、示例配置)、FSP 配置器插件仓库(集成到 e2 studio 或 Keil 的插件)、以及 BSP 相关的独立支持包。如果你用的是 e2 studio,FSP 往往已经内置了;如果你用 Keil 或者 GCC 命令行,需要手动拉取 FSP 源码并配置路径。

这里要特别提醒一个误区:FSP 仓库不是拿来直接编译的,它更像一个"内容池"。你需要通过配置工具生成一个与你硬件匹配的工程,过程中会自动从 FSP 中提取必要的源文件。直接打开 FSP 仓库想要编译运行,多半会失败。

2.2 官方例程与评估板支持

这一部分是绝大多数人真正开始写代码的地方。瑞萨官方针对每块评估板(EK-RA2A1、EK-RA4M2、EK-RA6M4、EK-RA8D1 等)都会维护对应的例程仓库,里面包含基础 GPIO、UART、ADC、定时器、DMA 等外设例程,以及带有 RTOS 的复杂应用。

评估板支持仓库的价值不只是跑通板载外设,更重要的是它自带正确的引脚映射和时钟配置。你从例程仓库开始改,比从零建工程要稳得多。我的建议是:如果你手里的板子是官方 EK 系列,先找到对应仓库,用里面的基础工程当起点;如果你用的是自制板,可以参考不同板卡仓库的配置,理解哪些引脚复用是固定的。

2.3 驱动与中间件

FSP 本身已经覆盖了很多外设驱动,但总有一些不在标准包范围内,或者更新太慢的驱动需要单独找。比如新型号的传感器驱动、USB 设备栈的特定类实现、CAN 总线的高级应用、以及某些存储介质的文件系统适配。

这类仓库需要注意驱动质量参差不齐。官方维护的驱动仓库相对可靠,社区贡献的驱动则要先看 commit 活跃度和 issue 反馈再决定是否采用。我踩过的一个坑是有个社区驱动仓库最后一次更新在两年前,结果它依赖的 FSP 版本早就变了,集成的时候接口对不上,浪费了一下午排查。

2.4 工具链与构建系统

这一类别容易被忽略,但对实际开发体验影响巨大。RA 系列官方主推 e2 studio,但很多人习惯用 VS Code + GCC 命令行,或者用 CMake 管理大型项目。好在社区和官方都提供了相应的工具链仓库。

典型内容包括 GCC 工具链的适配说明、链接脚本模板、OpenOCD 烧录配置、以及把 FSP 生成代码导入到自定义构建系统的脚本。如果你不走官方 IDE 路线,建议先把这个类别的仓库搞清楚,能省掉不少折腾时间。

3. 核心仓库深度解析

前面给了全景分类,这一节挑几个最关键的仓库展开讲讲内部结构和具体用法。这几仓库属于"无论如何都会用到"的级别。

3.1 FSP 主仓库:内容多但别迷路

FSP 主仓库内部一般会按 modules、docs、examples 这类目录组织。打开之后不要被目录数量吓到,重点看两个地方:

  • modules目录下的 middleware 和 hal,这是所有驱动和中间件的源码所在地,你最终生成的工程代码会从这里面抽取文件。
  • docs目录下的 API 文档,虽然在线文档也有,但仓库里的文档版本和源码同步,排错的时候更可靠。

实操中一个常见的需求是给自定义外设加驱动。比如你要用某个不在 FSP 标准列表里的 SPI 设备,正确步骤是先到 FSP 仓库里找同类设备的驱动源码,复制出来改成自己的实现,再用配置工具里提供的 "User Code" 功能挂到工程上。直接改 FSP 仓库里的源码是错误姿势——配置器重新生成代码时会覆盖你的修改。

3.2 官方例程仓库:从"能编译"到"能改"的关键一步

官方例程仓库通常按板卡分目录,每块板卡下面又按外设类别拆成多个独立工程。进入这些工程你会发现它们都是可以直接导入 e2 studio 的完整工程文件,包含.project和.config配置。

我建议的用法是:先选一个和你需求最接近的例程,导入之后确认编译通过,然后逐步删掉不需要的部分、替换成你的业务逻辑。这比用 FSP 向导从空工程开始配置要高效得多,因为向导生成的初始配置往往不够完整,缺少一些只有实际例程里才有的细微设置(比如特定引脚的驱动强度、中断优先级、时钟源切换)。

有一个细节值得注意:例程仓库里的工程依赖的 FSP 版本可能不是最新的。导入的时候如果弹出版本不匹配提示,优先选择"保持原版本",等程序跑通了再升级 FSP。反着来的话,经常会遇到 API 变更导致的连锁报错。

3.3 评估板 BSP 仓库:引脚配置的"标准答案"

每块官方评估板都有一个对应的 BSP 仓库,里面除了最基本的启动代码,最重要的是板级引脚配置描述文件。这些文件定义了哪个引脚接了 LED、哪个引脚接了按键、哪个引脚作为串口调试口、板载调试器的连接方式。

自己设计板卡的人可能觉得这些仓库和自己无关,其实不是。RA 系列的引脚复用非常灵活,一个引脚可能有七八种功能,评估板 BSP 里的配置是官方经过验证的"推荐答案"。做板子的时候参考这些引脚分配,可以避免不少信号冲突问题。特别要关注的是调试串口——很多自制板翻车就是因为调试串口和某个外设复用了同一个引脚,程序烧进去之后调试信息全乱。

3.4 构建工具仓库:命令行玩家的大本营

如果你是 VS Code 流派,不习惯 e2 studio 的图形界面,那构建工具类仓库就是你的入口。这类仓库一般提供了三种东西:GCC ARM 工具链版本建议、CMakeLists 模板、以及烧录脚本。

我这里给出一个我实际工作中验证过的命令行构建流程供参考:

  1. 用 e2 studio 或者命令行版的 FSP 配置器生成基础工程(这步还是离不开配置器,因为它负责生成 pin 配置和时钟树的代码)。
  2. 把生成的工程文件作为输入,导入到 CMakeLists 模板仓库提供的构建结构中。
  3. 用 CMake 指定工具链文件,编译生成.elf文件。
  4. 用 OpenOCD 配合板载调试器烧录,Flash 起始地址和芯片型号参数在烧录脚本里设置好。

这套流程的坑在于 FSP 生成的代码结构比较复杂,CMake 模板需要识别所有源文件路径、头文件路径、以及链接脚本的位置。用现成模板仓库比自己从头写要稳得多,但要注意模板仓库支持的 FSP 版本范围——有些模板只适配特定大版本。

3.5 中间件集成仓库:协议栈和云连接的正确打开方式

RA 系列主打的场景是物联网和控制类应用,所以各种通信中间件仓库特别多。比如 WiFi 模块的驱动、BLE 协议栈、MQTT 客户端、以及各家云平台的连接示例,都有独立仓库。

这类仓库的使用逻辑通常是"在 FSP 中间件基础上叠加一层适配"。也就是说,你在配置器里先把基础协议栈拉起来(比如 UART 或 SPI 作为底层物理通信),然后从集成仓库中找到对应平台的应用层适配代码,把两者拼起来。

一个流传很广的误区是:把中间件仓库里的代码直接复制到工程根目录就能用。实际上,仓库里的代码往往依赖特定的 FSP 配置选项和宏定义,这些定义在源码注释里才有说明。我建议把中间件仓库的 README 完整读一遍,重点关注 "Prerequisites" 部分,那里面会列出需要在 FSP 配置器里提前勾选哪些模块、定义哪些宏。

4. 不同开发任务的选仓指南

仓库清单只是地图,具体到某个开发任务时,你需要在不同仓库之间跳转。这一节按任务场景给出一条"选仓路径"。

4.1 任务一:从零跑通一块开发板

从零上手一块新 EK 板,最怕的是花半天时间连一个 LED 都点不亮。我的建议路径是:板卡例程仓库(基础工程)→ BSP 仓库(确认引脚对应关系)→ FSP 官方文档(查 API 用法)。

第一步打开例程仓库里最基础的 blinky 工程,导入编译下载运行。确认环境没问题之后再去找外设相关的独立例程。这个顺序比一开始就看文档或者自己搭工程要快得多。

4.2 任务二:给自研板卡做底层驱动

自研板的难点在于引脚分配和时钟树配置,因为没有任何现成工程能直接抄。这时的路径是:参考评估板 BSP 的引脚分配思路 → 用 FSP 配置器对照你的板卡原理图逐个设置引脚 → 从驱动与中间件仓库找到对应的外设驱动 → 参考例程仓库验证基本通信是否正常。

自研板最常见的失误是忽略了引脚默认状态。比如某个引脚上电默认是 JTAG 调试功能,你想拿它当普通 GPIO 用,就必须先在 FSP 配置器里关闭复用功能。这种问题在官方评估板上不会遇到,因为官方板卡的 BSP 已经处理过了,而自研板需要你自己在配置器里逐个确认。

4.3 任务三:集成 RTOS 和协议栈

如果你的应用需要跑 RTOS 加网络协议栈,核心路径是:操作系统集成仓库(获取移植层代码)→ FSP 中间件仓库(配置底层驱动)→ 网络仓库(找到应用层示例)。

这里我特别强调一下版本配套。RTOS 移植代码是和特定内核版本绑定的,如果你从系统中获取的是新版 RTOS,而 FSP 里配套的移植层是针对旧版的,接上之后会有一堆 API 签名不匹配的报错。遇到这种情况不要硬着头皮去改 RTOS 代码,优先看仓库的 Release 记录,找一个和你的 FSP 版本对应的历史版本。

4.4 任务四:做图形界面或显示应用

图形类任务的重点是显示缓冲区、触摸输入和外设驱动的组合。路径为:图形库仓库(获取渲染引擎)→ 显示驱动仓库(获取具体的 LCD 驱动)→ 例程仓库(查看 GUI 的启动和刷屏逻辑)。

图形应用对内存的要求比较高,RA6 系列因为内置了较大的 SRAM 和硬件加速单元,比较适合这类任务。选型的时候留意目标 MCU 的 SRAM 容量是否满足图形缓冲区要求,最近 RA8 系列加入了对更高分辨率显示的支持,如果要做复杂界面可以重点关注。

4.5 选仓清单速查表

当前任务第一优先仓库第二优先仓库第三优先仓库
点灯入门板卡例程BSP 仓库FSP 文档
自研板驱动BSP 仓库FSP 配置器外设驱动仓库
UART 通信板卡例程驱动中间件FSP 文档
以太网应用网络仓库FSP 中间件例程仓库
低功耗设计低功耗仓库BSP 仓库硬件手册
命令行构建构建工具仓库FSP 仓库CMake 模板
云平台接入云连接仓库网络仓库FSP 中间件

5. 仓库使用中的经验与避坑整理

这一部分是我整理清单之外最想分享的东西。仓库清单本身是死的,但这些使用经验可以让你的效率翻倍。

5.1 不要盲目追主分支

GitHub 上很多仓库的 main 分支更新非常频繁,但更新不代表稳定。瑞萨的仓库体系里,正式的 Release 版本才是经过完整测试的。

我的习惯是只关注 Release 页面,下载带版本号的稳定包。如果非要用主分支,先看最近几次 commit 的改动范围,涉及核心文件(比如 BSP 初始化、时钟配置)的改动要谨慎,涉及文档或例程注释的改动基本可以放心。实际中我吃过一次亏:主分支上 FSP 的某个中间件改了个 API 函数名,我整个工程有十几处调用,编译报错后花了一个多小时才定位到原因。

5.2 License 要认真看

很多人忽略海外仓库的 License 类型,觉得开源就能随便用。RA 生态里有些仓库是 BSD/MIT 宽松许可,可以放心用于商业产品;但有一部分仓库是带有额外限制的,比如要求保留版权声明、或者禁止直接再分发。

你的产品如果涉及商业交付,建议提前把依赖仓库的 License 审查一遍,列一个清单归档。这个问题等产品要出货时才暴露会很被动,到时候替换驱动库的工作量远超想象。

5.3 仓库间的锁定关系

RA 生态有一个独特的现象:仓库 A 依赖仓库 B 的某个特定版本,而仓库 B 又依赖仓库 C 的某个配置项。打破这种锁定关系是出问题的根源。

记录锁定关系最靠谱的方法是看各仓库 Release 的发布时间和 FSP 版本号标注。通常一个仓库的 README 里会写"Requires FSP X.Y.Z"这类信息。如果有仓库没有标注,可以看该仓库最近的 commit 时间和它的 CI 配置文件,那里能推断出它适配的 FSP 版本范围。

5.4 复用例程代码的正确姿势

直接复制例程代码到自己的工程里通常是不行的,因为例程代码依赖工程内的 FSP 配置。正确的做法是:在 FSP 配置器中复现该例程的模块配置,然后从例程工程中参考应用层代码的实现逻辑。

这个思路和"复制粘贴"不同,它保留了配置层的同步,避免了宏定义、引脚分配和中断号不一致造成的运行异常。尤其是中断处理函数——RA 的中断分配是由配置器生成的函数名带固定格式的,直接搬运代码时最容易在这上面翻车。

5.5 善用仓库的 Issue 区

很多人只在遇到问题时才知道 GitHub 有 Issue 区,其实 Issue 区是判断一个仓库质量的重要窗口。看到一个仓库时,先浏览一下最近一个月有没有新的 Issue,以及维护者响应是否及时。如果一个仓库积压了大量无人回应的 Issue,历史上也没有 Release,那它很可能只是个人上传的实验性代码,生产环境慎用。

反过来,有些仓库的 Issue 区其实是一个非常好的调试知识库。比如我遇到过某外设驱动在特定 RA 型号上初始化失败的问题,搜了一下该仓库的 Issue,发现已经有人给出了明确的解决办法,省了自己逐个寄存器排查的功夫。

6. 常见问题速查与调试实录

下面这几个问题是我在实际使用瑞萨 RA 仓库过程中遇到的高频问题,整理成一个速查表,方便日后排查。

问题现象主要原因解决思路
编译报错找不到头文件FSP 源码路径配置不完整检查工具链的头文件搜索路径是否包含 FSP 的src目录
链接时报重复定义例程代码和 FSP 自动生成代码同时包含同一个源文件删除手动加入的重复源文件,保留配置器生成的那个
下载后程序不运行启动文件选择错误或链接脚本不匹配确认链接脚本里的 Flash 大小和实际 MCU 型号一致
引脚电平异常引脚复用功能未关闭回 FSP 配置器检查 pin 的 Peripheral 设置
中断不触发中断回调函数名不匹配检查 NVIC 配置和回调函数是否与配置器生成的名字一致
下载调试器连接不上调试器固件和板载芯片不匹配更新调试器固件或检查跳线帽设置

6.1 一个典型的版本不匹配排查过程

这里分享一个我实际处理过的案例。某次我给一个 RA6M5 项目集成蓝牙模块,从蓝牙驱动仓库拉取最新代码后,编译报了一大堆错,错误信息指向 FSP 的通用中间件接口。我一开始怀疑是驱动库本身有问题,后来仔细看了 Release 记录,发现最新版驱动依赖 FSP 5.0 以上的接口,而工程用的是 FSP 4.x。

解决办法是回到该仓库之前的 Release 版本,下载和 FSP 4.x 配套的旧版驱动,替换后编译一次通过。这个经历印证了一个规律:仓库的最新版本不一定适配你的总体环境,版本匹配比版本新更重要。

6.2 烧录界面的困惑

另一个高频问题是 Code Flash 区域设置错误。RA 系列的部分型号内置了多个 Flash 区域,如果烧录工具配置了错误的起始地址,程序下载看似成功,实际运行马上进 HardFault。

排查思路是:到 BSP 仓库找到对应 MCU 的链接脚本,确认 Flash 起始地址和大小,再回到烧录工具的配置界面逐一核对。这个问题往往在自制板的开发环境中更常见,官方例程因为工程配置完整很少出现。

6.3 关于细节的补充思考

梳理仓库清单的过程中我意识到一个问题:GitHub 上的仓库数量会持续增长,但核心价值始终集中在几个关键仓库上。与其把所有仓库都翻一遍,不如先把 FSP、例程、BSP 这三个核心吃透,其他仓库按需查阅即可。

另外,很多仓库里有examples目录,里面塞了大量小型 Demo 工程,对快速验证某个功能很有帮助。比如你要验证 RA 系列的 DTC 数据传输功能,在例程仓库里搜dtc关键字就能找到对应的独立工程,导入后稍微改改就能用。

7. 一些我自己的使用心得

清单整理到这份上,我最大的感受是瑞萨 RA 的开源生态已经相当完整——从配置工具到驱动、从入门例程到云连接方案,基本能找到你需要的一切。但完整不等于简单,仓库之间错综复杂的依赖关系才是真正的学习曲线。

建议拿到这份清单的朋友,不要在一天之内试图把所有仓库都浏览一遍,那样消化不了。更好的方式是"按需求打开":今天做哪个功能,就打开对应的几个仓库,解决完问题就关掉,下次遇到新需求再回来翻清单。这样持续两三个项目周期,你对整个生态的印象自然就建立起来了。

最后再说一个关于 README 的细节。海外大厂的仓库 README 通常非常详细,特别留意表格和目录树的部分。有些仓库的 README 表面上没提 RA 系列,实际内容却和 RA 关联极大,比如一些直接操作底层寄存器的通用驱动仓库。判断这类仓库是否适用,最可靠的方法是看boards或者targets目录下有没有 RA 系列的文件夹。

这些经验都是靠一个个凌晨查代码堆出来的,希望这篇图鉴能帮你少走一些弯路。下次如果在某个仓库的 Issue 区看到了有意思的问题,欢迎顺着清单找到对应的位置,一起填坑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 2:07:09

大模型+工具调用+策略编排:保险业务智能办理系统实战

保险和金融这个行业,咨询场景一直是需求量大但翻车率也高的地方。之前做过好几个智能问答类的项目,真正落到保险理赔、贷款咨询这种业务里,最大的问题不是模型不会说话,而是它说了不算——回答得再流畅,没法查用户保单…

作者头像 李华
网站建设 2026/10/21 2:05:35

Stable Video Infinity 部署指南:5 步生成无限长视频

Stable Video Infinity 部署指南:5 步生成无限长视频 【免费下载链接】Stable-Video-Infinity [ICLR 26 Oral] Stable Video Infinity: Infinite-Length Video Generation with Error Recycling 项目地址: https://gitcode.com/GitHub_Trending/st/Stable-Video-Infinity …

作者头像 李华
网站建设 2026/10/21 2:04:37

广告投放风控防坑必备软件:传播易、朝闻通、拓氪科技

随着移动互联网营销迈入精细化、合规化、长效化发展阶段,传统粗放式广撒网的广告投放模式已彻底失效。当前,全域资源整合、AI智能内容生产、全链路数据监测、合规风控管控、私域用户长效沉淀,已成为全行业广告主的核心营销刚需。现阶段各类企…

作者头像 李华
网站建设 2026/10/21 2:04:25

永磁同步电机电流环:基于ESO与无模型MPCC的仿真设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/21 2:03:14

工控机变频器旁频繁死机?EMC抗干扰实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华