ARM GIC中断路由机制与GICD_IROUTER寄存器配置详解
1. GIC中断路由机制与GICD_IROUTER寄存器概述在嵌入式系统尤其是像TI AM62L这样的多核异构处理器平台上中断管理是系统稳定性和实时性的基石。通用中断控制器GIC作为ARM架构的标准中断控制器其核心职责远不止是简单地接收和转发中断信号。它更像是一个高度可编程的“交通指挥中心”负责将来自数十甚至上百个外设如UART、DMA、GPIO、定时器的中断请求精准、高效地分发到最合适的处理器核心Cortex-A53、Cortex-M4F等上。而GICD_IROUTERInterrupt Router寄存器就是这个指挥中心里为每一个“车道”即每一个共享外设中断SPI设置“目的地指示牌”的关键配置单元。为什么需要这么精细的控制想象一个典型的工业控制场景一个高速ADC采样完成触发中断需要被低延迟地送到实时核Cortex-M4F进行处理同时一个USB大容量数据传输完成中断其对实时性要求不高但数据处理复杂更适合送到高性能应用核Cortex-A53。如果所有中断都默认涌向核心0不仅会造成该核心负载过重影响关键实时任务还会因为不必要的核间中断IPI转发引入额外的延迟。GICD_IROUTER的存在正是为了让开发者能够根据中断的紧迫性、处理器的特长以及系统的负载情况进行静态或动态的路径规划。在AM62L的GIC-400/600架构中中断分为几种类型私有外设中断PPI和软件生成中断SGI是每个核心私有的而共享外设中断SPI通常ID从32开始则是全局的需要路由。GICD_IROUTER寄存器组就是专门为这些SPI配置路由的。每一个SPI中断ID都对应一对GICD_IROUTERn寄存器通常是64位分为LOWER和UPPER两个32位寄存器。通过配置它们你可以告诉GIC“当ID为X的中断发生时请把它送给哪个CPU接口即哪个核心”。从你提供的AM62L技术参考手册片段可以看出其GICD_IROUTER寄存器组从GICD_IROUTER897开始这暗示了该芯片的SPI中断ID范围至少从897开始这与AM62L丰富的外设集成度是相符的。手册中每个GICD_IROUTERn_LOWER寄存器都清晰地定义了三个关键字段IRM位31、A1位[15:8]和A0位[7:0]。而对应的UPPER寄存器则全部为保留位RESERVED在AM62L的上下文中通常意味着目标地址的高32位未使用或固定为0路由决策主要由LOWER寄存器的低16位A1和A0以及IRM位完成。理解这三个字段是掌握GIC中断路由配置的钥匙。2. GICD_IROUTER寄存器字段深度解析2.1 IRM位中断路由模式选择IRMInterrupt Routing Mode位是GICD_IROUTER寄存器中最高位Bit 31它是一个单比特的控制开关决定了该中断的路由策略是“一对一”还是“一对多”。当IRM 0时这是最常用也是最直观的模式称为定向路由Targeted Routing。在此模式下A1和A0字段组合形成一个8位或16位的目标标识符Affinity。这个标识符会与系统中各个CPU接口的亲和性值进行匹配。在AM62L这类多核处理器中通常每个核心都有一个唯一的亲和性值例如Cortex-A53 Core 0的亲和性可能是0x0Core 1是0x1而Cortex-M4F核心可能有不同的亲和性域和编号。当中断发生时GIC分发器Distributor会检查该中断配置的目标亲和性并将其转发给匹配的CPU接口。这种模式用于将特定外设中断绑定到指定的核心实现负载隔离或实时性保障。当IRM 1时则启用广播路由Broadcast Routing或称为“1-of-N”模式。在此模式下A1和A0字段的值被忽略通常应写0。中断会被发送给所有已使能该中断的CPU接口中优先级最高的那个。这里的“优先级”是由GIC的BPRBinary Point Register和核心的优先级掩码等共同决定的运行时的动态结果。这种模式常用于那些由哪个核心处理都可以的中断或者用于实现某种简单的负载均衡但需要注意它可能引入不确定性不适合对处理核心有严格要求的场景。实操心得IRM位的默认选择在绝大多数嵌入式产品开发中IRM位默认应配置为0即采用定向路由。这能保证中断行为的确定性和可预测性是系统稳定性的基础。广播模式IRM1仅在少数特定场景下使用例如某些操作系统调度器实现的跨核心任务唤醒中断或者在某些自定义的负载均衡算法中。在AM62L上如果你没有特殊需求将所有SPI的IRM位清零是最稳妥的做法。2.2 A1与A0字段目标亲和性编码在IRM0定向路由时A1和A0字段共同定义了中断的目标位置。根据GIC架构手册如GICv3目标地址是一个完整的亲和性路由标识但在许多具体实现如AM62L的GIC-400中我们通常只使用其最基础的几级。A0字段位[7:0]通常表示目标CPU的最低级亲和性Affinity level 0。在一个多核集群中这直接对应着具体的核心编号。例如在一个四核Cortex-A53集群中核心0、1、2、3的A0值可能分别对应0x0、0x1、0x2、0x3。A1字段位[15:8]表示第一级亲和性Affinity level 1。在更复杂的多集群或多处理器系统中用于区分不同的CPU集群。例如AM62L可能包含一个Cortex-A53应用处理器集群和一个Cortex-M4F微控制器集群A1字段可以用来区分这两个集群。在AM62L的上下文中从寄存器定义看A1和A0各占8位但实际有效的位宽需要参考芯片的具体集成手册。通常对于单芯片集成高位的A1可能固定为0路由仅由A0决定。配置时必须查阅AM62L的《技术参考手册》中关于GIC章节的“中断映射”或“CPU接口亲和性”部分以获取准确的亲和性值。错误的亲和性编码会导致中断无法送达目标核心表现为中断丢失或挂起。2.3 寄存器寻址与SPI ID的映射关系GICD_IROUTER寄存器是一个密集的数组其地址与SPI中断ID有直接的线性映射关系。GIC架构规定对于中断IDn(n 32)其对应的GICD_IROUTER寄存器的地址偏移量计算公式通常为Offset 0x6000 8 * (n - 32)但具体到AM62L其基地址和偏移量需要以数据手册为准。你提供的片段中GICD_IROUTER897_LOWER的偏移是0x7C10这可以帮助我们反推和验证其SPI的起始ID和计算方式。每个GICD_IROUTERn占用8字节64位因此用相邻的LOWER和UPPER两个32位寄存器来表示。在AM62L上UPPER寄存器全为保留位这意味着其目标地址路由可能只使用了32位或更少的地址空间高32位在当前实现中未启用。在编程时向UPPER寄存器写入0是安全的做法。3. 在AM62L平台上配置GICD_IROUTER的实操指南3.1 配置前的准备工作获取关键信息在动手写代码之前必须收集齐以下信息这些通常来自AM62L的《技术参考手册》和《数据手册》GIC Distributor基地址在AM62L的内存映射中GIC Distributor模块的物理基地址。例如可能是0x0180_0000。所有GICD_*寄存器的访问都是基于此地址的偏移。目标CPU的亲和性值明确你希望接收中断的那个核心的亲和性编码。例如Cortex-A53 Core 0的亲和性可能是(A10x0, A00x0)Cortex-M4F核心可能是(A10x0, A00x100)。这个信息至关重要且因平台而异。外设中断IDSPI Number你需要配置的那个具体外设中断的全局ID。例如某个GPIO模块的中断可能是SPI ID 200。这需要查询AM62L的《技术参考手册》中的“Interrupt Map”或“Interrupt Sources”表格。3.2 寄存器编程步骤与示例代码假设我们要将SPI ID 200假设对应某个UART中断路由到Cortex-A53 Core 1其亲和性为 (A10x0, A00x1)并且采用定向路由IRM0。步骤一计算寄存器地址首先需要找到GICD_IROUTER200寄存器的地址。根据你提供的寄存器命名规律GICD_IROUTER897开始我们需要确认AM62L的SPI起始ID和计算公式。假设其SPI从ID 32开始且每个路由寄存器占用8字节那么GICD_IROUTERn的地址偏移 GICD_IROUTERn_BASE 8 * (n - 32)其中GICD_IROUTERn_BASE是第一个SPI路由寄存器的基址。我们需要从手册中确认这个基址。为简化示例我们假设已知SPI ID 200对应的GICD_IROUTER200_LOWER偏移量为0x7C10这只是一个假设必须用真实值替换。步骤二构建寄存器值对于GICD_IROUTER200_LOWER寄存器Bit 31 (IRM): 设置为0(定向路由)Bit [30:16]: 保留位写0Bit [15:8] (A1): 设置为0x00Bit [7:0] (A0): 设置为0x01因此该32位寄存器的值应为0x0000_0101注意这里IRM在bit31值为0x0A10x00A00x01但需要按位组合。更准确的计算是(0 31) | (0x00 8) | 0x01结果是0x00000101。GICD_IROUTER200_UPPER寄存器全部保留写入0x0000_0000。步骤三编写C代码示例以下是一个裸机或底层驱动中常用的配置函数示例#include stdint.h // 假设的宏定义必须根据AM62L实际手册修改 #define GICD_BASE (0x01800000U) #define GICD_IROUTERn_OFFSET(n) (0x6000U 8 * ((n) - 32)) // 示例公式 #define GICD_IROUTER_LOWER_OFFSET 0x0 #define GICD_IROUTER_UPPER_OFFSET 0x4 // SPI ID 200 的目标核心亲和性 (A10, A01) #define TARGET_A1 (0x00) #define TARGET_A0 (0x01) void configure_spi_routing(uint32_t spi_id, uint8_t target_a1, uint8_t target_a0) { volatile uint32_t *gicd_router_lower; volatile uint32_t *gicd_router_upper; uint32_t router_lower_val; uint64_t router_addr; // 1. 计算目标寄存器的绝对地址 router_addr GICD_BASE GICD_IROUTERn_OFFSET(spi_id); gicd_router_lower (volatile uint32_t *)router_addr; gicd_router_upper (volatile uint32_t *)(router_addr 4); // UPPER寄存器在LOWER后4字节 // 2. 构建GICD_IROUTERn_LOWER寄存器值 // IRM0, 保留位[30:16]0, A1target_a1, A0target_a0 router_lower_val (0u 31) | // IRM bit ((target_a1 0xFF) 8) | // A1 field (target_a0 0xFF); // A0 field // 3. 执行配置写入 // 注意在配置路由前建议先禁用该中断通过GICD_ICENABLER *gicd_router_lower router_lower_val; *gicd_router_upper 0x00000000U; // 写入UPPER寄存器保留位清零 // 4. 内存屏障确保写入完成 __asm__ volatile(dsb sy : : : memory); } // 使用示例将SPI 200路由到Core 1 (A10, A01) int main(void) { // ... 其他初始化如GIC初始化、使能Distributor ... configure_spi_routing(200, TARGET_A1, TARGET_A0); // ... 后续配置如设置中断优先级、使能该中断 ... return 0; }3.3 配置流程与最佳实践初始化顺序在配置GICD_IROUTER之前必须确保GIC Distributor已使能设置GICD_CTLR寄存器。通常在系统启动早期由启动代码或安全监控程序完成GIC的全局初始化。先禁用再配置在修改某个中断的路由配置前最佳实践是先通过GICD_ICENABLER寄存器禁用该中断配置完成后再通过GICD_ISENABLER重新使能。这可以防止在配置过程中发生不可预测的中断。亲和性验证写入亲和性值后可以通过回读GICD_IROUTER寄存器来验证配置是否成功。同时在操作系统如Linux环境下可以通过/proc/interrupts查看每个中断在各CPU上的计数来验证路由是否生效。考虑安全状态在支持ARM TrustZone的芯片如AM62L上GIC寄存器可能有安全和非安全实例。你需要根据当前CPU的运行状态Secure或Non-secure访问正确的寄存器组。访问错误的实例会导致配置无效或触发异常。4. 常见问题排查与调试技巧即使按照手册配置中断路由问题在嵌入式开发中仍很常见。下面是一些实战中积累的排查思路。4.1 中断无法触发或无法到达目标核心这是最典型的问题。可以按照以下清单进行排查排查步骤检查点可能原因与解决方法1. 外设级外设中断是否已使能检查外设模块自身的控制寄存器如UART的IER。没有使能信号就不会发出。2. GIC分发器级该SPI中断在GIC中是否已使能检查GICD_ISENABLER对应位。必须为1GIC才会转发。3. 路由配置级GICD_IROUTER配置是否正确确认SPI ID计算无误IRM和A1/A0字段值正确。重点核对目标核心的亲和性值。4. CPU接口级目标核心的CPU接口是否使能检查目标核心的GICC_CTLR或GICR_CTLR寄存器确保已使能中断处理。5. 核心级目标核心全局中断是否开启对于ARM核心确认CPSR的I位或F位已清零例如在AArch64下使用msr daifclr, #2。6. 优先级级中断优先级是否被屏蔽检查目标核心的GICC_PMR优先级掩码寄存器确保中断优先级高于屏蔽阈值。7. 信号路径物理连接是否正确在复杂SoC中中断可能经过互联模块。检查芯片勘误表确认有无已知硬件问题。调试技巧利用GIC状态寄存器GIC提供了丰富的状态寄存器用于调试GICD_ISPENDR/GICD_ICPENDR读取可以查看某个中断是否处于**挂起Pending**状态。如果外设触发后这里置位说明中断已送达GIC分发器。GICD_IROUTER回读你配置的寄存器确认写入值是否正确排除总线写入错误。GICC_IAR在目标核心的中断服务程序ISR开头读取此寄存器可以获取当前服务的中断ID。如果始终读不到预期ID说明中断未送达该核心的CPU接口。4.2 中断被错误的核心处理如果中断被送到了非预期的核心处理问题几乎肯定出在路由配置上。检查IRM位确认IRM是否错误地配置为1广播模式。在广播模式下中断可能被任何使能了它的核心处理。检查亲和性值确认A1和A0字段是否与你期望的目标核心完全匹配。一个常见的错误是混淆了核心编号和亲和性值例如认为Core 1的A0就是1但实际平台可能从0x100开始编号。检查默认路由有些GIC实现或Bootloader会为所有SPI设置一个默认路由例如全部指向Core 0。你的配置可能被之前的代码覆盖。确保你的配置代码在系统初始化的正确阶段执行并且没有其他代码在后面修改了你的配置。4.3 在Linux/FreeRTOS等OS下的配置差异在操作系统中通常不直接裸写GICD_IROUTER寄存器而是通过内核提供的API。Linux 使用irq_set_affinity()或cpumask相关函数。例如irq_set_affinity(irq_num, cpumask_of(cpu_id))。驱动开发者或系统工程师在设备树Device Tree中也可以指定中断的亲和性。内核的中断子系统会最终翻译为对GICD_IROUTER的写入。FreeRTOS 如果运行在AMP非对称多处理模式下且每个核心独立运行一个FreeRTOS实例那么每个实例需要独立初始化GIC并配置其需要处理的中断的路由。这通常需要在启动代码中完成确保每个核心的中断空间是隔离的。在OS环境下直接操作硬件寄存器是危险且不被支持的可能会破坏内核的中断管理状态。始终使用操作系统提供的抽象接口。4.4 AM62L特定注意事项复位值从手册看GICD_IROUTER寄存器复位后为0。IRM0A1/A00这意味着所有SPI默认路由到亲和性为(0,0)的核心通常是Core 0。如果你的应用核心不是Core 0就必须重新配置。保留位处理对于标记为RESERVED的位域如LOWER寄存器的位[30:16]和整个UPPER寄存器写入时必须保持为0读取时应忽略。随意写入非零值可能导致未定义行为。并发访问在多核系统中如果多个核心可能同时修改不同的GICD_IROUTER寄存器通常不需要额外锁因为寄存器是独立的。但如果修改同一个寄存器则需要软件同步机制如自旋锁来保护。勘误与限制务必查阅AM62L芯片的最新勘误表Silicon Errata。某些芯片版本在GIC中断路由上可能存在硬件限制或缺陷可能需要特定的软件规避措施。配置GIC中断路由是一个需要细致和准确性的工作。理解GICD_IROUTER每个比特的含义结合具体的硬件手册通过严谨的代码和系统的调试才能构建出稳定、高效的中断管理系统为整个嵌入式应用的实时性和可靠性打下坚实基础。在AM62L这样的复杂平台上花时间梳理清楚中断映射和路由关系在项目后期会避免许多难以追踪的稳定性问题。

相关新闻

STM32串口通信基础与HAL库实现

STM32串口通信基础与HAL库实现

1. STM32串口通信基础与实验目标 在嵌入式系统开发中,串口通信是最基础也最常用的外设功能之一。STM32系列微控制器内置了USART(通用同步异步收发器)模块,能够灵活地实现设备与上位机之间的数据交互。本次实验的核心目标是使用STM…

2026/7/19 6:07:45阅读更多 →
深入解析SoC的PRCM模块:时钟、电源与复位管理核心原理与实践

深入解析SoC的PRCM模块:时钟、电源与复位管理核心原理与实践

1. 深入理解PRCM:SoC的“心脏起搏器”与“能源中枢”在嵌入式系统开发,尤其是基于复杂SoC(片上系统)的应用处理器设计中,我们常常把CPU核、DSP、GPU这些计算单元比作系统的“大脑”和“肌肉”。然而,一个稳…

2026/7/19 6:07:45阅读更多 →
STM32多协议网关架构优化与FreeRTOS事件驱动实践

STM32多协议网关架构优化与FreeRTOS事件驱动实践

1. 项目概述:STM32多协议网关的架构革新在工业控制领域,多协议网关作为连接不同通信设备的枢纽,其性能直接影响整个系统的稳定性。传统基于轮询的架构在面对UART、CAN、SPI等多协议并发场景时,常常出现CPU资源耗尽、数据丢失等问题…

2026/7/19 6:07:45阅读更多 →
ngx_output_chain_get_buf

ngx_output_chain_get_buf

1 定义 ngx_output_chain_get_buf 函数 定义在 src/core/ngx_output_chain.cstatic ngx_int_t ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize) {size_t size;ngx_buf_t *b, *in;ngx_uint_t recycled;in ctx->in->buf;size ctx->buf…

2026/7/20 0:15:05阅读更多 →
互联网大厂常见Java面试题及答案汇总(2026持续更新)

互联网大厂常见Java面试题及答案汇总(2026持续更新)

金九银十即将来袭,又是一个跳槽的好季节,准备跳槽的同学都摩拳擦掌准备大面好几场,今天为大家准备了互联网面试必备的 1 到 5 年 Java 面试者都需要掌握的面试题,分别 JVM,并发编程,MySQL,Tomca…

2026/7/20 0:15:05阅读更多 →
python数据可视化技巧的100个练习 -- 31. 类别数据的点图

python数据可视化技巧的100个练习 -- 31. 类别数据的点图

重要性★★★☆☆ 难度★★☆☆☆ 你是一家零售公司的数据分析师。你的经理要求你可视化最近产品发布的客户满意度评级分布。评级是分类的,范围从“非常不满意”到“非常满意”。创建一个点图以显示每个评级类别的频率。使用 Python 进行数据处理和可视化。在代码中生成输入…

2026/7/20 0:13:05阅读更多 →
智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

在2026世界人工智能大会(WAIC 2026)举办期间,千里科技董事长、阶跃星辰董事长印奇作为特邀嘉宾出席大会开幕式并在大会主论坛(上午场)发表主题演讲《当智能体进入物理世界》。在印奇看来,"智能体"…

2026/7/20 0:13:05阅读更多 →
商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

7月18日,在WAIC 2026商汤科技 “基座大模型架构创新与生态合作论坛”上,商汤科技联合创始人、大装置事业群总裁杨帆发表《智变共生——加速AI基础设施持续升级》主题演讲,系统呈现了商汤大装置国产AI基础设施“技术-生态-商业”闭环布局&…

2026/7/20 0:13:05阅读更多 →
2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026年想在郑州学美发,很多零基础学员最先搜索的问题就是:郑州美发学校哪家好?这个问题没有一个只看学校名字就能得出的答案。因为不同学校的课程方向、学习周期、教学方式和适合人群并不一样。有的更适合零基础,有的偏向发型师进修,还有的只做某一项短期技术培训。对于完全没…

2026/7/20 0:11:05阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/20 0:50:54阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/20 0:50:54阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/20 0:50:54阅读更多 →
2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

2026/7/20 0:01:04阅读更多 →
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

2026/7/20 0:01:04阅读更多 →
C# 将逗号分割的字符串转换为long,并添加到List<long>

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

2026/7/20 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/19 22:50:49阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →