RT-Thread中断管理:从原理到实战,构建高效嵌入式系统
1. 从“轮询”到“中断”为什么嵌入式系统离不开它搞嵌入式开发尤其是用RT-Thread这类实时操作系统如果你还在用while(1)里不断查询标志位的方式来处理外部事件那效率可就太低了。想象一下你正在专心写代码但每过几秒就得停下来去看看门口有没有快递这活还怎么干中断机制就是那个帮你“听门铃”的家伙。当有重要事件比如按键按下、串口收到数据、定时器时间到发生时它能让CPU立刻停下手中的活优先去处理这个紧急事件处理完再回来接着干原来的事。在RT-Thread里中断管理不仅仅是硬件层面的概念更是连接底层硬件驱动和上层应用线程的关键桥梁。理解它是写出高效、稳定、实时响应嵌入式程序的基本功。无论是处理电机控制中的紧急停机信号还是物联网设备中及时响应网络数据包都绕不开对中断的精准掌控。2. RT-Thread中断管理的架构与核心概念RT-Thread作为一个实时操作系统其中断管理模型可以看作是在硬件中断机制之上构建了一层轻量级、可预测的软件抽象层。它并没有改变硬件中断的优先级、向量表等底层机制而是通过一套清晰的规则和API让开发者能够更安全、更方便地在多线程环境中使用中断。2.1 中断上下文的特殊性与限制中断服务程序ISR运行在一个非常特殊的环境下我们称之为“中断上下文”。它与普通的“线程上下文”有本质区别理解这些区别是避免系统崩溃的关键。首先中断上下文没有属于自己的线程控制块和栈空间。它直接借用当前被中断线程的栈或者在某些架构上使用独立的中断栈。这意味着在ISR内部你不能进行任何可能导致阻塞或切换线程的操作。比如你不能使用rt_thread_delay()来延时因为延时会导致线程切换而中断上下文没有线程可切换。同样你不能去获取一个可能被其他线程持有的信号量或互斥锁如果获取不到系统就会死锁。其次中断的响应必须尽可能快。中断处理的原则是“快进快出”。长时间的中断处理会阻塞所有更低优先级的中断甚至导致高优先级线程无法及时响应严重影响系统的实时性。因此ISR内通常只做最必要、最紧急的工作比如清除硬件中断标志、从硬件寄存器读取数据放到缓冲区、或者发送一个事件/信号量给某个等待的线程。繁重的数据处理、复杂的逻辑判断都应该交给专门的线程去完成。2.2 RT-Thread提供的中断服务接口为了规范和安全地在RT-Thread中使用中断系统提供了rt_hw_interrupt_install()和rt_hw_interrupt_mask()/unmask()等API。但更常用、更核心的是与中断底半部机制相关的接口。中断底半部Bottom Half是RT-Thread中断管理的一个核心思想。它将中断处理分为两部分顶半部Top Half即硬件ISR。它需要立刻执行处理紧急事务其执行时间应尽可能短。底半部Bottom Half通常是创建一个线程或使用软件定时器来执行那些不那么紧急、但比较耗时的任务。顶半部通过发送信号量、消息或设置事件标志等方式唤醒底半部线程。RT-Thread提供了多种机制来实现底半部信号量SemaphoreISR中释放信号量底半部线程中获取信号量并执行任务。这是最常用、最直观的方式。消息队列Message QueueISR中发送消息底半部线程接收并处理。适合传递数据。事件集EventISR中发送事件标志底半部线程等待事件集合。适合多个中断源触发同一处理线程的场景。软件定时器Software Timer在ISR中启动或重置一个单次定时器定时器的超时回调函数作为底半部执行。适用于需要延迟处理或防抖的场景。选择哪种机制取决于具体需求。传递数据用消息队列简单同步用信号量复杂条件触发用事件集延迟或周期任务用软件定时器。2.3 中断嵌套与优先级RT-Thread完全支持硬件中断嵌套。这意味着当一个低优先级的中断正在执行时如果发生了更高优先级的中断CPU会保存当前现场转而执行更高优先级的ISR待其执行完毕后再返回继续执行低优先级的ISR。中断优先级是由硬件如NVIC决定的RT-Thread不会去改变它。在配置工程时你需要根据实际硬件和需求在rtconfig.h或CubeMX等工具中正确配置各个外设中断的抢占优先级和子优先级。一个常见的经验是将系统心跳定时器如SysTick的中断优先级设置为最低以确保它不会被其他中断长时间阻塞从而影响系统调度的时间基准。注意在编写ISR时如果涉及到对RT-Thread内核数据结构的访问虽然不推荐在ISR中直接操作需要注意线程调度器的状态。RT-Thread提供rt_interrupt_enter()和rt_interrupt_leave()这对函数用于在ISR入口和出口处调用它们会更新系统内部的中断嵌套计数。这对于系统正确统计中断时间和进行调试追踪如使用ulog的irq日志级别非常重要。即使你的ISR非常简单也建议养成调用它们的习惯。3. 实战以按键中断与串口接收中断为例理论说再多不如动手写一遍。我们通过两个嵌入式开发中最常见的场景——按键消抖和串口不定长数据接收来具体看看如何在RT-Thread中实践中断管理。3.1 案例一按键中断与消抖处理按键消抖是中断处理中一个经典问题。机械按键在按下和释放的瞬间会产生一段时间的电平抖动如果直接在ISR中判断按键状态可能会误触发多次。正确的做法是将消抖逻辑放在底半部。步骤1硬件与驱动准备假设我们使用STM32的GPIO外部中断。首先在CubeMX中配置对应引脚为下降沿/上升沿触发并生成代码。RT-Thread的STM32 BSP通常已经做好了GPIO驱动框架我们可以使用rt_pin_attach_irq()函数来关联引脚和中断回调函数。步骤2顶半部ISR设计顶半部的工作必须极简static rt_base_t key2_pin; static struct rt_semaphore key_sem; // 用于同步的信号量 /* 中断回调函数顶半部 */ static void key_isr_callback(void *args) { /* 进入中断通知内核 */ rt_interrupt_enter(); /* 核心操作释放一个信号量告知底半部线程“有按键事件发生” */ rt_sem_release(key_sem); /* 离开中断 */ rt_interrupt_leave(); }这个ISR只做了一件事释放信号量。耗时可能只有几个微秒完全符合“快进快出”原则。步骤3底半部线程设计底半部线程负责所有“重活”消抖、状态判断、执行具体动作。static void key_process_thread_entry(void *parameter) { rt_uint32_t tick; while (1) { /* 等待信号量即等待按键中断发生 */ if (rt_sem_take(key_sem, RT_WAITING_FOREVER) RT_EOK) { /* 第一步延时消抖。等待约20ms避开机械抖动期 */ rt_thread_delay(rt_tick_from_millisecond(20)); /* 第二步再次确认引脚电平判断是按下还是释放 */ if (rt_pin_read(key2_pin) PIN_LOW) // 假设低电平为按下 { /* 确认是有效按下执行真正的业务逻辑例如打印或控制LED */ rt_kprintf(Key pressed!\\n); // ... 这里可以发送消息给其他线程或设置事件标志等 } /* 如果是释放抖动这里可以忽略或者处理释放事件 */ } } }为什么这样设计消抖在底半部在ISR中延时是灾难性的会阻塞整个系统。将rt_thread_delay放在线程中则只是挂起当前线程其他线程和中断照常运行系统整体不受影响。二次判断延时后再次读取引脚状态可以确保识别到的是稳定的按键状态而非抖动过程中的瞬态。3.2 案例二串口DMA接收不定长数据串口接收数据尤其是像Modbus、自定义协议这类不定长数据使用“中断空闲中断”配合DMA是高效且常见的方案。其核心思想是利用DMA自动搬运数据到缓冲区利用串口空闲中断来判定一帧数据接收完成。步骤1硬件与驱动配置以STM32为例需要开启串口的接收中断、空闲中断并配置DMA通道为循环模式或正常模式视具体需求。在RT-Thread的UART设备框架中这些底层配置通常已经在驱动中实现我们只需在注册设备时正确初始化。步骤2顶半部ISR驱动层已封装对于使用者来说顶半部ISR由RT-Thread的UART设备驱动完成。驱动中的ISR会处理以下事情判断是否是空闲中断IDLE。如果是空闲中断计算本次DMA接收到的数据长度通过查询DMA剩余传输计数。调用一个用户预先注册的回调函数并将数据长度和缓冲区地址作为参数传入。步骤3应用层回调函数底半部逻辑这才是我们需要编写的“底半部”static rt_uint8_t uart_rx_buffer[256]; // DMA接收缓冲区 static struct rt_messagequeue rx_mq; // 用于传递数据的消息队列 /* 串口接收完成回调函数 */ static void uart_rx_indicate(rt_device_t dev, rt_size_t size) { struct rx_msg msg; if (size 0) { msg.dev dev; msg.size size; /* 将“收到一帧数据”这个消息包含长度发送给处理线程 */ rt_mq_send(rx_mq, msg, sizeof(msg)); } /* 注意这里不要进行复杂的数据解析只是发送通知 */ } /* 数据解析线程 */ static void uart_parser_thread_entry(void *parameter) { struct rx_msg msg; while (1) { /* 等待消息队列通知 */ if (rt_mq_recv(rx_mq, msg, sizeof(msg), RT_WAITING_FOREVER) RT_EOK) { /* 此时数据已经在uart_rx_buffer中长度为msg.size */ /* 在这里进行完整的数据解析、协议解包、校验等耗时操作 */ process_uart_data(uart_rx_buffer, msg.size); } } }关键点与避坑指南缓冲区管理确保DMA缓冲区大小足够并处理好数据覆盖问题。对于循环DMA模式需要处理数据拆分成两段的情况。及时重启接收在回调函数处理完数据后或者解析线程消费完数据后需要及时重新使能DMA接收以准备接收下一帧数据。这个操作最好放在解析线程中避免在中断上下文操作设备。超时保护单纯依赖空闲中断可能不够健壮。可以结合一个软件定时器如果一段时间内没有收到新数据或没有触发空闲中断则强制认为一帧接收超时进行超时处理防止帧不完整导致的死等。4. 中断与线程的通信机制选择与性能考量中断如何通知线程是中断管理设计的重中之重。RT-Thread提供了多种IPC进程间通信机制但在中断上下文中它们的可用性和性能是不同的。通信机制是否可在ISR中使用特点与适用场景性能考量信号量是(rt_sem_release)最轻量仅用于同步通知不传递数据。适合“事件发生”类通知。操作速度最快系统开销极小。事件集是(rt_event_send)可发送多个事件标志等待线程可以等待任意或所有组合。适合多中断源触发同一任务。比信号量稍重但标志位操作依然很快。消息队列是(rt_mq_send)可以传递数据块。适合中断需要向线程传递数据的场景如ADC采样值。涉及内存拷贝数据量大时对ISR执行时间有影响。需确保消息队列不为满。邮箱是(rt_mb_send)传递4字节指针。可以传递数据缓冲区指针避免拷贝。传递指针效率高但需要谨慎管理缓冲区生命周期防止线程访问时数据被覆盖。互斥锁否会导致睡眠绝对不能在ISR中尝试获取(rt_mutex_take)。-线程挂起/恢复间接通过IPCISR中不应直接操作线程。-选择建议只通知不传数据优先选择信号量。例如按键中断、定时周期中断。需要传递少量数据几个字节使用消息队列。例如编码器脉冲计数。需要传递大量数据或内存块使用邮箱发送缓冲区指针或者使用消息队列发送指向数据的指针。务必注意如果ISR中填充的缓冲区是全局或静态变量要确保线程在下次ISR覆盖缓冲区前完成处理更安全的做法是使用环形缓冲区ringbufferISR写线程读。多个中断源触发同一逻辑使用事件集。例如多个报警传感器中断都触发同一个故障处理线程。一个关于消息队列的常见坑在ISR中调用rt_mq_send时如果消息队列已满函数会返回-RT_EFULL错误。如果不处理这个错误本次中断的数据就会丢失。因此对于可能溢出的高速数据流要么增大队列深度要么在ISR中检测错误并采取丢弃或替代策略如覆盖最旧数据同时在线程中尽快处理。更好的架构是使用无锁环形缓冲区作为底层数据池ISR向环形缓冲区写入线程从中读取再用信号量或事件来通知。5. 调试、分析与常见问题排查中断相关的问题往往比较隐蔽现象可能是系统偶尔卡死、数据丢失、定时不准等。掌握正确的调试方法至关重要。5.1 使用ulog记录中断日志RT-Thread的ulog组件支持按模块、按级别过滤日志非常强大。在调试中断时可以开启irq级别的日志。// 在rtconfig.h中或menuconfig中开启ulog和irq日志 #define ULOG_USING_ISR_LOG然后在代码中可以在ISR的入口和出口使用ulog的irq级别输出注意ISR中要使用rt_interrupt_enter/leavestatic void my_isr(void) { rt_interrupt_enter(); LOG_I(ISR, Enter my_isr); // ... ISR处理 LOG_I(ISR, Leave my_isr); rt_interrupt_leave(); }这样可以清晰地看到中断的触发顺序、嵌套情况和执行时间对于分析复杂的中断交互问题非常有帮助。5.2 常见问题与解决方案系统进入HardFault可能原因ISR中栈溢出操作了过大局部变量数组、访问非法内存地址、或进行了非法操作如在ISR中调用rt_thread_delay。排查检查HardFault发生时的调用栈使用rt_hw_backtrace函数或调试器。重点审查ISR中所有函数调用和内存访问。中断丢失或响应不及时可能原因中断被意外屏蔽全局或局部、中断优先级配置错误导致被高优先级中断长时间阻塞、ISR执行时间过长。排查确认中断使能位。使用逻辑分析仪或示波器测量中断引脚到ISR第一条指令的时间。使用ulog输出ISR进入时间戳计算执行耗时。数据竞争Data Race可能原因ISR和线程共享全局变量或缓冲区且没有保护。解决方案对于简单变量如状态标志如果只是ISR写、线程读且变量是原子类型如rt_atomic_t可能不需要额外保护。但更安全的做法是使用rt_enter_critical()/rt_exit_critical()关中断来保护这段读操作在线程中因为关中断时间极短通常可接受。对于复杂数据结构或缓冲区使用信号量或互斥锁进行保护。注意互斥锁只能在线程中获取所以保护逻辑应设计为线程在访问共享资源前加锁ISR中只进行“通知”发信号量由线程在获得信号量并加锁后再安全地访问共享资源。底半部线程得不到执行可能原因底半部线程优先级设置过低一直被其他高优先级线程抢占或者用于通知的IPC对象如信号量操作有误。排查提高底半部线程优先级确保其高于数据处理线程但低于关键实时线程。检查ISR中rt_sem_release等函数的返回值确保成功。5.3 中断执行时间的测量与优化实时性要求高的系统需要量化中断的最大执行时间。一个简单的方法是在ISR入口和出口读取系统滴答计数器或高精度定时器如DWT的CYCCNT寄存器。static rt_uint32_t isr_start_tick; static rt_uint32_t max_isr_time 0; static void my_isr(void) { rt_interrupt_enter(); isr_start_tick rt_tick_get(); // 获取进入时的tick // ... ISR处理 rt_uint32_t cost rt_tick_get() - isr_start_tick; if (cost max_isr_time) { max_isr_time cost; // 记录最大耗时 } rt_interrupt_leave(); }定期输出max_isr_time可以监控最坏情况下的中断响应时间。如果时间过长就必须优化检查ISR中是否有循环、是否调用了复杂函数、能否将更多工作移到底半部线程。中断管理是RT-Thread乃至所有RTOS应用的基石之一。它要求开发者在追求效率的同时必须保持对并发安全的高度警惕。从理解中断上下文的限制开始到熟练运用顶半部/底半部解耦思想再到根据场景选择合适的线程通信机制每一步都需要结合具体硬件和业务逻辑仔细斟酌。多利用ulog进行跟踪多思考共享资源的保护在实践中不断调整和优化才能构建出既实时又稳定的嵌入式系统。

相关新闻

从命令行终端到AI智能体:设计下一代人机协作界面的核心属性

从命令行终端到AI智能体:设计下一代人机协作界面的核心属性

1. 项目概述:当终端成为人机协作的枢纽“Terminal Is All You Need”这个标题,乍一看有点复古,甚至带点极客的挑衅意味。在图形用户界面(GUI)大行其道的今天,为什么还要回到那个只有黑白字符闪烁的命令行世…

2026/8/19 5:36:39 阅读更多 →
AI模型开源之争:技术民主化与商业可持续性的深度博弈

AI模型开源之争:技术民主化与商业可持续性的深度博弈

最近,一个极具争议性的问题开始在技术社区发酵:那些在互联网海量公开数据上训练出来的AI模型,其开发者是否有义务在一定期限后将其开源?这不仅是关于代码和模型的归属,更触及了AI时代知识生产、商业竞争与技术普惠的核…

2026/8/19 5:36:39 阅读更多 →
基于STM32与AHT21的温湿度监测系统:从硬件连接到软件滤波的完整实现

基于STM32与AHT21的温湿度监测系统:从硬件连接到软件滤波的完整实现

1. 项目概述:从零构建一个高精度温湿度监测系统最近在捣鼓一个环境监测的小项目,核心需求是实时、稳定地采集温度和湿度数据。市面上温湿度传感器不少,但综合考虑精度、稳定性和性价比,我最终锁定了AHT21这款数字温湿度复合传感器…

2026/8/19 5:35:39 阅读更多 →

最新新闻

NL668 OpenLinux SysVinit服务部署实战:从原理到故障排查

NL668 OpenLinux SysVinit服务部署实战:从原理到故障排查

1. 项目概述:在NL668 OpenLinux上运行服务的核心挑战如果你手头有一台基于NL668芯片的嵌入式设备,并且它运行的是OpenLinux系统,那么你很可能正面临一个经典且关键的挑战:如何让自定义的服务程序在系统启动时自动、稳定地运行。这…

2026/8/19 6:17:52 阅读更多 →
NL668 OpenLinux SysVinit服务部署:从脚本编写到开机自启实战

NL668 OpenLinux SysVinit服务部署:从脚本编写到开机自启实战

1. 项目概述:在NL668 OpenLinux上运行服务的核心挑战如果你手头有一块基于NL668芯片的开发板,并且正在使用其官方的OpenLinux发行版,那么“如何让我的服务程序在系统启动时自动运行”这个问题,大概率会成为你从原型验证迈向产品化…

2026/8/19 6:17:52 阅读更多 →
抖音视频批量下载完整指南:从一条条手动保存,到一条命令收下整个主页

抖音视频批量下载完整指南:从一条条手动保存,到一条命令收下整个主页

抖音视频批量下载完整指南:从一条条手动保存,到一条命令收下整个主页 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, a…

2026/8/19 6:17:52 阅读更多 →
拯救者工具箱使用指南:3步接管Vantage,把游戏本性能调节权拿回自己手里

拯救者工具箱使用指南:3步接管Vantage,把游戏本性能调节权拿回自己手里

拯救者工具箱使用指南:3步接管Vantage,把游戏本性能调节权拿回自己手里 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoL…

2026/8/19 6:17:52 阅读更多 →
OBD-II转接板进阶应用:从CAN总线嗅探到数据重定向实战

OBD-II转接板进阶应用:从CAN总线嗅探到数据重定向实战

1. 从诊断接口到数据总线的桥梁:OBD-II的潜力不止于读码如果你玩过汽车,或者只是简单地想给自己的车消个故障码,那你大概率接触过OBD-II接口。那个位于驾驶员膝盖附近、通常被一块小盖板遮住的16针插座,在绝大多数人眼里&#xff…

2026/8/19 6:17:52 阅读更多 →
基于ESP32的本地化智能家居中枢:从传感器到规则引擎的完整实践

基于ESP32的本地化智能家居中枢:从传感器到规则引擎的完整实践

1. 项目概述:从“遥控器”到“智能管家”的蜕变几年前,我还在为家里一堆不同品牌的电器遥控器头疼,空调一个、电视一个、灯光还得靠墙上的开关。后来市面上出现了各种智能单品,手机App里塞满了不同厂商的控制界面,操作…

2026/8/19 6:16:52 阅读更多 →

日新闻

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 0:00:30 阅读更多 →
AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

1. 项目概述:当AI开始“猜”数学定理 最近在AI研究圈里,一个名为“Moonshine”的项目引起了不小的讨论。这名字本身就挺有意思,直译是“月光”,但在数学史上,它特指一个神秘而美丽的联系——魔群月光猜想,连…

2026/8/19 0:00:30 阅读更多 →
WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 一台刚配的新电脑,跑《魔兽争霸3》却卡成 PPT——这…

2026/8/19 0:02:31 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/19 5:04:55 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →