NS486SXF:90年代高度集成嵌入式SoC的设计哲学与工程实践
1. 项目概述:NS486SXF,一个时代的嵌入式“瑞士军刀”
在90年代中后期,嵌入式系统设计正处在一个关键的十字路口。一方面,应用需求日益复杂,从传真机、多功能外设到移动通信设备,都要求更强的处理能力和更丰富的连接性;另一方面,成本、功耗和板级空间又有着极其严苛的限制。当时的主流方案,要么是采用一颗通用处理器(如80386EX)搭配一大堆外围芯片(如8259中断控制器、8237 DMA控制器、16550 UART等),导致电路板臃肿、成本高昂;要么是选择功能有限的8位或16位单片机,在性能上捉襟见肘。正是在这种背景下,像NS486SXF这样的高度集成化32位嵌入式控制器应运而生,它试图在性能、集成度和成本之间找到一个完美的平衡点。
NS486SXF本质上是一个“系统级芯片”(SoC)的早期典范。它并非简单地将一个486 CPU内核塞进芯片,而是围绕这个内核,精心构建了一整套完整的“系统服务单元”和丰富的“片上外设”。这意味着,设计者拿到这颗芯片,几乎就等于拿到了一个完整的嵌入式计算机主板的核心——CPU、内存控制器、DMA、中断、定时器、实时时钟、串并口、显示控制器,甚至PCMCIA卡接口都集成在内。对于当时许多目标产品(如高端打印机、扫描仪、POS终端、工业控制器)而言,使用NS486SXF可以省去数十颗外围芯片,将一块复杂的多层板简化成几乎以DRAM和ROM为主的简洁设计,其带来的BOM成本降低、可靠性提升和开发周期缩短的价值是巨大的。
我当年第一次在项目评估中接触到这颗芯片的文档时,印象最深的就是它的“务实”与“高效”。它没有去追求x86家族完整的实模式、虚拟8086模式或浮点协处理器接口——这些在嵌入式实时操作系统中往往用不上,反而会浪费宝贵的硅片面积和增加功耗。它只保留了保护模式,专注于为VxWorks、pSOS、QNX这类实时内核提供最优化的硬件平台。这种设计哲学非常明确:不做大而全的通用PC处理器,而是做一款为特定领域深度定制的、高度集成的控制器。接下来,我们就从系统设计思路开始,层层拆解这颗颇具代表性的芯片。
2. 核心架构与设计哲学解析
2.1 “优化版486”内核:为嵌入式而生的取舍
NS486SXF的核心是一个与Intel 486指令集兼容的32位处理器,但请注意,这里的“兼容”是有重点的。它完全支持486的保护模式指令集,这意味着现代嵌入式操作系统所需的分段保护、特权级、任务切换等机制一应俱全。然而,它果断舍弃了实模式(Real Mode)和虚拟8086模式(Virtual 8086 Mode)。这个决策非常关键。
在传统的PC兼容领域,实模式是处理器加电后的起点,用于引导古老的DOS系统。但在嵌入式世界,尤其是运行VxWorks、pSOS这类直接从保护模式启动的实时操作系统(RTOS)时,实模式完全是冗余的。移除它不仅能简化硬件设计,减少晶体管数量,还能避免相关的微码和状态机,对降低功耗和成本有直接好处。同样,虚拟内存分页(Paging)支持也被移除,因为许多嵌入式实时系统更倾向于使用简单、可预测的平面内存模型或分段模型,虚拟内存带来的地址转换开销和不确定性是实时性的大敌。浮点运算则通过软件库实现,省去了硬件协处理器接口。
实操心得:内核选型的启示这种“针对性裁剪”的设计思路,对于今天的芯片选型依然有借鉴意义。不要盲目追求指令集的全兼容,而是要仔细评估你的应用软件栈(尤其是操作系统和编译器)到底需要哪些硬件特性。例如,如果你的应用完全在ARM Cortex-M的Thumb-2模式下运行,且不需要浮点单元(FPU)或内存保护单元(MPU),那么选择不带这些功能的型号可以节省可观的成本。NS486SXF的案例告诉我们,为特定应用场景做减法,往往是实现高性价比的关键。
内核的优化还体现在微架构上。文档提到它采用了一种“类RISC”的设计哲学,对常用指令进行了流水线优化,平均执行时钟周期数比标准486更低。同时,它集成了一个1KB的指令缓存。这个缓存容量在今天看来微不足道,但在当时却意义重大。嵌入式系统通常从速度较慢的ROM(如NOR Flash)中取指执行,这个小缓存可以显著减少访问慢速存储器的次数,尤其对循环和小型函数效率提升明显,使得“从ROM直接运行代码”的体验更接近从RAM运行。
2.2 高度集成的系统服务单元:告别“胶合逻辑”
如果说CPU内核是大脑,那么系统服务单元就是维持生命活动的神经和循环系统。NS486SXF将一套完整的PC/AT兼容机主板芯片组功能集成在了一颗芯片里,这是它最大的价值所在。
DRAM控制器:支持两个存储体(Bank),每个最大8MB,数据宽度16位(可支持字节奇偶校验)。它支持页模式(Page Mode)访问,这是关键性能优化。当CPU访问同一DRAM页内的连续数据时,可以实现单周期访问,这相当于提供了一个高效的、无额外成本的数据缓存效果。控制器可编程设置页缺失访问周期(3或4周期)和CAS周期延长,让设计者能灵活适配不同速度的DRAM芯片。
DMA控制器:这是一个6通道的高性能16位DMA控制器。其中两个通道专用于片上外设(IEEE 1284 ECP端口和LCD控制器),四个通道用于连接外部设备(如扫描仪引擎、打印头)。最大传输速率在25MHz下可达25MB/s(2字节/2周期)。它支持单次、块传输和需求传输模式,并能进行内存到内存、内存到I/O、I/O到内存的传输。在CPU进入空闲模式时,BIU(总线接口单元)可以接管总线,代表CPU响应DMA请求,从而实现“屏幕刷新而CPU休眠”的节能场景。
可编程中断控制器(PIC):集成了两个级联的8259A兼容中断控制器,提供15个可编程中断源(16个中有一个用于级联)。这为连接大量内外设中断提供了硬件基础。
可编程间隔定时器:包含三个与8254兼容的定时器通道。其中通道2可配置为受保护的看门狗定时器,使用独立的1kHz时钟(由实时时钟电路产生),防止系统死锁。
实时时钟/日历(RTC):兼容DS1287/MC146818,提供带电池备份的时钟、日历和闹钟功能,还有50字节的通用CMOS RAM。这是系统保持时间和配置信息的关键。
电源管理:提供了非常精细的时钟门控能力。CPU内核时钟可以分频(/4, /8, /16, /32, /64)或完全停止(空闲模式)。每个片上外设(DMA、ECP、三线接口、定时器、LCD控制器、DRAM控制器、PCMCIA、UART)的时钟都可以独立关闭。甚至外部系统时钟(SYSCLK)也能被禁用。这种颗粒度的电源控制,使得系统可以根据工作负载动态调整功耗,非常适合电池供电或“绿色”设备。
将这些单元集成在一起,最大的好处是消除了“胶合逻辑”(Glue Logic)。在分立方案中,CPU、DRAM控制器、中断控制器等芯片之间需要大量地址译码、缓冲和时钟同步电路。NS486SXF通过内部总线将它们紧密连接,对外提供统一的、类似ISA总线的接口,使得连接标准ISA外围芯片变得非常简单,几乎不需要额外的逻辑芯片。
2.3 丰富的片上外设与可重构I/O:极致的灵活性
除了系统服务,NS486SXF还集成了当时嵌入式设备可能需要的几乎所有主流接口:
- IEEE 1284双向并口(ECP模式):不仅支持标准的PC兼容并口模式,更支持完整的扩展能力端口模式,且能作为主机或从设备运行。这使得它既能连接传统打印机,也能作为高性能双向数据传输通道,或甚至作为另一个处理器的并行外设接口。
- PCMCIA 2.0接口:支持单个PCMCIA卡,兼容ExCA 1.50架构和就地执行(XIP)功能。对于需要扩展存储或特殊功能卡(如网络卡、数据采集卡)的设备,这是至关重要的。
- NS16550兼容UART:带16字节FIFO的高速串口,支持完整的调制解调器控制信号。特别的是,它支持HP-SIR和IrDA 1.0红外通信模式,为无线数据同步提供了可能。
- LCD控制器:支持单色或4级灰度的超扭曲向列型液晶显示,分辨率可达480x320。它使用系统DRAM作为帧缓冲区,并通过DMA自动刷新,极大减轻了CPU负担。
- MICROWIRE/Access.bus三线同步串行接口:用于连接EEPROM、传感器、ADC/DAC等低速串行设备,简化了板级布线。
最巧妙的设计之一是可重构I/O。芯片上有29个引脚与上述外设功能复用(如并口数据线、UART引脚、PCMCIA控制线、LCD接口等)。当你的具体应用不需要某个外设(例如,产品没有LCD屏幕),你可以通过配置寄存器,将这些引脚重新定义为通用的双向GPIO。这赋予了设计者极大的灵活性,可以用同一颗芯片设计出功能配置不同的多种产品,最大化芯片利用率,减少因引脚功能固定而被迫选用更大封装或不同型号的情况。
3. 硬件设计与系统搭建实战指南
3.1 最小系统设计与核心电路
要让NS486SXF跑起来,一个最小系统需要以下几部分:
时钟电路:芯片主时钟由OSCX1引脚输入。可以采用一个50MHz的TTL电平有源晶振直接驱动(此时OSCX2悬空),也可以利用芯片内部的反相器,在OSCX1和OSCX2之间连接一个50MHz的无源晶体和两个负载电容(通常15-22pF)构成皮尔斯振荡器。CPU内核时钟是OSCX1频率的一半,即25MHz。实时时钟(RTC)则需要一个独立的32.768kHz晶体连接在RTCX1和RTCX2之间,并为Vbat引脚提供备份电池(如3V锂锰电池)。
电源与复位:芯片采用单5V供电(VDD),容差为±5%。PWGOOD引脚是关键,它必须由电源监控芯片驱动,在上电期间保持低电平,直到5V电源稳定后才拉高。PWGOOD的上升沿会触发芯片内部复位序列。RESET和RESET是芯片输出的系统复位信号,可用于复位其他外围芯片。
存储子系统:
- Boot ROM:系统上电后从地址0xFFFFFFF0(保护模式下的复位向量)开始执行。这个地址会通过CS0引脚映射到外部ROM(如NOR Flash)。SBHE引脚在上电复位时的采样状态决定了引导ROM的数据宽度(8位或16位)。通常我们会设计为16位访问以获得更好的性能。
- DRAM:这是系统的主内存。NS486SXF的DRAM控制器产生RAS0/1、CASH0/1、CASL0/1、WE等所有必要信号。设计时需注意:
- 根据所选DRAM芯片的规格(访问时间、页大小),正确配置DRAM控制器的时序寄存器(如tRAS, tRCD, tCAS等)。
- 如果使用带奇偶校验的DRAM,需要连接DPH和DPL引脚,并在控制器中使能奇偶校验功能。
- 地址线**SA[12:1]**在DRAM访问时是复用的,先输出行地址,后输出列地址。**SA[0]**用于在复位时选择ICE模式,正常使用时接上拉电阻。
总线接口与外围扩展:NS486SXF提供类似ISA的总线周期,包括**SA[25:0]**地址线、SD[15:0]数据线、MEMR/MEMW/IOR/IOW等控制线。通过可编程的芯片选择信号CS[5:1],可以轻松连接额外的存储器或I/O设备(如网卡控制器、额外的UART芯片等)。CS16信号用于指示当前访问的是16位设备,应由外部设备以开集电极方式驱动反馈。
3.2 关键外设接口设计要点
- IEEE 1284并口设计:该并口设计用于直接驱动打印机或其他1284外设。在ECP模式下,其握手信号(如SLIN,STB,AFD,ACK,BUSY等)需要按照IEEE 1284标准进行连接。特别注意:当并行端口未使用时,其8个数据引脚(PD[7:0])和多个控制引脚可以重构为GPIO,这是一个非常实用的功能。
- PCMCIA接口设计:设计PCMCIA卡槽电路时,需注意VCC_SEL和VPP_SEL1/2信号用于控制给卡供电的电压。CD1和CD2用于检测卡是否插入。IREQ信号(与IRQ5复用)是卡的中断请求。由于PCMCIA接口电平与系统总线可能不同,通常需要电平转换缓冲器(如74LVTH16245),并由DIR和ENABLE信号控制方向。
- LCD接口设计:LCD控制器提供CL1(行时钟)、CL2(字时钟)、CLF(帧时钟)和LCD[3:0](4位灰度数据)信号,直接驱动带有内置行/列驱动器的LCD模块。设计时需要根据LCD模块的数据手册,调整控制器中的时序参数(如tlccl2点时钟周期、tlcfs帧同步建立时间等),以优化显示效果,避免闪烁或鬼影。
- UART与红外:标准的RS-232电平需要外部MAX232之类的电平转换芯片。如果使用红外功能,Tx引脚输出的是经过调制的HP-SIR或IrDA格式信号,需要外接红外发射管;Rx接收红外信号,需要接红外接收头。UCLK可输出可编程时钟,用于驱动红外调制器。
3.3 可重构I/O(GPIO)的配置方法
这是NS486SXF的一大特色功能。配置过程通常在上电初始化软件中完成:
- 确定需求:首先明确你的硬件设计不需要哪些片上外设。例如,产品没有并行打印机接口,那么PD[7:0]等引脚就可以释放出来。
- 查询复用表:参照数据手册中的“Reconfigurable I/O Pins”表格(如文档中的TABLE 2-18),找到目标引脚对应的控制寄存器位。通常,每个可重构引脚组(如并口、UART)都有一个对应的“I/O控制寄存器”。
- 软件配置:
- 首先,需要禁用该引脚对应的外设功能。这可能涉及设置某个外设使能寄存器(Peripheral Enable Register)的对应位。
- 然后,访问该引脚组的I/O方向寄存器(Data Direction Register),将引脚设置为输入或输出。
- 最后,通过该引脚组的数据寄存器(Data Register)进行读写操作。
- 注意事项:
- 上电后,这些复用引脚通常处于高阻态(TRI-STATE)或输出固定电平,务必在初始化早期就进行配置,避免引脚悬空引起电流泄漏或误动作。
- 配置顺序很重要:先禁用外设,再配置GPIO方向,最后进行数据操作。错误的顺序可能导致短时间的信号冲突。
避坑指南:电源管理与时钟配置NS486SXF的电源管理功能强大但稍显复杂。一个常见的陷阱是:在尝试关闭某个外设时钟以省电之前,没有确保该外设已完全停止工作。例如,如果要关闭UART时钟,必须先确保没有正在进行的数据传输,并且禁用了所有相关的中断。否则,时钟突然停止可能导致状态机挂起或数据丢失。正确的流程是:1) 通过软件停止外设功能(如关闭UART发送器/接收器);2) 等待当前操作完成(查询状态寄存器);3) 禁用该外设的中断;4) 最后再设置电源管理寄存器关闭其时钟。唤醒时则按相反顺序操作。
4. 软件启动与底层驱动开发
4.1 上电启动与初始化序列
NS486SXF没有BIOS,一切从零开始。上电后,硬件逻辑会执行一个最小化的初始化,然后CPU从地址0xFFFFFFF0(CS:IP = 0xF000:0xFFF0)开始取指执行。这里通常是引导ROM的地址。你的启动代码(Bootloader)需要完成以下关键任务:
- 设置关键寄存器:首先需要配置芯片内部的系统控制寄存器。这些寄存器位于特定的I/O地址空间(类似于PC的南桥/北桥寄存器),控制着DRAM时序、芯片选择信号的范围和时序、总线等待状态、中断控制器的模式等。
- 初始化DRAM控制器:这是早期最重要的步骤之一,因为后续的代码执行和数据存储都依赖DRAM。你需要根据板上焊接的DRAM芯片型号,精确计算并写入DRAM控制寄存器,包括:
- 存储体大小和起始地址。
- 行/列地址宽度。
- 时序参数:RAS预充电时间(tRP)、RAS到CAS延迟(tRCD)、CAS脉冲宽度(tCAS)等。
- 刷新间隔和方式(CAS before RAS或自刷新)。
- 建立中断描述符表(IDT)和全局描述符表(GDT):由于CPU工作在保护模式,必须提前在内存中设置好这些描述符表。GDT定义了代码段、数据段等内存段的基址、界限和属性。IDT则包含了各个中断和异常处理程序的入口地址。
- 加载操作系统内核:完成基本硬件初始化后,Bootloader需要从存储设备(可能是ROM的后续部分,或是通过并口、串口、PCMCIA卡)将RTOS内核映像加载到DRAM中。
- 跳转到内核:最后,通过一个远跳转指令,将CPU控制权交给已加载到DRAM中的操作系统内核入口点。
4.2 外设驱动开发要点
为NS486SXF开发驱动,本质上是读写其内部集成的各个外设的控制与状态寄存器。这些寄存器都映射到CPU的I/O地址空间。
- UART驱动:完全兼容NS16550,这意味着你可以直接使用成熟的16550驱动程序。需要配置波特率除数锁存器、线路控制寄存器(字长、停止位、奇偶校验)、FIFO控制寄存器。中断处理中,需要读取中断标识寄存器(IIR)来判断是接收中断、发送中断还是调制解调器状态中断。
- 定时器/看门狗驱动:定时器部分与8254编程模型一致。看门狗功能由定时器通道2实现。你需要配置其工作模式(模式0或模式5),并设置一个初始计数值。系统正常运行时,软件必须定期“喂狗”(重新写入计数值),如果超时未喂狗,看门狗会产生复位或不可屏蔽中断(NMI)。
- DMA驱动:配置相对复杂。需要为每个通道设置:
- 基地址寄存器和当前地址寄存器(传输的物理内存地址)。
- 基计数寄存器和当前计数寄存器(传输的字节数)。
- 模式寄存器:选择传输类型(读、写、校验)、地址递增/递减、自动初始化等。
- 然后,通过软件或外部DRQ信号启动传输。传输完成或达到终止计数时,会产生中断或改变TC/EOP引脚状态。
- LCD驱动:需要配置LCD控制器的时序参数(水平/垂直同步、前沿、后沿等)、帧缓冲区在DRAM中的起始地址、每行像素数、灰度模式等。由于帧缓冲区在系统内存中,通过DMA自动刷新,驱动的主要工作是初始化控制器和更新显存内容。
4.3 与实时操作系统(RTOS)的适配
NS486SXF的设计目标就是无缝运行主流RTOS。以VxWorks为例,移植工作的核心是创建板级支持包(BSP)。BSP需要提供:
- 系统时钟:配置NS486SXF的定时器0,产生一个固定的周期性中断(例如10ms),作为操作系统的“心跳”(tick)。
- 中断控制器初始化:将两个8259A初始化为级联模式,设置中断向量偏移(通常主片0x20,从片0x28),并配置中断结束(EOI)方式。
- 串口控制台:实现
sysSerialHwInit,sysSerialHwGet,sysSerialHwPut等函数,基于NS486SXF的UART,为VxWorks提供调试输出和命令行输入。 - 内存映射:在
config.h中正确定义ROM和DRAM的物理地址范围、大小,以及VxWorks镜像的加载地址和入口地址。 - 启动类型:支持从ROM直接运行(ROM-based)或从ROM加载到RAM运行(ROM-resident)。
由于NS486SXF的硬件资源与PC/AT架构高度相似,许多RTOS(如QNX、pSOS)的x86 BSP都可以作为很好的起点进行修改,大大降低了移植难度。
5. 调试技巧与常见问题排查
5.1 硬件调试:从“无声无息”到“跑起来”
对于一个新的NS486SXF硬件板,上电后最常见的现象是“毫无反应”。排查步骤如下:
- 电源与时钟:这是第一步,也是最关键的一步。用示波器测量所有VDD引脚是否稳定在5V±5%以内。测量OSCX1引脚是否有稳定的50MHz时钟信号(TTL电平)。测量RTCX1引脚是否有32.768kHz的正弦波。检查PWGOOD引脚是否已从低电平变为高电平(约1ms内)。如果PWGOOD一直为低,CPU不会解除复位。
- 复位信号:用示波器触发模式,观察RESET和RESET引脚。上电后,RESET应有一个从高到低的下跳变(或RESET从低到高),表明芯片已输出系统复位信号。如果没有,检查PWGOOD电路。
- Boot ROM访问:将示波器或逻辑分析仪连接到CS0、地址线SA[25:0](特别是高几位)和MEMR上。触发CS0的下降沿。上电后,你应该能看到CPU尝试从0xFFFFFFF0地址读取指令,表现为CS0有效,同时地址线上出现0xFFFFFFF0(或附近地址),MEMR有效。如果看不到任何总线活动,可能是CPU内核未运行,检查时钟和复位。如果地址线活动异常(如全高或全低),可能是数据/地址线短路、虚焊,或Boot ROM芯片未正确响应。
- DRAM初始化:如果Boot ROM代码开始运行但卡在DRAM初始化,问题可能出在DRAM电路或配置。用逻辑分析仪抓取RAS0、CAS0、WE和地址线**SA[12:1]**的波形。你应该能看到规律的行激活、列读写和预充电时序。如果时序混乱或没有信号,检查DRAM控制寄存器的配置值,并核对与DRAM芯片数据手册的时序要求是否匹配(如tRAS, tRCD, tCAS)。特别注意DRAM芯片的供电和参考电压(VREF)。
5.2 软件调试:利用有限的资源
在没有昂贵在线仿真器(ICE)的情况下,调试依赖于串口打印和LED。
- “点亮LED”法:在Bootloader的最开头,将某个可重构的GPIO(例如一个未用的并口数据线PD0)配置为输出,并循环翻转其电平。用示波器测量该引脚,如果能看到方波,说明最基础的CPU运行和GPIO操作是正常的,代码至少执行到了这里。这是验证最小系统是否工作的最快方法。
- 串口打印:尽早初始化UART,哪怕以最低波特率(如9600)。在代码的关键路径上输出特定字符(如
A、B、C)。通过查看收到了哪些字符,可以判断代码执行流在哪里中断。注意:在DRAM可用之前,打印函数不能使用栈或全局变量,可能需要用纯汇编实现,并直接操作UART寄存器。 - 寄存器检查:如果怀疑某个外设不工作,编写一小段测试代码,循环读取该外设的标志寄存器(例如UART的线路状态寄存器LSR)。通过串口输出该寄存器的值,可以判断外设是否达到预期状态(如发送保持寄存器空)。
- 中断调试:中断不响应是常见问题。首先,确认在中断控制器中已使能了该中断请求(IRQ)并设置了正确的触发方式(边沿/电平)。其次,在IDT中正确安装了中断服务程序(ISR)描述符。在ISR入口处立即通过串口打印一个字符,可以验证中断是否被触发。切记:在ISR结束前,必须向8259A发送中断结束命令(EOI),否则该中断将被屏蔽。
5.3 性能优化与稳定性提升
- DRAM时序优化:在满足DRAM芯片最小时序要求的前提下,尽量缩短tRCD、tCAS等参数,可以提升内存带宽。使用页模式(Page Mode)能极大提升连续内存访问的性能。通过性能测试(如内存拷贝基准程序)来微调这些参数。
- 中断延迟:对于实时性要求高的应用,中断延迟至关重要。确保ISR尽可能短小,将非紧急处理推迟到任务中。如果可能,将关键设备的中断连接到主8259A的较高优先级IRQ线上(IRQ0-7优先级高于IRQ8-15)。避免在ISR中执行复杂的、可能阻塞的操作。
- 电源管理策略:合理利用芯片的时钟分频和门控功能。例如,在系统空闲时,将CPU时钟分频至最低,并关闭未使用的外设时钟(如LCD控制器、PCMCIA)。当有外部事件(如按键中断)时,再快速恢复全速运行。这需要驱动程序与操作系统电源管理框架的紧密配合。
- 看门狗使用:看门狗是系统最后的守护者。设置一个合理的超时时间(如1秒)。喂狗操作应该放在系统主循环或关键任务中,但要避免在某个可能阻塞的单一位置喂狗。可以考虑设计一个“看门狗任务”,它监控其他关键任务的心跳标志,只有所有心跳都正常时才喂狗。
回顾NS486SXF的设计,它代表了那个时代嵌入式系统集成化的高峰。它将一个完整的、具备强大扩展能力的嵌入式计算机浓缩在一颗160引脚PQFP封装的芯片里。虽然以今天的眼光看,其25MHz的主频和1KB指令缓存已显落后,但其高度集成、灵活配置、面向特定领域深度优化的设计思想,依然对当前的芯片选型和系统架构设计有着深刻的启示。对于从事工业控制、传统办公设备维护或嵌入式历史研究的工程师来说,理解这样一颗芯片的方方面面,不仅能解决实际问题,更能从中领悟到嵌入式系统设计的精髓——在资源、性能和成本之间寻找永恒的最优解。
