嵌入式VoIP网关开发实战:基于PDK套件的软硬件协同设计

嵌入式VoIP网关开发实战:基于PDK套件的软硬件协同设计 1. 项目概述PDK开发套件与嵌入式VoIP网关在通信设备开发领域尤其是VoIPVoice over IP媒体网关这类产品其核心挑战在于如何将传统的电话网络PSTN与基于IP的数据网络无缝桥接并在此过程中高质量地处理实时语音流。这不仅仅是硬件设计的问题更是一个复杂的软硬件协同工程。飞思卡尔Freescale现为NXP的一部分推出的Packet Telephony Development KitPDK开发套件就是为解决这一痛点而生的“交钥匙”式解决方案。它不是一个简单的评估板而是一个集成了嵌入式Linux控制平面和StarCore DSP信号处理平面的完整开发与测试平台。PDK的核心价值在于它预先集成了所有必要的软件基础设施。想象一下你要从头构建一个媒体网关你需要为PowerPC架构的MPC8260主机处理器移植Bootloader如U-Boot、裁剪和定制Linux内核、构建根文件系统、编写驱动来控制复杂的电信接口卡如PSTN卡包含E1/T1帧中继器和用户线接口电路SLIC还要为负责语音编解码的DSP如MSC810x系列搭建独立的开发、编译和调试环境。这个过程耗时耗力且充满了底层硬件交互的“坑”。PDK直接把这一切都准备好了——开箱即用Flash里已经烧录好了可启动的Linux系统、基础应用和DSP固件开发者拿到手接上电源和串口线几分钟内就能让电话机通过这个“网关”互相通话或者连接到T1线路上。这套开发套件的技术栈非常典型地反映了二十一世纪初高端嵌入式通信设备的架构一个运行嵌入式Linux的通用处理器MPC8260作为“大脑”负责系统控制、网络协议栈TCP/IP、管理界面如Web服务器、FTP和业务逻辑一个或多个高性能的DSPStarCore内核作为“加速引擎”专门负责对计算密集型的实时信号进行处理比如G.711、G.729语音编解码、回声消除、双音多频DTMF检测等。两者通过高速的TDM时分复用总线或主机接口进行数据和命令交互。PDK不仅提供了硬件板卡更重要的是提供了完整的软件包从Bootloader、Linux内核源码、根文件系统到控制DSP和电话卡的应用库libpdk、示例程序乃至针对主机和DSP的交叉编译工具链GCC for PowerPC, CodeWarrior for StarCore。这使得开发者可以立即在已知稳定的软件基础上专注于上层应用和特定算法的开发极大缩短了产品上市时间。2. PDK开发套件核心组件与工作原理拆解要玩转PDK首先得吃透它的硬件构成和软件架构。这不是一块简单的单片机开发板而是一个微缩版的电信设备。2.1 硬件平台解析MPC8260与StarCore的协同PDK的硬件核心是一块基于PowerPC架构的MPC8260通信处理器的主板。MPC8260是当年通信处理器的明星产品集成了强大的CPU核心和丰富的通信外设控制器特别适合作为网络设备的主控。在PDK上它主要承担几项任务系统控制与引导通过板载的Flash存储器启动U-Boot当时叫PPCBoot进而加载和启动Linux内核。运行嵌入式Linux操作系统提供进程管理、内存管理、文件系统、网络协议栈等核心服务。管理外围硬件通过PCI或本地总线控制插在板上的各种子卡比如PSTN电话接口卡和DSP处理卡。提供开发接口通过以太网口PDK通常有两个提供Telnet、FTP和Web服务方便开发者远程登录、传输文件和进行网络调试。DSP部分则由一块或多块StarCore架构的DSP子卡承担例如MSC8101PFC或MSC8102PFC。StarCore是当时专为高性能数字信号处理如语音、图像编解码设计的DSP内核。在媒体网关中DSP的典型工作流程是从TDM总线上接收来自PSTN卡的原始PCM脉冲编码调制语音数据流然后运行编解码算法如将64 kbps的G.711码流压缩为8 kbps的G.729码流再将处理后的数据通过主机接口提交给MPC8260由Linux网络协议栈打包成RTP/UDP/IP报文发送到IP网络反向流程亦然。注意DSP子卡本身并不运行Linux。它们运行的是由CodeWarrior for StarCore工具链编译的、无操作系统的裸机程序或简单的实时内核。Linux主机MPC8260通过特定的驱动程序和库函数libpdk的一部分来加载DSP程序、传递命令和交换数据。2.2 三层软件架构从Bootloader到应用PDK的软件环境是一个经典的三层结构理解这个结构是进行任何定制开发的基础。第一层Bootloader (PPCBoot/U-Boot)这是系统上电后运行的第一段代码存储在Flash的特定区域。它的职责非常明确硬件初始化配置CPU、内存控制器、串口、以太网控制器等。引导介质选择决定从何处加载Linux内核镜像——默认是从Flash中解压但也支持通过网络TFTP协议从开发主机加载这在频繁更新内核的调试阶段非常有用。传递参数为即将启动的Linux内核设置启动参数如内存地址、根文件系统位置等。系统维护提供一个简单的命令行接口允许开发者查看内存、读写Flash、设置环境变量等。PDK文档中提到的progflash工具实际上就是在Linux运行后用来更新Flash中Bootloader镜像的应用程序但其操作需要极度谨慎。第二层Linux内核与根文件系统这是系统的“心脏”和“仓库”。Linux内核PDK提供的是一个为MPC8260和特定板级硬件定制过的内核。它包含了必要的驱动串口驱动、以太网驱动可能支持两个网卡、用于控制PSTN卡和DSP卡的特定字符设备或平台设备驱动、以及TDM总线驱动等。内核通常以压缩格式如zImage存储在Flash中由Bootloader解压到SDRAM中运行。根文件系统PDK默认使用Ramdisk内存磁盘作为根文件系统。Bootloader将存储在Flash中的一个压缩的根文件系统镜像如rootfs_xxx.gz解压到内存中然后挂载为/。这样做的好处是速度快且对Flash的读写损耗小。但缺点是所有改动在断电后都会丢失。因此PDK也支持通过网络文件系统NFS挂载根文件系统这对于需要频繁修改和调试应用程序的开发阶段是首选方案。第三层应用程序与库这是开发者主要与之打交道的部分运行在用户空间。系统工具BusyBox提供的精简版Linux命令ls,cd,ping,ifconfig等。网络服务轻量级的Telnet守护进程、FTP服务器和Web服务器如Boa使得PDK可以作为一个独立的网络设备被访问和管理。核心库libpdk这是PDK软件包的灵魂。它封装了所有与底层硬件PSTN卡、DSP卡交互的复杂操作提供了一组统一的C语言API。例如初始化电话卡、配置TDM时隙交换、控制电话振铃、加载DSP程序等操作都可以通过调用libpdk的函数来完成而无需开发者去读写具体的硬件寄存器。实用工具程序如init_pstn1,tsi,qf,duslic等这些既是开箱即用的测试工具也是学习如何使用libpdk的绝佳示例。它们可以直接在串口终端中运行用于验证硬件功能、建立通话连接等。2.3 PSTN1电话接口卡深度剖析PSTN1卡是PDK连接现实世界电话网络的关键。它不是一个简单的接口转换器而是一个集成了多个专业芯片的复杂子系统。核心芯片与功能QuadFALC E1/T1成帧器这是一颗处理4路E1或T1数字中继线路的芯片。E12.048 Mbps32时隙和T11.544 Mbps24时隙是电信网络的标准数字接口。QuadFALC负责完成线路的物理层成帧、时钟恢复、信令比特插入/提取等底层工作。通过qf工具开发者可以配置其工作模式主/从时钟、帧格式ESF/D4、线路编码B8ZS/AMI等。DuSLIC用户线接口电路每颗DuSLIC芯片支持两路模拟电话POTS接口。PSTN1卡上有两颗共支持4部普通电话机。它负责提供馈电、振铃、摘挂机检测、2/4线混合转换消除回声的基础等所有模拟电话线路所需的功能。duslic工具就是用来控制这两颗芯片的例如命令其向特定端口发送振铃信号。TSI时隙交换器这是PSTN1卡上的“交通枢纽”是整个数据流控制的核心。它连接了四个独立的128时隙TDM数据流Stream 0-3。每个时隙对应一个64 kbps的PCM语音通道。Stream 0 3连接到主板最终通向DSP卡。语音数据通过这两个流被送往DSP进行处理。Stream 1连接到QuadFALC承载来自/去往E1/T1线路的24或32个时隙。Stream 2连接到DuSLIC承载来自/去往4部模拟电话的4个时隙。TSI的强大之处在于其无阻塞的交换能力。通过tsi工具或libpdkAPI你可以编程实现任意一个流上的任意一个时隙连接到另一个流上的任意一个时隙。例如你可以轻松地将电话AStream 2, Slot 0的语音路由到T1线路的第一个信道Stream 1, Slot 0再通过tsi命令将其回环到电话BStream 2, Slot 1从而实现一次跨越数字中继的内部通话测试。这种灵活性对于构建复杂的呼叫路由和测试场景至关重要。3. 从零开始PDK开发环境搭建与上手实操拿到PDK硬件套件后第一步不是急着写代码而是让整个系统先跑起来建立基本的开发循环。这个过程虽然文档里有但其中有些细节和“坑”只有实际做过才知道。3.1 硬件连接与上电开箱检查对照清单确认所有部件PDK主板、电源注意110V/220V电压切换开关、电源线、串口线DB9、网线。检查是否有DSP子卡和PSTN1子卡已经插在主板上。连接串口这是你与PDK最初的“对话”通道。用串口线连接PDK的串口通常是DB9母头和你的PC的串口或USB转串口适配器。在PC上打开终端软件如Tera Term、PuTTY、SecureCRT或Minicom。关键参数波特率115200数据位8停止位1无奇偶校验无流控制。这是绝大多数嵌入式Linux开发板的默认设置务必准确。连接网络可选但推荐用网线将PDK的第二个以太网口文档中强调的连接到你的局域网交换机或路由器。PDK默认的IP地址是192.168.1.50。确保你的PC在同一网段例如192.168.1.x。上电启动致命警告在插电前务必确认电源模块侧面的电压选择开关与你所在地区的市电电压一致110V或220V。接错电压会瞬间烧毁电源甚至主板没有挽回余地。连接电源线打开电源开关。此时PDK面板上的电源指示灯应该亮起。将PDK前面板的电源开关拨到“ON”位置。此时你的终端软件窗口应该开始滚动显示U-Boot的启动信息接着是Linux内核解压和启动的过程。3.2 首次登录与基础验证当启动日志停止滚动最后出现类似PDK login:的提示符时说明系统已成功启动。登录用户名输入demo密码也是demo。成功登录后你会看到一个Linux shell提示符例如[demoPDK /]$。恭喜你现在已经站在了一个运行着嵌入式Linux的通信处理器上了。运行第一个测试尝试一些基本命令验证系统状态。# 查看CPU信息 cat /proc/cpuinfo # 查看内存信息 cat /proc/meminfo # 查看网络接口 ifconfig -a # 你应该能看到类似eth0, eth1的接口以及它们的IP地址eth1可能是192.168.1.50 # 尝试ping一下网关或你的PC ping 192.168.1.1测试电话功能如果接了PSTN1卡和电话机将两部电话机分别连接到PSTN1卡的Port 0和Port 1RJ-11接口。在终端中输入命令init_pstn1 -s ph_to_ph。这个命令会初始化PSTN1卡并运行一个预设的TSI脚本ph_to_ph该脚本将Port 0和Port 1的时隙互相连接起来。拿起两部电话的听筒你应该能听到拨号音并且可以互相通话。这个简单的测试验证了从电话接口、TSI交换到基础音频通路的所有硬件和底层驱动都是正常的。3.3 建立网络开发环境通过串口操作效率太低我们需要通过网络来工作。Telnet登录确保你的PC可以ping通PDK192.168.1.50。然后在PC上打开命令提示符或终端输入telnet 192.168.1.50如果使用现代Windows系统可能需要先在“启用或关闭Windows功能”中启用Telnet客户端。使用相同的demo/demo凭证登录。现在你有了一个更友好的全屏终端。FTP文件传输PDK内置了FTP服务器。你可以使用FileZilla、WinSCP或命令行FTP客户端连接到192.168.1.50用户demo密码demo。这样你就可以方便地将你在PC上编译好的应用程序上传到PDK的/tmp目录Ramdisk中或者从PDK下载日志文件。配置NFS强烈推荐用于开发这是提升开发效率的关键一步。目标是将PDK的根文件系统或至少某个目录如/mnt/nfs挂载到你的Linux开发主机的一个共享目录上。这样你在主机上编译的程序PDK可以直接运行无需反复上传。在开发主机上安装NFS服务器编辑/etc/exports添加一行/path/to/your/nfs_share 192.168.1.50(rw,sync,no_root_squash,no_subtree_check)。然后重启NFS服务。在PDK上首先确保PDK能ping通主机。然后创建挂载点mkdir /mnt/nfs。最后执行挂载命令mount -t nfs -o nolock 192.168.1.x:/path/to/your/nfs_share /mnt/nfs将192.168.1.x替换为你主机的IP。验证在主机共享目录里创建一个测试文件在PDK的/mnt/nfs下应该能立即看到。如果遇到权限问题检查no_root_squash选项和防火墙设置。实操心得在嵌入式开发中串口是“救命稻草”用于最初的引导和内核调试。但一旦网络通了NFS是最高效的开发方式没有之一。它让你在主机上享受完整的编辑、编译和版本控制工具链在目标板上实现近乎即时的测试极大提升了迭代速度。务必掌握。4. 深入开发编写、构建与调试自定义应用当基础环境搭建好后真正的开发工作才开始。PDK提供了从应用到DSP的完整工具链。4.1 为主机MPC8260开发应用主机应用运行在嵌入式Linux上通常负责控制、管理、协议处理和与DSP通信。获取并安装交叉编译工具链PDK配套的Platform Creation Suite (PCS) CD中包含了针对PowerPC架构的交叉编译器如powerpc-linux-gcc。你需要将其安装到你的Linux开发主机上。通常是一个解压并设置环境变量的过程。# 假设工具链解压到 /opt/pdk/toolchain export PATH/opt/pdk/toolchain/bin:$PATH export CROSS_COMPILEpowerpc-linux-获取PDK源码和库从Supplemental Software CD中找到pdk_src_unix_newlines.tgz用于Linux主机或pdk_src_pc_newlines.zip用于Windows主机但源码中的换行符是Windows风格。将其解压到你的工作目录。这里面包含了Linux内核源码用于参考或定制。libpdk库的源码和头文件。大量的示例程序源码。编写你的第一个程序参考示例程序一个最简单的程序可能只是调用libpdk初始化PSTN卡。// simple_pstn_test.c #include stdio.h #include pdk/pdk.h // libpdk 的主头文件 int main() { printf(Initializing PSTN1 card...\n); // 这是一个示例性的API调用实际函数名需参考libpdk文档 // pdk_init() 可能是一个总的硬件初始化函数 if (pdk_init() 0) { perror(Failed to initialize PDK); return -1; } // 使用更具体的初始化函数例如初始化PSTN卡为电话互连模式 // 实际函数和参数请查阅PDK软件用户指南 if (init_telephony_card(ph_to_ph) 0) { perror(Failed to init telephony card); return -1; } printf(PSTN1 card ready. Phones on port 0 and 1 should be connected.\n); // 保持程序运行或者做一些其他控制 sleep(10); printf(Test finished.\n); return 0; }交叉编译使用交叉编译工具链进行编译并静态链接libpdk以避免目标板上库版本问题。# 假设你的工作目录结构是 /your_workspace/ # /your_workspace/pdk_src/ 包含解压的源码和库 # /your_workspace/app/ 是你的应用目录 $CROSS_COMPILE-gcc -I../pdk_src/include -L../pdk_src/lib -o simple_pstn_test simple_pstn_test.c -lpdk -static-static参数很重要它会把libpdk的代码静态链接到你的可执行文件中这样你就不需要单独拷贝.so文件到目标板了。部署与运行通过FTP或NFS将编译好的simple_pstn_test文件放到PDK上赋予可执行权限 (chmod x simple_pstn_test)然后运行./simple_pstn_test。如果一切正常你应该能看到初始化信息并且连接的电话可以通话。4.2 为DSPStarCore开发软件DSP开发是另一个维度它更接近底层硬件和实时处理。环境准备DSP开发需要在Windows PC上安装CodeWarrior for StarCore集成开发环境IDE。PDK附带了30天的评估版。同时你需要从Supplemental CD中解压DSP软件包 (dsp_software.tgz)。理解开发流程DSP程序通常由MPC8260上的Linux主机来加载和启动。流程如下在CodeWarrior中创建或打开一个针对MSC810x的工程。编写你的DSP算法代码例如一个G.729编码器函数。编译链接生成一个可执行的二进制文件.elf或.abs格式。将这个二进制文件通过FTP等方式放到PDK的Linux文件系统中。编写一个主机端MPC8260上运行的控制程序使用libpdk提供的API例如dsp_load()dsp_start()来将DSP程序加载到DSP卡的内存中并启动DSP核心运行。主机程序通过共享内存或消息队列与DSP程序进行数据语音帧和命令交换。示例剖析查看DSP软件包中的示例比如一个简单的回声消除AEC或语音活动检测VAD例子。你会看到DSP代码的结构通常是初始化硬件DMA、中断、进入主循环、等待主机命令或数据、处理、返回结果。主机端示例则会展示如何初始化DSP通信通道、加载代码、配置DMA传输语音数据。4.3 调试技巧主机与DSP主机应用调试printf大法在嵌入式Linux中依然是最直接有效的调试手段。确保你的程序输出到串口或通过syslog记录。GDB GDBServer这是更专业的调试方法。在PDK上运行gdbserver :2345 ./your_program2345是端口号。在你的Linux开发主机上使用交叉编译工具链中的GDBpowerpc-linux-gdb连接上去target remote 192.168.1.50:2345。然后你就可以像调试本地程序一样设置断点、单步执行、查看变量了。这是必须掌握的技能对于复杂逻辑调试至关重要。DSP程序调试CodeWarrior 仿真器/调试器在开发初期可以先用CodeWarrior自带的指令集仿真器Simulator运行和调试DSP代码验证算法逻辑。硬件调试对于实时性问题必须将DSP代码下载到实际的PDK DSP卡上调试。这需要通过JTAG接口连接DSP调试器如CodeWarrior支持的USB TAP这通常更复杂用于解决最底层的硬件驱动和实时性bug。日志与状态反馈一种实用的方法是让DSP程序通过共享内存区域或特定的主机-DSP通信寄存器向主机发送状态和调试信息。主机程序定期读取并打印这些信息从而了解DSP内部的运行情况。5. 高级应用与故障排查实战在掌握了基础开发后你会遇到更复杂的集成任务和令人头疼的故障。以下是一些高级主题和常见问题的解决思路。5.1 构建自定义的Linux系统PDK预装的系统可能缺少你需要的驱动或软件包。你可能需要重新配置内核、构建新的根文件系统。获取内核源码从pdk_src包中获取。配置内核使用交叉编译工具链中的make menuconfig。重点配置处理器类型选择正确的PowerPC MPC8260平台和具体的板级支持包BSP。设备驱动确保你的PSTN卡、DSP卡、以太网、串口等驱动都已编译进内核或作为模块。文件系统支持Ramdisk、NFS、JFFS2如果你想在Flash上创建可读写的持久化分区。编译内核make ARCHpowerpc CROSS_COMPILEpowerpc-linux- uImage。构建根文件系统可以使用BusyBox来构建一个最小的根文件系统然后将你的应用程序和库文件拷贝进去。最后使用genext2fs等工具制作成Ramdisk镜像rootfs.gz。更新PDK使用progflash工具极其危险慎用更新Bootloader或者使用U-Boot的命令如tftp,protect off,erase,cp.b通过网络更新Linux内核和根文件系统镜像到Flash的指定区域。务必先备份原厂镜像。5.2 典型故障场景与排查问题现象可能原因排查步骤与解决方案上电后串口无任何输出1. 电源未接通或电压错误。2. 串口线连接错误或损坏。3. 终端软件参数设置错误。4. 板卡硬件故障。1.首要检查电源开关、电源模块电压设置、电源指示灯是否亮起。2. 确认串口线是直连线而非交叉线尝试更换线缆或USB转串口适配器。3.反复核对终端软件参数115200-8-N-1无流控。4. 如果以上都正确可能是Bootloader损坏需要尝试通过JTAG恢复这超出了基础范围。能收到启动信息但无法登录1. 根文件系统损坏。2. 用户名/密码错误非默认。3. 串口终端类型设置问题。1. 观察内核启动最后是否报告挂载根文件系统失败如“Kernel panic - not syncing: VFS”。2. 尝试默认的demo/demo或root/root如果有。3. 在终端软件中尝试切换终端类型如VT100, ANSI。网络不通无法ping/telnet1. 网线未连接或损坏。2. IP地址配置错误。3. PDK的eth1默认管理口未启用或驱动问题。4. 防火墙或PC网络设置问题。1. 检查网口指示灯是否亮起/闪烁。2. 在PDK串口终端执行ifconfig eth1查看IP是否为192.168.1.50。如果不是用ifconfig eth1 192.168.1.50 up手动设置。3. 检查PC的IP是否在同一网段并关闭PC的防火墙临时测试。4. 尝试更换交换机端口或使用直连网线连接PC和PDK。init_pstn1等命令执行失败1. PSTN1卡未正确插入或供电。2. 相关内核驱动未加载。3.libpdk库缺失或版本不匹配。4. 硬件故障。1. 关机重新拔插PSTN1卡确保接触牢固。2. 使用lsmod查看是否有pstn1或相关驱动模块。使用insmod手动加载需有.ko文件。3. 使用ldd /usr/local/bin/init_pstn1检查程序依赖的库是否存在。确保你的程序链接了正确版本的libpdk。4. 运行dmesg | tail查看内核日志常有硬件初始化失败的详细错误信息。DSP程序加载后无响应或崩溃1. DSP程序编译目标错误错误的DSP型号。2. 加载地址或内存配置错误。3. DSP与主机间通信机制如中断、DMA配置错误。4. DSP代码存在死循环或非法内存访问。1.仔细核对CodeWarrior工程设置中的目标器件MSC8101 vs MSC8102。2. 检查主机端加载程序使用的DSP内存映射地址是否与DSP链接脚本.lcf文件一致。3. 使用DSP调试器通过JTAG连接进行单步调试这是定位DSP问题最有效的方法。4. 在DSP代码中增加简单的LED闪烁或心跳信号输出到主机帮助判断DSP是否在运行。通话中有杂音、回声或断续1. TDM时隙连接TSI配置错误导致数据流错乱。2. DSP编解码算法处理异常。3. 时钟同步问题特别是T1/E1线路。4. 模拟线路电话接口硬件问题。1. 使用tsi工具的ddump命令检查相关TDM流上的时隙数据确认连接正确且数据在变化。2. 简化测试使用init_pstn1 -s ph_to_ph进行纯模拟通话如果问题消失则问题可能出在DSP或数字链路配置上。3. 检查T1/E1线路配置主/从时钟使用qf工具检查线路状态stat命令。4. 尝试更换电话机或电话线。5.3 性能优化与生产化考量当你的原型在PDK上运行稳定后就需要考虑如何将其转化为产品。内核与系统裁剪移除所有调试信息、不必要的驱动和模块缩小内核和根文件系统体积加快启动速度。实时性增强标准Linux内核并非硬实时系统。对于语音处理这类对延迟敏感的应用可以考虑内核抢占开启内核的抢占选项CONFIG_PREEMPT。高精度定时器使用CONFIG_HIGH_RES_TIMERS。实时内核补丁如PREEMPT-RT补丁但这需要额外的移植和测试工作。关键任务用户态实现将最关键的实时任务如语音包收发放在一个独占CPU核心的、优先级最高的用户态进程中并配合mlockall锁定内存避免换页。DSP负载均衡如果使用多核DSP如MSC8102需要设计好任务分配方案例如将编码和解码任务分配到不同的核心或者采用主从模式。生产映像制作开发阶段的NFS、FTP、Telnet等服务在生产环境中需要关闭。制作一个最终的、包含所有必要软件和配置的、只读的根文件系统镜像如CRAMFS, SQUASHFS并烧录到Flash中。更新机制也需要设计可能通过安全的网络升级或本地U盘升级。PDK作为一个功能强大的开发平台其价值在于它为你铺平了从概念验证到产品原型的道路。它封装了底层硬件的复杂性让你能聚焦于上层应用和核心算法。然而要真正驾驭它需要你同时具备嵌入式Linux系统、数字信号处理和电信网络的基础知识。通过反复的实践、调试和对文档的深入研究你会逐渐将这块功能丰富的板子变成实现你媒体网关创意的得力工具。记住嵌入式开发没有捷径每一个闪亮的指示灯背后都可能是一连串寄存器配置和时序调优的结果。