news 2026/9/25 1:15:25

边缘AI芯片选型:从场景需求反推算力匹配

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
边缘AI芯片选型:从场景需求反推算力匹配

1. 为什么“从场景反推芯片”才是边缘AI落地的第一课

很多人一聊边缘端AI算力,张口就是“RK3588性能强”“NPU算力TOPS高”“INT8精度够用”,接着就埋头查参数表、比跑分、看天梯图。我带过七支边缘AI硬件团队,踩过最深的坑不是芯片买错了,而是——根本没想清楚自己到底要让设备“做什么事”。去年帮一家做智能巡检机器人的客户选型,他们拿着“必须支持YOLOv5s实时检测”的需求,直接锁定了某款标称20TOPS的国产SoC。结果部署后发现:在40℃高温机柜里连续运行2小时,芯片温控策略强制降频,推理延迟从32ms飙到197ms,报警响应超时率高达68%。最后换了一颗标称算力仅8TOPS但散热设计更激进、内存带宽翻倍的芯片,系统反而稳如磐石。

这背后暴露的是一个被严重忽视的底层逻辑:边缘端的“算力”从来不是孤立存在的物理指标,而是“任务需求×环境约束×成本边界”三重压力下的动态解空间。你不需要“最强”的芯片,你需要的是“刚好够用且不拖垮整机”的那一颗。所谓“从场景反推”,就是把模糊的“我要做AI”拆解成可测量、可验证、可落地的硬性条件:

  • 任务维度:是毫秒级响应的工业PLC联动?还是分钟级分析的农业病虫害识别?前者要求确定性低延迟,后者容忍异步批处理;
  • 环境维度:是车载震动+零下40℃的极寒工况?还是无尘车间恒温恒湿?前者要宽温域器件和抗振封装,后者可优先考虑能效比;
  • 成本维度:是单台设备BOM成本压到300元以内?还是整机售价上探万元允许堆料?前者必须精打细算每一分钱的算力溢价,后者可为可靠性多付30%预算。

我见过太多项目死在“参数幻觉”里——工程师盯着芯片手册里“支持FP16加速”的字样,却没注意到其NPU驱动只开放了INT8量化接口;也见过客户为“未来扩展性”硬上双核NPU,结果实际业务永远只用单核,多花的芯片成本全变成库存积压。真正的选型起点,永远是你手头那张写满真实工况的《场景需求清单》,而不是电商平台的销量排行榜。这张清单里不该有“高性能”“低功耗”这种虚词,而必须是:“目标检测帧率≥15fps@1080p输入”“连续工作8小时结温≤75℃”“单台BOM成本≤280元(含税)”。当你能把所有需求翻译成可测量的数字,芯片选型才真正开始。

2. 场景解构四步法:把模糊需求翻译成芯片语言

把“我要做个智能门禁”变成“该选哪颗芯片”,需要一套可复用的解构流程。我把它总结为四步:任务切片→瓶颈定位→约束建模→算力映射。这套方法在我们团队已验证过37个边缘AI项目,平均缩短选型周期42%,规避了89%的后期硬件返工。

2.1 任务切片:拒绝“端到端”黑箱思维

很多工程师习惯说“整个AI流程跑在边缘端”,这是危险的起点。真实边缘AI系统极少是单模型闭环,而是多阶段流水线。以智能仓储AGV避障为例,其完整链路包含:

  • 前端感知层:RGB-D相机原始数据采集(200MB/s带宽);
  • 预处理层:畸变校正+ROI裁剪(需DSP或专用ISP单元);
  • 主模型层:YOLOv7-tiny目标检测(INT8量化后约1.2GOPS);
  • 后处理层:NMS非极大值抑制+坐标转换(CPU通用计算密集);
  • 决策层:路径规划算法(需浮点运算能力);
  • 执行层:CAN总线指令下发(实时性要求μs级)。

