ARM day5
1. 什么是 GIC GIC 全称GICGeneric Interrupt Controller通用中断控制器是 ARM 公司专门为Cortex-A 系列内核设计的一款集中式中断控制器。 为什么需要 GIC随着 SoC片上系统复杂度提升芯片中集成了大量外设UART、I2C、SPI、GPIO、USB、Ethernet 等每个外设都可能产生中断。如果让 CPU 直接处理每个外设的中断硬件连线复杂每个外设都需要一根独立的中断线接到 CPU软件处理困难中断优先级、屏蔽、使能等操作难以统一管理多核支持差在多核 CPU 上难以实现中断路由GIC 解决了上述问题它将所有外设的中断集中管理统一向 CPU 提交中断请求。 GIC 主要功能功能说明中断使能/屏蔽控制每个中断源是否使能中断优先级管理多个中断同时到达时按优先级仲裁中断分发多核系统中将中断路由到指定的 CPU 核中断状态维护记录中断的 pending、active 等状态中断通知通过 IRQ 或 FIQ 信号通知 CPU GIC 版本演进版本架构适用 CPU说明GIC V132 位Cortex-A5早期版本GIC V232 位Cortex-A7、A9、A15i.MX6ULL 使用此版本GIC V364 位Cortex-A53、A57支持更大规模系统GIC V464 位Cortex-A53、A57V3 增强版支持虚拟中断GIC V5新架构最新高性能芯片下一代架构i.MX6ULL内置的是GIC-400GIC V2 架构最多支持 160 个中断源。2. 什么是协处理器ARM Cortex-A7 内核配备了几个协处理器 协处理器Coprocessor定义协处理器是一种协助主处理器完成特定功能的专用处理单元。在 ARM 架构中协处理器通过一组专用的指令MCR/MRC和寄存器与主 CPU 交互用于完成主 CPU 不擅长或效率不高的任务。 ARM 协处理器编号ARM 架构最多支持16 个协处理器编号为cp0 ~ cp15协处理器用途cp0 ~ cp13由芯片厂商自行定义保留cp14调试协处理器Debugcp15系统控制协处理器最常用⚠️ Cortex-A 系列实际只实现了cp14和cp15其他协处理器编号保留未用。 cp15 系统控制协处理器cp15 是 ARM 架构中最重要的协处理器通过它可以访问 CPU 内部的关键控制寄存器主寄存器 (CRn)主要功能c0ID 寄存器、Cache 类型、TRMc1SCTLR系统控制寄存器控制 MMU、Cache、异常向量表位置等c2TTBR转换表基址寄存器配置页表c3DACR域访问控制寄存器c5FSR故障状态寄存器c6FAR故障地址寄存器c7Cache 控制、TLB 管理c8TLB 控制c12VBAR异常向量表基址寄存器c13FCSE、上下文 IDc15CBARGIC 基址寄存器Cortex-A7 特有 协处理器操作指令MRC{cond} p15, opc1, Rt, CRn, CRm, opc2 ; 读取 cp15 寄存器到 ARM 寄存器 MCR{cond} p15, opc1, Rt, CRn, CRm, opc2 ; 将 ARM 寄存器写入 cp15 寄存器常用示例; 读取 SCTLR 寄存器到 r0 mrc p15, 0, r0, c1, c0, 0 ​ ; 将 r0 写回 SCTLR 寄存器 mcr p15, 0, r0, c1, c0, 0 ​ ; 读取 GIC 基址到 r1CBAR 寄存器 mrc p15, 4, r1, c15, c0, 0 ​ ; 设置异常向量表基址VBAR 寄存器 mcr p15, 0, r0, c12, c0, 0 Cortex-A7 协处理器总结项目数量/内容理论支持数16 个cp0 ~ cp15实际实现数2 个cp14、cp15cp14调试协处理器cp15系统控制协处理器MMU、Cache、异常向量、GIC 基址3. 为什么要将异常向量表重映射如何重映射异常向量表 为什么要重映射异常向量表原因一异常向量表位置的固定性ARM 处理器上电复位后异常向量表默认位于异常向量表基址触发条件0x00000000SCTLR.V 0默认0xFFFF0000SCTLR.V 1高端向量绝大多数 MCU/MPU 的启动代码Boot ROM都映射在低地址 0x00000000所以默认情况下异常向量表位于此处。原因二每项向量只有 4 字节异常向量表中每项只有 4 字节刚好放下 1 条跳转指令无法容纳完整的中断服务程序; 默认异常向量表 b reset_handler ; 0x00: 占 4 字节 b undefined_handler ; 0x04: 占 4 字节 b swi_handler ; 0x08: 占 4 字节 b prefetch_abort_handler ; 0x0C: 占 4 字节 b data_abort_handler ; 0x10: 占 4 字节 b reserved_handler ; 0x14: 占 4 字节 b irq_handler ; 0x18: 占 4 字节 b fiq_handler ; 0x1C: 占 4 字节真正的中断服务程序往往需要几十甚至上百条指令无法直接放在异常向量表中。原因三NOR Flash / ROM 中无法直接写代码NOR Flash支持 XIP片内执行但写入困难Boot ROM只能读不能写如果异常向量表位于 NOR Flash 或 ROM 中运行后无法修改也难以调试。重映射的好处将异常向量表重映射到RAM高速、可读写后优势说明可在 RAM 中修改方便调试和动态更新访问速度快RAM 访问速度远高于 Flash可容纳完整程序异常向量表每项可以是一个完整函数 如何重映射异常向量表方法一通过 SCTLR.V 位切换基址Cortex-A7 通过 cp15 的c1SCTLR寄存器的V 位bit 13控制异常向量表位置SCTLR.V异常向量表基址00x00000000默认10xFFFF0000操作示例mrc p15, 0, r0, c1, c0, 0 ; 读取 SCTLR 到 r0 orr r0, r0, #(1 13) ; 设置 V 位高端向量 0xFFFF0000 mcr p15, 0, r0, c1, c0, 0 ; 写回 SCTLR⚠️ 这种方法只能切换到 0x00000000 或 0xFFFF0000 两个固定地址灵活性差。方法二通过 VBAR 寄存器设置基址Cortex-A7 推荐Cortex-A7 提供VBARVector Base Address Register寄存器cp15 的c12可以任意指定异常向量表的基址; 将异常向量表基址设置为 0x87800000 ldr r0, 0x87800000 mcr p15, 0, r0, c12, c0, 0 ; 写入 VBAR这样就可以将异常向量表放到 RAM 的任意位置如 0x87800000方便调试和管理。方法三完整的异常向量表重映射流程i.MX6ULL 示例; 1. 初始化 DDR bl init_ddr ​ ; 2. 将异常向量表代码拷贝到 DDR 地址 0x87800000 ldr r0, _start ; 源地址Flash 中的异常向量表 ldr r1, 0x87800000 ; 目标地址DDR ldr r2, __vector_end ; 结束地址 cpy: ldmia r0!, {r3 - r10} stmia r1!, {r3 - r10} cmp r0, r2 ble cpy ​ ; 3. 通过 VBAR 寄存器重映射异常向量表 ldr r0, 0x87800000 mcr p15, 0, r0, c12, c0, 0 ​ ; 4. 切换 ARM 状态、设置栈指针然后跳转到 C 语言 main 函数 cps #0x1F ; 切换到 System 模式 msr cpsr_c, #0xD3 ; 切换到 SVC 模式 ldr sp, 0x80800000 ; 设置 SVC 模式栈指针 msr cpsr_c, #0xD7 ; 切换到 Abort 模式 ldr sp, 0x80800000 msr cpsr_c, #0xDB ; 切换到 Undef 模式 ldr sp, 0x80800000 msr cpsr_c, #0xD2 ; 切换到 IRQ 模式 ldr sp, 0x80800000 msr cpsr_c, #0xD1 ; 切换到 FIQ 模式 ldr sp, 0x80800000 msr cpsr_c, #0x13 ; 切换到 SVC 模式 ​ b main ; 跳转到 main 函数 异常向量表示例在 DDR 0x87800000 处; 异常向量表 b reset_handler ; 0x00: 复位 b undefined_handler ; 0x04: 未定义指令 b swi_handler ; 0x08: 软中断 b prefetch_abort_handler ; 0x0C: 预取中止 b data_abort_handler ; 0x10: 数据中止 b reserved_handler ; 0x14: 保留 b irq_handler ; 0x18: IRQ 中断 b fiq_handler ; 0x1C: FIQ 中断4. GIC 支持多少个中断分为哪几类 GIC 中断总数GICV2 架构最多支持1020 个中断源编号为ID0 ~ ID1019。 中断分类GIC 将所有中断分为3 大类类别全称中断 ID 范围数量用途SGISoftware Generated Interrupts0 ~ 1516软件生成中断用于 CPU 核间通信PPIPrivate Peripheral Interrupts16 ~ 3116私有外设中断每个 CPU 核独享SPIShared Peripheral Interrupts32 ~ 1019988共享外设中断所有 CPU 共享 三类中断详细说明1. SGI软件生成中断编号0 ~ 15触发方式由软件写 GIC 的SGIR 寄存器主动触发典型用途多核 CPU 之间的通信IPIInter-Processor Interrupt例如 CPU0 需要 CPU1 做一些工作时CPU0 触发一个 SGI 通知 CPU1特点完全由软件控制灵活性高只能路由到其他 CPU 核不能发给触发它的核自身2. PPI私有外设中断编号16 ~ 31触发来源外设但每个外设只对应一个 CPU 核典型外设本地 Timer看门狗Watchdog性能监控计数器特点每个 CPU 核有自己独立的 PPI多核系统中每个核看到的 PPI 可能不同3. SPI共享外设中断编号32 ~ 1019触发来源SoC 中的各种外设典型外设GPIO中断UART、I2C、SPI中断USB、Ethernet、SD 卡中断LCD、PWM、ADC中断特点所有 CPU 核共享GIC 负责决定路由到哪个 CPU 核数量最多是嵌入式开发中最常接触的一类中断 GIC 中断分类示意图GIC最多 1020 个中断 ID 0 ~ 1019 │ ├─── SGI0 ~ 15共 16 个软件中断核间通信 │ └─ 写 SGIR 寄存器触发 │ ├─── PPI16 ~ 31共 16 个私有外设中断 │ └─ 本地 Timer、Watchdog 等 │ └─── SPI32 ~ 1019共 988 个共享外设中断 └─ GPIO、UART、I2C、USB、SD 等 GIC 与 CPU 交互的关键寄存器寄存器偏移读写功能GICD_CTLR0x000R/WGIC 全局控制寄存器使能/禁用 GICGICD_ISENABLER0x100R/W中断使能寄存器GICD_ICENABLER0x180R/W中断禁用寄存器GICD_IPRIORITYR0x400R/W中断优先级寄存器GICD_ITARGETSR0x800R/W中断目标 CPU 寄存器GICD_SGIR0xF00W软件生成中断寄存器GICC_CTLR0x2000R/WCPU 接口控制寄存器GICC_PMR0x2004R/W中断优先级屏蔽寄存器GICC_IAR0x200CR中断确认寄存器读取得到中断 IDGICC_EOIR0x2010W中断结束寄存器写入通知 GIC 中断处理完成5. i.MX6ULL 中支持多少个中断 i.MX6ULL 中断总览i.MX6ULL 共支持160 个中断源编号ID0 ~ ID159其中中断类型ID 范围数量说明SGI0 ~ 1516保留软件可触发PPI16 ~ 3116私有外设中断本地 Timer、Watchdog 等SPI32 ~ 159128共享外设中断GPIO、UART、I2C 等合计0 ~ 159160GIC V2 架构支持 i.MX6ULL 的 GIC 实现为GIC-400属于GIC V2版本采用 32 位架构与 Cortex-A7 内核配套。 i.MX6ULL 常用中断源示例中断 ID中断名称说明32 32×nGPIO1_Combined_0_15_IRQn ~ GPIO5_Combined_0_15_IRQnGPIO1 ~ GPIO5 中断32 16GPIO1_Combined_16_31_IRQnGPIO1 第 16 ~ 31 引脚中断.........58UART1_IRQnUART1 中断59UART2_IRQnUART2 中断60UART3_IRQnUART3 中断61UART4_IRQnUART4 中断62 32nI2C1_IRQn ~ I2C4_IRQnI2C 中断.........完整中断号可参考 NXP 官方手册i.MX6ULL Reference Manual中的Chapter 3: Interrupts章节。 i.MX6ULL 中断处理流程i.MX6ULL 中断处理流程 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1. 中断源发出中断请求外设产生中断信号 ↓ 2. CPU 响应中断、比较中断优先级 ↓ 3. 保护现场CPSR → SPSR_modeLR 保存返回地址 ↓ 4. 切换到 IRQ 模式跳转到异常向量表 ↓ 5. 执行中断服务函数irq_handler ↓ 6. 读取 GIC 的 GICC_IAR 寄存器得到中断 ID ↓ 7. 根据中断 ID 调用对应的中断处理函数 ↓ 8. 处理完成后写 GIC 的 GICC_EOIR 寄存器通知 GIC ↓ 9. 恢复现场SPSR → CPSR返回到被打断的程序继续执行 i.MX6ULL 中断初始化示例伪代码/* 1. 初始化 GIC 控制器 */ void GIC_Init(void) { /* 关闭所有 SPI 中断 */ for (i 32; i 160; i 32) { GICD_ICENABLER[i / 32] 0xFFFFFFFF; } ​ /* 设置所有 SPI 中断优先级为最低 */ for (i 32; i 160; i 4) { GICD_IPRIORITYR[i / 4] 0xFFFFFFFF; } ​ /* 设置所有 SPI 中断目标为 CPU0 */ for (i 32; i 160; i 4) { GICD_ITARGETSR[i / 4] 0x01010101; } ​ /* 使能 GIC */ GICD_CTLR 3; GICC_CTLR 1; } ​ /* 2. 使能某个外设的中断如 GPIO1_18 */ void GIC_EnableIRQ(IRQn_Type IRQn) { GICD_ISENABLER[IRQn / 32] | (1 (IRQn % 32)); } ​ /* 3. 设置中断优先级 */ void GIC_SetPriority(IRQn_Type IRQn, uint8_t priority) { GICD_IPRIORITYR[IRQn / 4] | (priority ((IRQn % 4) * 8)); } ​ /* 4. 中断服务函数Cortex-A7 通用入口 */ void irq_handler(void) { uint32_t intID GICC_IAR; /* 读取中断 ID */ /* 根据中断 ID 调用对应处理函数 */ system_irq_handler(intID); GICC_EOIR intID; /* 通知 GIC 中断处理完成 */ } CPSR 中断相关控制位位名称功能IIRQ 中断禁止位0 使能 IRQ1 禁止 IRQFFIQ 中断禁止位0 使能 FIQ1 禁止 FIQ相关汇编指令cpsie i ; 使能 IRQ 中断CPSR.I 0 cpsid i ; 禁止 IRQ 中断CPSR.I 1 cpsie f ; 使能 FIQ 中断 cpsid f ; 禁止 FIQ 中断 msr cpsr_c, r0 ; 修改 CPSR 低 8 位 总结序号题目核心要点1什么是 GICARM 设计的通用中断控制器集中管理 SoC 中所有中断2协处理器ARM 支持 16 个cp0~cp15Cortex-A7 实现 2 个cp14 调试、cp15 系统控制3重映射异常向量表原因默认 0x00 每项只有 4 字节且在 Flash/ROM 中不便修改方法通过 VBAR 寄存器cp15.c12任意指定基址4GIC 中断分类共 1020 个SGI0~15软件中断、PPI16~31私有外设、SPI32~1019共享外设5i.MX6ULL 中断数160 个0~159GIC V2 架构配套 Cortex-A7 处理器 中断相关关键寄存器速查寄存器含义操作SCTLR.V(cp15.c1.bit13)异常向量表位置0: 0x000000001: 0xFFFF0000VBAR(cp15.c12)异常向量表基址推荐使用可设置为任意地址CBAR(cp15.c15)GIC 基址寄存器用于获取 GIC 控制器基地址GICC_IAR(GIC 偏移 0x200C)中断确认寄存器读取得到中断 IDGICC_EOIR(GIC 偏移 0x2010)中断结束寄存器通知 GIC 中断处理完成

相关新闻

C++自定义内存管理:资源受限环境下的固定大小内存池实现

C++自定义内存管理:资源受限环境下的固定大小内存池实现

1. 项目概述:为什么要在资源受限环境中自定义内存管理?在嵌入式系统、物联网设备、游戏引擎或者高频交易系统里工作过的C开发者,对“内存”这个词的感受,和写桌面应用或Web后端的同行截然不同。在这些资源受限的环境里&#xff0c…

2026/7/22 4:34:29阅读更多 →
Cocos Creator 2.x安卓打包全流程:从环境配置到APK发布实战

Cocos Creator 2.x安卓打包全流程:从环境配置到APK发布实战

1. 项目概述与核心价值最近在整理过往项目资料时,翻到了一个用Cocos Creator 2.4.15版本开发的棋牌游戏源码。这算是一个比较有“情怀”的项目了,它不像现在市面上那些动辄3D、特效拉满的重度游戏,而是专注于还原经典棋牌玩法,比如…

2026/7/22 4:34:29阅读更多 →
Unity 3D毕设选题指南:六大前沿方向与实战避坑策略

Unity 3D毕设选题指南:六大前沿方向与实战避坑策略

1. 项目概述:为什么Unity 3D是计算机专业毕设的“黄金赛道”?又到了一年一度让计算机专业同学“头秃”的毕设选题季。看着身边同学有的在卷算法,有的在搞Web应用,你是不是也在纠结:我的毕设到底该做什么,才…

2026/7/22 4:34:29阅读更多 →
Unity渲染优化实战:遮挡剔除与LOD技术深度解析与应用

Unity渲染优化实战:遮挡剔除与LOD技术深度解析与应用

1. 项目概述:为什么你的Unity场景总是“卡”?做Unity开发的朋友,尤其是做稍微复杂一点的3D项目,比如开放世界、大型室内场景或者MMO,肯定都遇到过这个头疼的问题:编辑器里跑得挺流畅,一打包出来…

2026/7/22 5:28:40阅读更多 →
Vue3 大屏适配组件(Scale / Rem 双方案一键切换)

Vue3 大屏适配组件(Scale / Rem 双方案一键切换)

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923;一键切换「整体 Scale 缩放」「Rem 等分适配」 窗口自动监听 resize 适配设计稿 1920*1080 Vue3 全局直接引入用一、新建组件 ScreenAdapter.vue <template><div clas…

2026/7/22 5:28:40阅读更多 →
以智能制造为导向的数字孪生工厂构建方法与应用

以智能制造为导向的数字孪生工厂构建方法与应用

摘要随着工业 4.0 与智能制造战略的深化推进&#xff0c;数字孪生已成为制造工厂实现数字化转型、提升生产柔性与运营效率的核心技术路径。本文从智能制造的实际业务需求出发&#xff0c;系统梳理数字孪生工厂的五层核心技术架构&#xff0c;详细拆解从需求定义到落地应用的全流…

2026/7/22 5:28:40阅读更多 →
视频编码与特效合成:电影预告片制作技术全解析

视频编码与特效合成:电影预告片制作技术全解析

这次我们来看一个电影项目相关的技术话题——《有虎出没》预告片的制作与传播分析。作为FIRST青年电影展主竞赛入围作品&#xff0c;这部影片的预告片制作涉及视频剪辑、特效处理、色彩校正等多个技术环节&#xff0c;对于从事影视制作和技术研究的朋友来说&#xff0c;值得关注…

2026/7/22 5:28:40阅读更多 →
C++数值积分与插值技术:从原理到工程实现详解

C++数值积分与插值技术:从原理到工程实现详解

1. 项目概述&#xff1a;为什么数值计算是C工程师的必修课&#xff1f;如果你是一名C开发者&#xff0c;无论是从事游戏引擎、量化金融、科学计算还是工业仿真&#xff0c;迟早会遇到一个绕不开的坎&#xff1a;如何让计算机高效、准确地处理那些无法用简单公式表达的复杂函数&…

2026/7/22 5:28:40阅读更多 →
Unity集成WebRTC直播流:基于WebView插件的快速实现方案

Unity集成WebRTC直播流:基于WebView插件的快速实现方案

1. 项目概述&#xff1a;当Unity遇上WebRTC直播流在Unity里直接播放一个WebRTC直播流&#xff0c;这个需求听起来是不是有点“跨界”&#xff1f;如果你是Unity开发者&#xff0c;接到一个任务&#xff0c;需要在你的游戏、虚拟展厅或者AR/VR应用中&#xff0c;嵌入一个来自网页…

2026/7/22 5:26:39阅读更多 →
Go语言静态资源打包方案对比与实践指南

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

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

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

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

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

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

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

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

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序&#xff0c;最常见的矛盾是预算有限&#xff0c;但又不希望功能太单薄&#xff1b;没有技术团队&#xff0c;但又希望后续能自己运营&#xff1b;想快速上线&#xff0c;又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”&#xff0c;很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销&#xff0c;最怕钱花完了&#xff0c;资产没有留下。 效果广告能带来一段时间的曝光&#xff0c;但预算停止后&#xff0c;流量往往也随之停止。短视频内容可能在几天内冲高&#xff0c;也可能很快沉下去。AI搜索时代&#xff0c;企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定&#xff1a;何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮&#xff0c;用户已经关窗口了 Agent 与人最大的区别是&#xff1a;人知道什么时候该停下来给答案&#xff0c;Agent 会一直"想"下去。你给 Agent 接…

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

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

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

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

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

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

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/21 18:53:30阅读更多 →