尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

便携式低功耗数据采集设备Jadeku:从Cortex-M4到FreeRTOS的嵌入式系统设计实战

便携式低功耗数据采集设备Jadeku:从Cortex-M4到FreeRTOS的嵌入式系统设计实战 1. 项目概述Jadeku是什么以及它为何值得关注如果你经常需要在野外、工厂车间或者没有稳定市电的地方采集数据比如监测环境温湿度、记录设备振动、或者收集一些传感器的读数那你肯定对传统数据采集设备的“娇气”深有体会。它们要么拖着一条长长的电源线要么用不了多久内置电池就告急要么体积庞大不便携要么软件配置复杂到让人头疼。今天我想聊的这个项目——Jadeku就是针对这些痛点而生的一款便携式低功耗数据采集设备。它不是某个大厂的产品更像是一个来自开源硬件社区或者某个极客团队的匠心之作目标很明确做一个真正“扛造”、省电、且开箱即用的数据采集工具。“Jadeku”这个名字听起来有点意思不像常见的品牌名。我猜测它可能是“Jade”翡翠寓意坚固、珍贵和某个缩写比如“KU”的组合意在表达其坚固可靠且功能独特的特性。它的核心标签非常清晰便携、低功耗、数据采集。这意味着它天生就是为了移动和离线场景设计的。你可以把它绑在无人机上去采集大气数据放在移动的车辆上记录轨迹和颠簸或者简单地放在某个角落进行长期的、无人值守的环境监测。它的出现让那些需要灵活部署、长期运行的数据采集任务从复杂的系统工程变成了一个更接近“即插即用”的简单操作。我之所以花时间研究并想分享它是因为在实际工作中我受够了带着笨重的工控机、一堆线缆和备用电池去现场的窘迫。Jadeku这类设备代表了一种趋势将数据采集的边缘节点做得越来越智能、越来越独立。它不仅仅是一个ADC模数转换器加MCU微控制器那么简单更是一套考虑了完整应用场景的解决方案包括电源管理、数据存储、通信接口和易用的软件。接下来我会结合自己的经验深入拆解Jadeku可能涉及的技术选型、设计思路、实操应用以及那些容易踩坑的地方。2. 核心设计思路与架构选型设计一个便携式低功耗数据采集设备绝不是把一堆低功耗芯片拼起来那么简单。它需要在性能、功耗、成本和易用性之间做出精妙的平衡。Jadeku的设计思路我认为核心是围绕“场景驱动”和“系统级优化”展开的。2.1 为何选择“低功耗”作为核心低功耗不是目的而是实现“便携”和“长期无人值守”的关键手段。一个设备如果每小时都要换电池那根本谈不上便携。Jadeku的目标可能是依靠单次充电或一次性电池持续工作数周、数月甚至更久。这直接决定了其硬件平台和软件架构的选型。首先主控MCU的选择是重中之重。市场上常见的低功耗MCU架构有ARM Cortex-M系列特别是M0 M3 M4、RISC-V以及一些老牌的8位/16位MCU。从网络热词中频繁出现的“cortex-m”、“arm_cm4f”来看ARM Cortex-M系列显然是嵌入式低功耗领域的主流。Cortex-M4F带浮点单元是一个性能与功耗兼顾的甜点选择它能相对高效地处理传感器数据如进行滤波、校准等运算同时又具备丰富的低功耗模式Sleep Stop Standby等。Jadeku很可能采用了基于Cortex-M4或类似级别内核的MCU例如ST的STM32L4系列、NXP的Kinetis L系列或TI的MSP432系列。这些芯片在活跃模式下的功耗可以低至100µA/MHz以下在深度睡眠模式下电流甚至可降至微安级。其次电源管理单元的设计至关重要。这不仅仅是选择一个低静态电流的LDO低压差线性稳压器或DC-DC转换器。完整的PMU设计需要考虑多电压域管理为MCU、传感器、通信模块提供各自所需且可独立关断的电源。动态电压频率调节根据处理负载实时调整MCU内核电压和频率以节省功耗。高效的能量采集接口可选但趋势明显为连接太阳能板、热电发电机等预留接口实现“永久”续航。Jadeku如果定位高端很可能会考虑这一点。2.2 “便携”与“数据采集”的硬件实现便携意味着小型化和接口简化。Jadeku很可能采用紧凑的PCB设计集成必要的传感器或预留标准的传感器接口如I2C SPI 模拟输入。对于数据采集核心部件是ADC。是使用MCU内置的ADC还是外置高精度ADC芯片这取决于精度要求。如果需要16位及以上精度、高采样率或多路同步采样外置ADC芯片是必须的。但外置ADC会增加功耗和成本。Jadeku可能需要根据其预设的应用场景如温度/湿度记录 vs 振动信号分析来做出权衡。存储方案是另一个关键。SD卡是便携设备最通用的选择因为它容量大、可更换、成本低。但直接驱动SD卡在写入时功耗较高。优化策略包括使用带写缓冲的SPI接口SD卡、减少文件系统操作频率例如将数据先缓存到MCU的RAM或FRAM中积攒到一定量后再一次性写入SD卡、甚至采用更省电的FRAM或MRAM作为中间缓存。通信接口用于配置设备和取回数据。有线方面USB-C可能是现代便携设备的标配用于供电、充电和数据传输。调试接口如SWD也会被隐藏但保留。无线方面考虑到低功耗蓝牙低功耗BLE是近距离配置和读取数据的理想选择LoRa或NB-IoT则适用于远程低数据率回传。Jadeku很可能至少具备BLE功能。2.3 软件架构低功耗的“灵魂”硬件提供了省电的基础但软件才是实现超低功耗的“灵魂”。一个糟糕的软件设计可以让最省电的硬件耗电如流水。Jadeku的软件核心必然是事件驱动和中断唤醒架构。主循环与低功耗模式程序不应是while(1)忙等待。正确的做法是在主循环中当所有任务处理完毕后立即让MCU进入所能允许的最深低功耗模式如Stop模式。任何需要处理的事件如定时器到期、传感器数据就绪、按键按下、蓝牙连接请求都通过中断来唤醒MCU。外设管理不用的外设时钟、GPIO、通信接口必须彻底关闭。即使是ADC在两次采样间隔也应关闭。所有GPIO引脚应配置为明确的输出状态或带上拉/下拉的输入状态防止浮空引脚产生漏电流。实时操作系统对于复杂任务管理一个轻量级RTOS如FreeRTOS很有帮助。网络热词中出现了“freertos/source/portable”这强烈暗示Jadeku的软件基于FreeRTOS。RTOS可以通过任务调度和休眠机制更优雅地管理多个并行任务如数据采集、存储、通信并进入低功耗状态。port.c文件正是RTOS针对特定MCU端口port的底层适配代码其中包含了进入/退出低功耗模式的临界代码。数据采集策略软件需要灵活配置采样率。对于缓慢变化的信号如温度可以采用极低的采样率如每分钟一次大部分时间MCU都在深度睡眠。采样时快速启动传感器、ADC读取数据存入缓存然后迅速关闭外设返回睡眠。3. 核心模块深度解析与实操要点理解了整体架构我们再来深入看看Jadeku几个核心模块的实现细节和实操中容易遇到的问题。3.1 电源电路设计与实测功耗分析电源电路是低功耗设备的命脉。一个典型的设计可能包含以下部分输入保护与滤波防止反接、过压、浪涌。电池管理芯片负责锂电池的充电、放电保护、电量监测。芯片自身的静态电流要小。多路输出电源芯片可能使用一个高效率的同步降压DC-DCBuck转换器产生3.3V主电源再通过多个低静态电流的LDO产生3.0V或1.8V等电压给模拟电路或特殊外设。实操要点与避坑测量功耗必须用对工具万用表测平均电流还行但要分析动态功耗瞬间唤醒、采样的电流峰值必须使用数字示波器配合电流探头或者高采样率的USB电流表。你会看到MCU从睡眠中唤醒、开启传感器、执行ADC转换、存储数据这一系列动作的电流波形。优化目标就是让这个“活跃脉冲”尽可能窄平均电流尽可能低。DC-DC vs LDO的抉择DC-DC转换效率高常90%但轻载时效率可能下降且存在开关噪声。LDO效率低效率≈Vout/Vin但噪声小静态电流可以做得极低1µA。通常方案是主电源用高效DC-DC对噪声敏感的模拟电路部分再用LDO从3.3V降压得到。务必查阅芯片数据手册的“Quiescent Current”参数。“幽灵功耗”排查即使你认为所有代码都正确设备睡眠电流仍可能高达几十微安。常见罪魁祸首未初始化的GPIO引脚处于浮空状态。调试接口SWD/JTAG未禁用。在发布版软件中需要软件禁用或物理断开。外设模块的时钟未关闭。在进入低功耗前要遍历检查所有外设时钟门控。PCB漏电。焊接残留、潮湿环境可能导致微小漏电流。3.2 传感器接口与数据采集链Jadeku可能板载了常见传感器也必然提供了扩展接口。我们以连接一个外部I2C温度传感器和一路模拟麦克风为例。数字传感器以I2C温度传感器如TI的TMP117为例。连接SCL SDA上拉电阻必不可少通常4.7kΩ电源需可控。低功耗操作MCU大部分时间睡眠。内置RTC实时时钟定时器中断唤醒MCU后软件流程为开启传感器电源通过一个GPIO控制MOSFET。短暂延时等待传感器稳定如5ms。初始化I2C外设如果之前已关闭发送读取命令。读取数据可能进行简单的校准计算。关闭I2C外设时钟关闭传感器电源。将数据存入缓存区。判断缓存区是否满若满则启动存储任务。重新配置RTC下一次唤醒时间进入深度睡眠。模拟传感器以模拟麦克风连接至MCU内置ADC为例。信号调理麦克风信号通常需要放大、偏置将交流信号抬升到ADC量程中间。这里会用到运放要选择低噪声、低功耗的型号。ADC采样这是功耗大户。关键参数是采样率和分辨率。对于音频可能需要几千赫兹的采样率对于振动分析可能需要更高。在软件中应使用ADC的定时器触发DMA传输。这样ADC可以在无需CPU干预的情况下以精确的间隔自动采样并将数据直接存入内存。CPU仅在DMA传输完成中断中醒来将一整块数据打包处理。这比每次采样都中断一次CPU要高效得多。抗混叠滤波在ADC之前必须加抗混叠滤波器低通防止高频噪声混叠到有效频带内。这是一个硬件设计但参数选择截止频率需要与软件采样率匹配。3.3 数据存储策略与文件系统数据存储在SD卡上涉及文件系统如FAT32。频繁的文件打开、写入、关闭操作非常耗电且磨损存储介质。优化策略大块写入在RAM中开辟一个环形缓冲区例如10KB。采集到的数据先存入此缓冲区。当缓冲区快满时或者到达一个固定的时间间隔如每分钟才唤醒存储任务。文件管理不要每次存储都打开/关闭文件。可以在设备启动时创建一个以时间戳命名的数据文件如DATA_20231027_143000.CSV然后在整个运行期间保持打开状态以追加模式。仅在存储任务执行时进行写入操作。这样避免了重复的文件系统开销。磨损均衡对于长期记录要考虑SD卡闪存的磨损。简单的策略是当单个文件大小达到某个上限如100MB后关闭当前文件创建新文件继续记录。更复杂的策略可以实现简单的循环日志。错误处理SD卡操作可能失败卡被拔出、损坏。代码必须有健壮的错误处理例如写入失败重试、记录错误日志到备用存储区如MCU内置Flash、进入安全状态等。实操心得使用f_sync()函数比f_close()更省时。f_close()会更新文件系统的所有元信息而f_sync()只确保文件数据写入物理介质但保持文件打开状态。定期调用f_sync()可以防止数据丢失又比频繁关闭再打开文件高效。考虑使用SPI模式驱动SD卡而不是SDIO模式。虽然SPI速度慢但其接口简单功耗可能更低且大多数MCU的SPI外设更容易在低功耗模式下操作。3.4 通信与配置接口实现USB用于高速数据传输和充电。实现一个USB Mass Storage Class设备是最方便的这样设备插入电脑后直接显示为一个U盘用户可以直接拷贝数据文件。同时可以复合一个CDC通信设备类虚拟串口用于调试和配置。需要注意的是USB PHY本身有功耗在不需要时应彻底断电。蓝牙低功耗这是实现无线配置和实时数据预览的关键。基于BLE可以开发一个简单的手机App。GATT服务设计定义一个自定义GATT服务包含以下特征设备信息只读包含设备名称、固件版本、电池电量。配置参数可读写用于设置采样率、传感器量程、设备ID等。实时数据可通知用于向手机推送实时采集的数据用于调试和预览。命令控制可写用于发送命令如启动/停止记录、清除数据、强制同步时间等。低功耗适配BLE协议栈如Nordic的nRF5 SDK或TI的SimpleLink通常已经很好地集成了低功耗管理。你需要合理设置广播间隔、连接参数连接间隔、从机延迟在平衡响应速度和功耗之间找到最佳点。在不连接时设备应进入低功耗广播模式。4. 固件开发与低功耗编程实战基于FreeRTOS和Cortex-M4的固件是Jadeku的大脑。这里分享一些关键的编程实践。4.1 FreeRTOS任务划分与调度假设我们创建以下几个任务优先级从高到低数据采集任务由RTC定时器中断或外部事件如按键唤醒。它负责执行一次完整的采样流程控制传感器、读取数据然后将数据放入队列或环形缓冲区。执行完毕后自动挂起vTaskSuspend等待下一次事件唤醒。数据存储任务平时处于阻塞状态等待一个信号量或队列消息。当数据缓冲区满或定时器到期时由采集任务或定时器回调函数释放信号量唤醒存储任务。它将缓冲区数据写入SD卡然后再次阻塞。这个任务优先级可以较低。通信任务处理USB和BLE事件。对于USB可以在USB中断中释放信号量来唤醒任务。对于BLE协议栈通常有自己的事件处理循环可以运行在一个独立任务中。这个任务大部分时间也在等待事件。系统监控任务最低优先级周期性运行如每秒一次检查电池电压、系统状态、错误标志等。关键点使用vTaskSuspend()和vTaskResume()来手动控制任务的运行而不是让任务在while(1)里空转等待。当所有任务都挂起或阻塞时FreeRTOS的空闲任务会运行而我们的目标就是在空闲任务钩子函数中将系统带入深度睡眠。4.2 进入深度睡眠的“黄金法则”这是低功耗编程最核心的部分。代码流程大致如下// FreeRTOS 空闲任务钩子函数 void vApplicationIdleHook( void ) { // 1. 检查是否所有任务都处于非运行状态阻塞或挂起 if( /* 所有应用任务都已就绪进入睡眠的条件 */ ) { // 2. 保存上下文如果需要FreeRTOS的portSUPPRESS_TICKS_AND_SLEEP会处理 // 3. 关闭所有无需在睡眠中工作的外设时钟通过MCU的RCC寄存器 __HAL_RCC_GPIOA_CLK_DISABLE(); __HAL_RCC_USART1_CLK_DISABLE(); // ... 关闭其他外设时钟 // 4. 配置唤醒源如RTC闹钟、外部引脚中断 HAL_RTC_SetAlarm_IT(hrtc, sAlarm, RTC_FORMAT_BIN); // 5. 执行WFI/WFE指令进入停止模式Stop Mode或待机模式Standby Mode HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 6. 系统被唤醒后首先执行的是这里从WFI后继续执行 // 7. 重新初始化系统时钟从HSI/MSI切换到HSE/PLL SystemClock_Config(); // 8. 重新使能必要的外设时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_USART1_CLK_ENABLE(); // ... } }注意事项时钟管理进入深度睡眠前通常需要将系统时钟切换到低速内部时钟如MSI并关闭高速外部时钟HSE和PLL。唤醒后需要重新初始化时钟树恢复到高性能状态。这个过程必须严格按照MCU参考手册的顺序进行否则可能导致系统崩溃。外设状态保存与恢复有些外设如GPIO、定时器在睡眠时状态会丢失。如果需要保持要将其配置为“在低功耗模式下保持”。唤醒后对于UART、SPI等外设可能需要重新初始化。调试接口深度睡眠模式下SWD/JTAG调试器可能无法连接。为了调试低功耗代码你需要在进入深度睡眠前通过一个GPIO输出一个脉冲用示波器观察。使用串口打印日志但注意串口本身耗电。或者暂时修改代码进入睡眠模式较浅的Sleep模式这样调试器仍可工作。4.3 时间同步与RTC的使用对于数据记录设备每个数据点的时间戳至关重要。必须使用独立的RTC外设它通常由单独的32.768kHz晶振驱动在深度睡眠下依然运行功耗极低。操作流程系统启动时从外部如GPS、手机App通过BLE或内部备份寄存器如果电池供电同步RTC时间。配置RTC的周期性唤醒中断如每秒一次或闹钟中断在特定时刻唤醒。每次采集数据时读取RTC的计数器值转换为日历时间作为数据的时间戳。确保RTC备份域电源通常由VBAT引脚连接备用电池始终供电以保证设备主电源断开时时间不丢失。常见问题32.768kHz晶振不起振或精度差。这可能是负载电容不匹配、PCB布局不合理或晶振本身质量问题。务必按照数据手册推荐的值选择外部负载电容并让晶振尽量靠近MCU的引脚用地平面包围。5. 开发、调试与生产中的典型问题排查即便设计再完善实际开发中总会遇到各种问题。下面是一些基于经验的问题排查实录。5.1 设备无法启动或连接不稳定现象上电后无反应或者调试器如J-Link无法连接提示“no cortex-m sw device found”或“could not stop cortex-m device”。排查思路电源首先用万用表测量所有电源轨电压是否正常、稳定。特别是MCU的VDD、VDDA以及RTC的VBAT。复位电路检查复位引脚是否被意外拉低。NRST引脚通常需要上拉电阻并可能连接一个电容到地以实现上电复位。确保复位电路正常工作。时钟检查主晶振是否起振。可以用示波器探头使用X10档避免影响振荡测量OSC_IN/OSC_OUT引脚。如果没有示波器可以尝试将代码配置为使用内部时钟HSI/MSI如果此时设备能工作问题就出在外部晶振电路。Boot模式检查MCU的BOOT0/BOOT1引脚电平是否正确。它们决定了MCU从何处启动Flash 系统存储器 SRAM。通常需要拉低以从用户Flash启动。SWD接口确认SWDIO和SWCLK线路连接正确上拉电阻已焊接。如果PCB上SWD线路过长或靠近噪声源可能导致连接不稳定。尝试降低调试器的时钟频率。软件问题如果软件一开始就配置了低功耗模式并且立即进入深度睡眠可能会导致调试器无法连接。解决办法是在代码最开始加一个几秒的延时或者通过一个按键来触发低功耗模式方便前期调试。5.2 功耗高于预期现象测量睡眠电流为几百微安甚至毫安级远高于数据手册的理论值几个微安。系统性排查步骤移除法首先将板上所有非必要的外部器件传感器、通信模块、指示灯物理断开或通过跳线断开供电。测量此时的核心板电流。如果仍然很高问题在MCU及周边电路。引脚排查这是最常见的原因。使用万用表测量每个GPIO引脚在睡眠状态下的电压。任何处于浮空输入状态的引脚都可能产生漏电流。确保所有未使用的引脚都配置为模拟输入如果MCU支持或输出低电平。对于有外部上拉/下拉的引脚确认其配置与外部电路匹配。外设时钟在进入睡眠前使用调试器或通过代码打印寄存器值确认所有不用的外设时钟都已禁用__HAL_RCC_xxx_CLK_DISABLE()。调试接口确认在发布版本代码中已经禁用了SWD/JTAG功能通过配置选项字节或者物理上断开了调试器。电源芯片测量每个LDO或DC-DC的输出电流定位是哪个电源轨在耗电。检查电源芯片的使能引脚是否被正确控制。软件流程单步调试确认代码确实执行到了进入低功耗模式的函数如HAL_PWR_EnterSTOPMode并且没有立即被意外的中断唤醒。5.3 数据存储错误或文件系统损坏现象无法创建文件、写入失败、或读出的数据乱码。排查SD卡兼容性并非所有SD卡都兼容SPI模式。尝试更换不同品牌、不同容量的卡。建议使用Class 10及以上、容量32GB以下的卡格式化为FAT32文件系统分配单元大小设为32KB或64KB有助于提升写入性能。电源稳定性SD卡在写入时峰值电流较大。用示波器观察给SD卡供电的3.3V电源线在写入瞬间是否有大幅跌落。如果有需要增加电源去耦电容如100µF钽电容100nF陶瓷电容。SPI时序提高SPI时钟频率可能提高速度但也可能因信号完整性导致错误。如果遇到问题尝试降低SPI时钟频率如先降到1MHz测试。确保SPI的CPOL和CPHA相位设置与SD卡驱动库要求一致。文件系统操作确保不在中断服务程序中进行复杂的文件系统操作如f_openf_write。这些操作应该放在任务中。同时注意对文件系统相关对象的互斥访问防止多个任务同时操作。意外断电这是文件系统损坏的主因。在每次f_write后定期调用f_sync()可以将目录信息更新到磁盘减少损坏范围。更高级的做法是实现一个简单的日志结构文件系统或使用掉电安全的文件系统库。5.4 无线通信BLE距离短或连接断开现象手机App只能在很近的距离连接设备或者连接后频繁断开。排查天线匹配对于板载天线或陶瓷天线其匹配电路π型网络必须根据PCB的叠层和实际环境进行调试。使用矢量网络分析仪测量天线的回波损耗是最专业的方法。没有VNA的话可以尝试微调匹配电路中的电感电容值。电源噪声BLE射频部分对电源噪声非常敏感。确保为RF芯片供电的LDO是低噪声型号并在电源引脚就近放置足够的多规格去耦电容如10µF 1µF 100nF 10nF。PCB布局RF走线必须做50欧姆阻抗控制尽量短直下方有完整地平面并远离数字信号线、电源线和晶振。晶体和负载电容应尽可能靠近芯片引脚。软件配置检查BLE的发射功率设置是否被无意调低。确认连接参数连接间隔、从机延迟设置合理。过短的连接间隔会增加功耗过长的间隔可能导致连接不稳定。6. 从原型到产品扩展思考与进阶优化当Jadeku原型机基本功能跑通后我们可以思考如何让它更可靠、更智能更像一个产品。1. 外壳与防护 便携设备意味着要应对各种恶劣环境。设计一个3D打印或开模的防水防尘外壳是必要的。需要考虑按钮、接口的密封以及散热如果功耗极低散热通常不是问题。内部可以考虑灌封胶以增强抗振动能力。2. 能量采集 对于永久部署的应用可以集成能量采集模块。例如太阳能搭配一块小型太阳能电池板和高效的能量收集芯片如TI的BQ25570在白天为锂电池充电。振动/热能对于工业机械监测可以利用压电或热电材料收集微弱的振动/热能。但这通常功率很低微瓦级只能作为补充或者用于唤醒设备进行间歇性工作。3. 边缘计算与智能触发 与其存储所有原始数据不如让设备变得更“聪明”。利用MCU的有限算力可以实现数据压缩对采集的数据进行简单的Delta编码或运行长度编码减少存储空间。特征提取例如在振动监测中实时计算有效值、峰值、频率谱只存储这些特征值而非完整的波形数据。事件触发设置阈值只有当数据超过阈值时才触发高采样率记录或立即通过无线网络报警。这可以极大节省存储空间和通信带宽。4. 固件升级 一个好的产品必须支持固件升级。可以通过以下方式实现USB DFU通过USB接口使用Device Firmware Upgrade协议升级。BLE OTA通过蓝牙无线升级。这是非常用户友好的功能但需要在Bootloader和应用程序中精心设计确保升级过程断电安全。SD卡升级将新固件文件放入SD卡设备上电后检测并自动更新。5. 校准与测试 对于测量类设备出厂校准至关重要。可以设计一个简单的校准模式通过USB或BLE接收标准源输入自动计算并存储校准系数如增益、偏移到MCU的Flash或EEPROM中。在生产线上可以自动化这个过程。开发像Jadeku这样的设备是一个典型的软硬件深度结合的项目。它挑战的不仅是你的电路设计能力更是对系统功耗管理的深刻理解以及对嵌入式软件架构的把握。每一次成功的功耗优化每一次解决棘手的干扰问题都让人有巨大的成就感。这个过程充满了陷阱但也充满了学习的乐趣。希望这些基于实际经验的拆解和心得能为你带来一些启发。当你亲手做出一个能稳定运行数月、采集数万条数据的“小盒子”时你就会觉得所有的折腾都是值得的。
返回列表