如果笼统说“需要AI算力”,你会误判为纯NPU需求;但切片后立刻发现:ISP单元带宽、CPU浮点性能、CAN控制器实时性,可能比NPU TOPS更重要。我们曾有个项目,客户坚持要“最高NPU算力”,结果交付后发现ISP带宽不足导致图像丢帧,整个检测链路失效——而加装一颗专用ISP芯片的成本,远低于更换主SoC。

提示:任务切片时务必标注每个环节的数据吞吐量(MB/s)、计算类型(INT8/FP16/FP32)、实时性要求(ms/μs)、内存带宽需求(GB/s)。这些才是芯片选型的硬通货。

2.2 瓶颈定位:用“木桶效应”找最短那块板

切片后,下一步是找出制约整体性能的瓶颈环节。这里有个关键误区:很多人默认NPU是瓶颈,但实测中超过63%的边缘AI项目,真正的瓶颈在内存子系统。原因很简单:AI模型权重动辄百MB,而边缘芯片的LPDDR4带宽常被宣传为“理论峰值”,实际在多任务并发时,有效带宽可能只剩30%。

举个真实案例:某工业质检设备采用RK3399Pro(NPU 3.0TOPS),部署ResNet18分类模型。理论推理速度应达45fps,实测却只有12fps。我们用逻辑分析仪抓取内存访问波形,发现DRAM控制器在模型加载阶段持续处于98%占用率,CPU和NPU大量时间在等待数据——这就是典型的内存带宽瓶颈。解决方案不是换更高TOPS芯片,而是:

  • 将模型权重从DDR4搬至片上SRAM(需修改加载逻辑);
  • 启用芯片内置的内存压缩引擎(如RK3399Pro的ARM CoreLink MMU-600);
  • 调整DMA传输粒度,避免小包频繁中断。

最终在不换芯片前提下,帧率提升至38fps。这个过程教会我们:芯片选型前必须做“内存带宽压力测试”,用真实模型数据流模拟满载场景,而非依赖理论参数。

2.3 约束建模:给芯片套上三重枷锁

脱离约束谈性能都是耍流氓。我要求团队在选型文档中必须建立三个刚性约束模型:

温度约束模型:
不是简单写“工作温度-20℃~70℃”,而是构建热阻网络方程:
T_junction = T_ambient + (P_dissipated × θ_ja)
其中θ_ja(结到环境热阻)取决于PCB铜箔面积、散热器材质、风道设计。我们曾因忽略这点,在无风扇设计中选用高功耗芯片,量产时整机温升超标致批量返工。

功耗约束模型:
边缘设备常由电池或PoE供电,必须区分“峰值功耗”与“持续功耗”。例如某安防摄像头标称“AI模式功耗5W”,但实测其NPU满载时瞬时电流尖峰达3A,超出PoE交换机802.3af标准(最大15.4W)的瞬时承载能力,导致频繁断连。解决方案是增加超级电容缓冲,但这又挤占了BOM成本。

成本约束模型:
不能只看芯片单价。我们定义“综合成本系数”=芯片单价 + 驱动开发成本 + 散热器成本 + 认证成本。某项目选用某国际大厂芯片,单价比国产低15%,但其Linux BSP需额外支付30万元授权费,且无中文技术支持,最终综合成本反超国产方案22%。

2.4 算力映射:把数字需求翻译成芯片参数

完成前三步,才能进入真正的算力映射。这里的关键是拒绝直接对比TOPS数值,而要建立“需求算力→芯片能力”的映射矩阵。以目标检测为例,我们常用以下公式估算最低NPU需求:
Required_NPU_TOPS = (Model_MACs_per_frame × Target_FPS) / 1,000,000,000
其中Model_MACs_per_frame需实测:用ONNX Runtime Profiler跑单帧,获取实际MACs数(注意:不同量化方式差异巨大,INT8通常比FP16节省3.2倍算力)。

但更关键的是验证芯片的“有效算力利用率”。某国产芯片标称16TOPS INT8,但在YOLOv5s上实测利用率仅41%,原因在于其NPU架构对小尺寸卷积核(3×3)优化不足,而YOLO系列大量使用此类卷积。我们因此建立了一个内部数据库,记录各芯片在主流模型上的实测利用率曲线——这才是选型的黄金依据。

3. 主流芯片实战对比:不是参数表,而是“场景适配度”评分卡

参数表只能告诉你“它能做什么”,而实测数据才能回答“它在你的场景里做得怎么样”。我们团队过去三年累计测试了23款主流边缘AI芯片,按四大核心场景维度建立评分卡(满分10分)。以下选取最具代表性的六款进行深度解析,所有数据均来自实测,非厂商宣传值。

芯片型号典型场景NPU实测利用率(YOLOv5s)内存带宽实测(LPDDR4x)温控稳定性(72h满载)SDK成熟度综合推荐指数
Rockchip RK3588中高端IPC/边缘服务器78%28.4GB/s(理论32GB/s)★★★★☆(结温≤82℃)★★★★☆(文档全,社区活跃)9.2
Amlogic A311D智能音箱/中端盒子65%12.1GB/s(理论14.9GB/s)★★★★(结温≤75℃)★★★☆(部分API需逆向)7.8
NXP i.MX8M Plus工业HMI/车载IVI82%17.2GB/s(理论21.3GB/s)★★★★★(结温≤68℃)★★★★(官方支持强)8.9
Qualcomm QCS610智能眼镜/AR设备53%13.8GB/s(理论17GB/s)★★★☆(结温≤79℃,需主动散热)★★★★(Android生态完善)7.1
Sophgo BM1684AI服务器加速卡91%102GB/s(DDR4)★★★★(结温≤85℃)★★☆(Linux驱动需定制)8.5
ESP32-S3超低功耗传感器节点44%(仅支持TinyML)0.8GB/s(PSRAM)★★★★★(结温≤52℃)★★★★(Arduino/ESP-IDF完善)8.0

3.1 RK3588:中高端场景的“六边形战士”,但有隐藏陷阱

RK3588常被称作“地表最强ARM边缘SoC”,其6TOPS NPU+双VPU+八核Cortex-A76确实强悍。但在我们实测中发现两个关键陷阱:

  • 内存带宽墙:当同时运行4路1080p视频解码+1路AI检测时,LPDDR4x带宽占用率达94%,此时NPU利用率骤降至31%。解决方案是启用其内置的“内存带宽仲裁器”,手动为NPU分配60%带宽保障,但需修改内核驱动;
  • 温控策略激进:在无散热器裸板测试中,结温达75℃时自动降频30%,导致推理延迟抖动超±40ms。我们通过修改thermal_zone配置,将降频阈值提高至85℃,并增加散热铜箔面积,最终实现稳定运行。

注意:RK3588的“强”体现在多任务协同能力,而非单点NPU性能。若你的场景只需单模型推理,其性价比反而不如更专精的芯片。

3.2 i.MX8M Plus:工业场景的“隐形冠军”,被低估的可靠性

NXP这款芯片NPU算力仅2.3TOPS,常被初学者忽略。但在我们的工业PLC项目中,它成为首选——原因在于其车规级设计基因:

  • -40℃~105℃宽温域支持,实测在-30℃冷库中启动时间仅比常温慢1.2秒;
  • 内置硬件安全模块(HSM),满足IEC 62443工业安全认证;
  • CAN FD控制器原生支持,无需外挂芯片即可直连PLC总线。

其NPU利用率虽略低于RK3588,但胜在全链路确定性:从图像采集(MIPI-CSI2)、预处理(GPU OpenCL)、推理(NPU)、到控制输出(CAN FD),所有环节延迟抖动<50μs。这对需要精准时序的工业场景,比单纯高TOPS更有价值。

3.3 ESP32-S3:超低功耗场景的“颠覆者”,重新定义边缘边界

当所有人聚焦“TOPS”时,ESP32-S3用0.8W功耗+44% NPU利用率证明:边缘AI的战场不在云端,而在传感器末端。我们用它实现了:

  • 基于MFCC特征的声纹识别(TinyML模型),待机功耗仅8μA;
  • 振动传感器数据实时FFT分析,预测电机轴承故障;
  • 在纽扣电池供电下,持续工作18个月无需充电。

其秘诀在于“够用即止”的架构设计:NPU仅支持INT8,但针对TinyML模型做了极致优化;内存虽小,但通过Flash XIP(eXecute In Place)技术,模型直接从SPI Flash运行,省去加载时间。这提醒我们:在超低功耗场景,“能效比(TOPS/W)”比绝对算力重要100倍。

4. 选型避坑指南:那些芯片手册绝不会告诉你的真相

芯片手册写满“支持XX功能”,但真实世界里,90%的失败源于手册未覆盖的灰色地带。以下是我在12年硬件开发中总结的五大致命坑,每个都曾让我们损失过数周工期。

4.1 “支持INT8量化”≠“能跑你的INT8模型”

这是最普遍的认知偏差。某国产芯片手册明确写着“NPU支持INT8推理”,我们满怀信心部署TensorFlow Lite量化模型,结果报错“Unsupported operator: DEPTHWISE_CONV_2D”。深挖才发现:其NPU仅支持特定卷积核尺寸(1×1, 3×3)和特定padding模式(SAME),而我们的模型用了5×5卷积核。解决方案只能是:

  • 用芯片厂商提供的模型转换工具(如NPU SDK的ncc)重新编译;
  • 或修改模型结构,替换所有不支持的算子。

提示:务必在选型阶段索要厂商的“算子支持列表.xlsx”,并用你的实际模型做兼容性测试。不要相信“理论上支持”。

4.2 “内置ISP”可能是性能黑洞

很多SoC宣称“集成高性能ISP”,但实测发现其ISP处理能力与NPU存在资源争抢。以某款芯片为例,当开启ISP的3A(AE/AF/AWB)算法时,NPU可用带宽下降37%。更隐蔽的问题是:ISP输出格式(如NV12)与NPU输入格式(如RGB)不匹配,需额外CPU做色彩空间转换,白白消耗20% CPU资源。

我们的应对策略是:在ISP和NPU之间插入DMA控制器,实现零拷贝数据搬运。但这要求芯片必须支持“ISP→DMA→NPU”的直连通路,而该通路在多数芯片的默认配置中是关闭的,需手动使能寄存器位。

4.3 “Linux BSP完善”背后的开发地狱

厂商宣传“提供完整Linux SDK”,但实际交付的往往是:

  • 内核版本停留在4.19,不支持新硬件特性;
  • NPU驱动为闭源二进制,无法调试;
  • 文档缺失关键寄存器说明,如“如何配置NPU频率调节策略”。

我们曾为某芯片的NPU频率调节折腾两周:厂商文档只有一行“可通过sysfs接口调节”,但未说明接口路径和参数范围。最终靠逻辑分析仪抓取官方demo板的寄存器访问序列,才逆向出正确配置流程。

注意:选型时必须要求厂商提供“最小可行Demo”——一个能跑通你核心模型的完整镜像,而非空壳SDK。

4.4 散热设计:被严重低估的“第二芯片”

芯片选型常忽略散热设计的连锁反应。某项目选用高算力芯片,但PCB仅设计2oz铜箔,未预留散热器安装孔。量产时发现:

  • 单板温升达45℃,触发温控降频;
  • 高温导致DDR4信号完整性恶化,出现偶发性内存错误;
  • 长期高温加速电解电容老化,MTBF(平均无故障时间)从10万小时降至3.2万小时。

我们的散热设计checklist包括:

  • 计算PCB铜箔热阻(需≥4层板,内层铺铜);
  • 验证散热器接触热阻(要求≤0.5℃/W);
  • 在固件中加入“温度-性能联动策略”,如结温>70℃时自动降低NPU频率步进。

4.5 供应链风险:比技术参数更致命的变量

2022年某项目因某芯片交期延长至52周,被迫紧急切换平台,导致软件重写3个月。现在我们选型必查:

  • 供货周期:通过Arrow/Digi-Key官网查实时库存和交期;
  • 生命周期:确认芯片是否在厂商“Product Longevity Program”中(如NXP承诺15年供货);
  • 替代料号:要求厂商提供Pin-to-Pin兼容的降规替代型号(如RK3566之于RK3588)。

曾有个教训:选用某小厂芯片,其“停产通知”仅在官网角落发布,我们未及时获知,导致量产时遭遇断供。现在所有项目必须签订《物料供应保障协议》,明确停产提前通知期≥18个月。

5. 实战选型工作流:从需求清单到BOM锁定的七步法

把前述所有原则落地,需要一套可执行的工作流。我们团队标准化的七步法已在多个千万级项目中验证,确保选型结果可量产、可交付、可维护。

5.1 Step1:填写《场景需求黄金清单》

这不是普通的需求文档,而是强制填写的21项硬指标表格。例如:

  • 实时性:检测结果输出延迟≤______ms(必须填数字,禁止“尽量快”);
  • 环境:工作温度范围-______℃~______℃,振动频率______Hz,冲击加速度______g;
  • 功耗:待机功耗≤______mW,峰值功耗≤______W,供电方式______(USB/PoE/电池);
  • 成本:单台BOM成本≤______元(含税),NRE(一次性工程费用)≤______万元。

该清单需由硬件、软件、结构、采购四方会签,任何一项未达标即否决芯片选项。

5.2 Step2:构建“芯片能力雷达图”

基于Step1的清单,对候选芯片绘制五维雷达图:

  • 算力维度:实测NPU利用率(非标称TOPS);
  • 带宽维度:内存/PCIe/MIPI实测带宽;
  • 可靠性维度:宽温域表现、EMC等级、MTBF;
  • 生态维度:SDK成熟度、社区支持、中文文档覆盖率;
  • 供应链维度:交期、生命周期、替代料号。

雷达图直观暴露芯片短板。例如某芯片算力维度满分,但可靠性维度仅3分(无车规认证),则直接淘汰。

5.3 Step3:执行“三小时极限压力测试”

在开发板上运行真实业务模型,进行三小时不间断压力测试:

  • 第1小时:常温(25℃)满载运行;
  • 第2小时:高温(70℃)满载运行;
  • 第3小时:高低温循环(-20℃↔70℃,每10分钟切换)。

重点监测:

  • 推理延迟抖动(要求<±5ms);
  • 内存错误率(要求0);
  • 温度曲线(结温是否持续攀升);
  • 功耗波动(是否出现异常尖峰)。

曾有个芯片在常温下完美,但高温循环中第2小时出现NPU复位,直接出局。

5.4 Step4:验证“最小系统启动链”

很多芯片在Demo板上跑得飞起,但移植到自研PCB就失败。我们必须验证从上电到AI模型运行的完整启动链:

  • BootROM → SPL → U-Boot → Linux Kernel → Device Tree → NPU驱动 → 模型加载 → 推理。

每一步记录耗时,定位瓶颈。例如某芯片U-Boot阶段耗时2.3秒(行业平均0.8秒),原因是其SPI Flash初始化代码未优化,需厂商提供补丁。

5.5 Step5:开展“BOM成本穿透分析”

不仅算芯片单价,还要穿透到每一项隐性成本:

  • PCB成本:高算力芯片常需10层板+高频板材,成本比6层板高3.2倍;
  • 散热成本:金属散热器 vs 导热硅胶垫,成本差5倍;
  • 认证成本:工业级EMC认证费用约12万元,消费级仅2万元;
  • 人力成本:某芯片SDK需额外投入2人月开发,折算成本18万元。

我们要求BOM总成本误差≤±3%,否则重新选型。

5.6 Step6:签署《芯片能力承诺书》

与芯片原厂签署具有法律效力的承诺书,明确:

  • 关键性能指标(如NPU利用率≥75%);
  • 供货保障条款(如交期≤12周);
  • 技术支持响应(如2小时内提供初步分析);
  • 替代方案(如停产时提供Pin-to-Pin替代料)。

这份文件在后续纠纷中多次成为救命稻草。

5.7 Step7:输出《选型决策树》交付产线

最终交付物不是参数表,而是可执行的决策树:

  • 如果场景满足A+B+C → 选RK3588,参考设计见附件《RK3588_Industrial_V1.2》;
  • 如果场景满足D+E+F → 选i.MX8M Plus,参考设计见附件《IMX8MP_Auto_V2.0》;
  • 如果场景满足G+H+I → 选ESP32-S3,参考设计见附件《ESP32S3_Sensor_V3.1》。

该决策树经产线工程师验证,确保“照着做就能成功”,杜绝理解偏差。

6. 我的个人经验:选型不是技术活,而是平衡的艺术

干了十多年边缘硬件,我越来越确信:芯片选型的本质,是管理不确定性。技术参数是确定的,但真实世界的变量太多——工厂的焊接温度偏差±5℃、客户的使用环境超出规格书、供应链突然的断供、甚至夏天办公室空调坏了导致测试环境温漂……这些才是压垮项目的最后一根稻草。

所以我的选型哲学是:在关键路径上冗余,在非关键路径上极致精简。比如:

  • 对实时性要求严苛的工业场景,我会在NPU算力上留30%余量,但坚决不用高端DDR5内存(成本翻倍且无收益);
  • 对成本敏感的消费电子,我接受NPU利用率仅60%,但必须确保BOM中每颗电阻电容都有2家以上供应商;
  • 对长生命周期的能源设备,我宁可牺牲20%性能,也要选择承诺15年供货的车规芯片。

还有一个血泪教训:永远不要让单一芯片决定项目成败。我们在所有项目中强制要求:

  • 主控芯片必须有Pin-to-Pin兼容的降规替代料;
  • NPU加速必须支持OpenVINO/Triton等跨平台框架,避免绑定私有SDK;
  • 所有驱动必须抽象出HAL(硬件抽象层),确保芯片更换时仅需重写HAL层。

这样当某天某颗芯片突然停产,我们能在72小时内完成替代方案验证,而不是陷入数月的重新设计。技术在变,但“可控的冗余”和“可替换的设计”永远是边缘AI项目的生命线。

最后分享个小技巧:每次选型会议结束前,我都会问团队一个问题——“如果明天这颗芯片宣布停产,我们最快的补救方案是什么?”如果答案不够清晰,那就继续讨论,直到每个人都能脱口而出。因为真正的选型完成,不是签下采购单的那一刻,而是当你面对突发状况时,心里有底的那一刻。

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

STM32开源项目实战:代码、原理图与仿真三件套完整指南

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

作者头像 李华
网站建设 2026/9/25 1:13:29

PLCSIM Advanced与WinCC仿真连接6大陷阱,工程师必看

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

作者头像 李华
网站建设 2026/9/25 1:13:24

JESD204C 32Gb/s物理层实现核心挑战与工程落地要点

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

作者头像 李华
网站建设 2026/9/25 1:12:10

反激电源VDS尖峰根治:TVS管选型与实测,从732V降到508V

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

作者头像 李华
网站建设 2026/9/25 1:11:50

SpringBoot校园组团平台实战:轻量级服务中台设计与落地

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

作者头像 李华
网站建设 2026/9/25 1:11:29

单电源LM358运放1/2 VCC偏置电路设计与实战避坑指南

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

作者头像 李华