深入解析TI C6000 DSP SYSCFG模块:从寄存器原理到实战优化
发布时间:2026/7/21 6:02:25
分类:文化教育
浏览:1234

1. 项目概述为什么需要深入理解SYSCFG模块在嵌入式开发尤其是基于TI C6000系列DSP进行高性能实时信号处理时我们常常会花大量时间在算法优化、内存管理和任务调度上。然而一个经常被新手甚至部分有经验的工程师忽视的“暗区”恰恰是决定系统能否稳定、高效运行的基石——系统配置模块。这个模块在TI的文档里通常被称为SYSCFG它不像算法那样充满数学美感也不像驱动框架那样有清晰的API它更像是一栋大楼的“总配电箱”和“中央控制面板”。你可能会问芯片上电后程序不是跑起来了吗为什么还要关心这些底层寄存器我刚开始做电机控制项目时就踩过坑。当时为了追求FOC算法的极致性能把PWM中断频率推得很高算法本身运行良好但系统偶尔会“卡顿”一下丢失几个PWM周期导致电机抖动。排查了很久从代码优化到Cache配置都试了一遍最后才发现问题出在EDMA传输的突发大小配置上。默认的16字节突发在频繁的中断和DMA搬运场景下造成了系统总线访问的冲突和延迟。而这个关键的配置位就藏在SYSCFG模块里一个不起眼的寄存器中。这就是SYSCFG模块的价值它不直接处理你的音频数据或电机电流但它决定了数据流动的“交通规则”、中断响应的“优先级仲裁”以及各个外设模块的“工作时钟”。理解它意味着你从“写代码让芯片工作”进阶到“配置芯片以最优方式为你工作”。本次分享我就以TI C674x系列DSP的SYSCFG模块为例掰开揉碎几个最核心的寄存器——CHIPSIG、CHIPSIG_CLR、CFGCHIP0/1/3/4聊聊它们背后的设计逻辑、实际配置中的“坑”以及如何利用它们解决真实项目中的棘手问题。无论你是正在调试一个复杂的多核通信机制还是想优化外设间的协作效率这些寄存器级的细节都至关重要。2. 核心思路SYSCFG模块的设计哲学与访问要点在深入每个寄存器之前我们需要先建立对SYSCFG模块的整体认知。它不是一堆随意摆放的开关其设计遵循着清晰的层次化和模块化思想。2.1 模块定位芯片的“神经中枢”与“资源调度中心”SYSCFG模块通常位于芯片系统互联架构的最顶层。你可以把它想象成公司的“总经理办公室”和“总务处”的结合体。它不直接参与具体的“生产”如CPU运算、DMA传输但负责制定全公司的规章制度如中断路由策略、分配公共资源如某些时钟源、并处理一些需要高层协调的紧急事件如芯片级信号中断。它的核心职能包括中断管理与信号路由提供一种机制让芯片上的一个子系统如PRUSS、ARM核能够向DSP核发送中断信号甚至是非屏蔽中断用于核间通信或紧急事件处理。全局功能控制锁定关键配置寄存器防止误写、配置DMA控制器的底层传输行为如突发大小这些设置会影响整个芯片的数据吞吐效率和实时性。外设信号源交叉切换这是一个非常强大且灵活的功能。它允许将某个外设如McASP的发送事件映射到另一个外设如eCAP模块作为其触发源。这打破了外设间物理引脚连接的局限实现了高度可编程的信号互联。时钟源管理为特定模块如EMIF外部存储器接口选择时钟来源直接影响存储器的访问速度和功耗。引导配置虽然输入材料中Boot部分只是简介但SYSCFG通常包含BOOTCFG寄存器负责在上电复位时锁存Boot引脚状态决定DSP从哪里启动。2.2 寄存器访问内存映射与操作惯例SYSCFG的所有寄存器都是内存映射的意味着你可以像读写普通内存地址一样操作它们。在C代码中TI通常会通过芯片支持库或直接定义寄存器结构体来访问。一个至关重要的实操细节保留位Reserved Bits的处理。几乎每个寄存器都有标记为“Reserved”的位。数据手册的表格描述里通常会注明“Reserved. Write the default value to all bits when modifying this register.” 这句话是黄金法则必须严格遵守。为什么未来兼容性这些位可能被未来芯片型号用于新功能。如果你写入随机值在新芯片上可能导致未定义行为。稳定性在当前芯片上这些位可能对应着某些未公开的测试或调试逻辑乱写可能引发芯片内部状态异常。操作规范遵循“读-修改-写”模式是安全操作寄存器的标准做法。正确的操作示例以CHIPSIG寄存器为例假设我们只想设置CHIPSIG2位来产生一个中断而不影响其他位。// 错误做法直接赋值这会破坏保留位 SYSCFG_REGS-CHIPSIG 0x4; // 绝对禁止 // 正确做法读-修改-写 uint32_t reg_val SYSCFG_REGS-CHIPSIG; // 1. 读取当前值 reg_val | (1 2); // 2. 仅设置bit2 (CHIPSIG2)保留其他位 SYSCFG_REGS-CHIPSIG reg_val; // 3. 写回对于保留位需要写入特定默认值如CFGCHIP3中某些位需写0xFF的情况也应在修改后确保这些位被恢复为默认值。3. 核心细节解析关键寄存器功能与实战意义接下来我们逐一拆解输入材料中提到的几个核心寄存器。我会结合自己的项目经验解释每个功能点的设计意图和实际应用场景。3.1 中断的“发射台”与“清除站”CHIPSIG CHIPSIG_CLR这对寄存器是理解SYSCFG中断控制逻辑的绝佳起点。它们的设计体现了硬件中断管理的典型模式一个用于“触发”一个用于“清除”。CHIPSIG (Chip Signal Register) - 中断触发寄存器功能用于生成通往DSP核的中断。其中CHIPSIG[4]用于产生非屏蔽中断CHIPSIG[3]和CHIPSIG[2]用于产生普通的可屏蔽中断SYSCFG_CHIPINT3/2。关键特性写1有效写0无效。这是一个典型的“置位”型寄存器。你想触发中断就向对应的位写1。读操作返回的是该位的当前状态因此你也可以把它当作状态标志来查询。CHIPSIG_CLR (Chip Signal Clear Register) - 中断清除寄存器功能专门用于清除CHIPSIG寄存器中已置位的位。向CHIPSIG_CLR的某位写1会清除CHIPSIG寄存器中的对应位写0无效。设计逻辑为什么需要独立的清除寄存器这实现了“触发”和“状态”的分离。CHIPSIG位一旦被置1就会一直保持直到被清除这可以作为一种持久的状态信号。清除操作由另一个寄存器完成为多核或主从式处理器之间的同步提供了便利。实战场景与操作流程假设我们有两个DSP核Core0和Core1Core0需要通知Core1某个任务已完成。Core0触发中断// Core0 代码设置CHIPSIG2向Core1发送中断 SYSCFG_REGS-CHIPSIG | (1 2); // 写1触发SYSCFG_CHIPINT2中断Core1响应中断Core1会进入对应的中断服务程序执行任务。中断服务与同步// Core1 中断服务程序 (ISR) 中 void SYSCFG_CHIPINT2_ISR(void) { // 1. 执行任务... process_task_from_core0(); // 2. 清除中断源告诉Core0我已处理完 SYSCFG_REGS-CHIPSIG_CLR | (1 2); // 写1清除CHIPSIG2位 // 3. 其他必要的中断清理... }Core0轮询同可选如果Core0需要确认Core1已完成它可以轮询CHIPSIG[2]位。// Core0 代码等待Core1清除中断 while (SYSCFG_REGS-CHIPSIG (1 2)) { // CHIPSIG2位仍为1说明Core1还未清除等待... } // 位被清0说明Core1已处理完毕注意事项CHIPSIG_CLR是一个“瞬间”动作寄存器。你写1清除后该位在CHIPSIG_CLR本身中并不会保持为1。下次读取CHIPSIG_CLR该位很可能就是0。它的作用仅仅是发出一个清除脉冲。3.2 性能与安全的守门人CFGCHIP0这个寄存器控制着两项看似不相关但至关重要的功能PLL寄存器锁和EDMA3传输控制器的默认突发大小。它们分别关乎系统安全性和数据吞吐性能。PLL_MASTER_LOCK位系统的“保险丝”功能当此位置1时锁住所有PLL控制器内存映射寄存器防止软件意外写入。为什么需要它PLL负责产生芯片的核心时钟。运行时随意修改PLL配置如倍频系数、分频器轻则导致系统时钟紊乱、外设通信失败重则导致芯片锁死需要硬复位。在系统初始化完成时钟稳定后立即锁住PLL寄存器是一个非常好的安全实践。操作建议在系统初始化函数的末尾配置完所有时钟后立即执行锁定。// 配置PLL0, PLL1等... setup_system_clocks(); // 锁定PLL寄存器防止后续代码误修改 SYSCFG_REGS-CFGCHIP0 | (1 4); // 设置PLL_MASTER_LOCK位 // 从此以后任何对PLL寄存器的写操作都将被硬件忽略TCxDBS位EDMA3传输的“吞吐量调节器”功能设置特定EDMA3传输控制器的默认突发大小。可选16、32或64字节。深入原理EDMA3是C6000 DSP上高效的数据搬运引擎。突发大小定义了TC传输控制器每次向系统总线发起请求时连续传输的字节数。更大的突发意味着更高的总线利用率减少了每次传输的地址发布和仲裁开销在传输大块连续数据时能显著提升吞吐量。更利于预emption所有传输请求在内部会被按突发大小切分。在突发边界系统会根据MSTPRI寄存器重新评估各主设备的优先级从而实现更精细的系统级带宽管理和实时抢占。性能权衡大突发64字节适合大数据块、连续内存访问的场景如视频帧搬运、音频缓冲区交换。能最大化总线效率。小突发16字节适合频繁、零散的小数据包传输或当系统中存在多个高优先级、需要快速响应的小数据量主设备时。可以减少单个主设备占用总线的时间提高系统整体响应性。TC FIFO大小突发大小不能超过TC内部FIFO的容量。需要查阅具体芯片的数据手册确认。配置示例假设我们的应用主要是处理音频流大数据块希望TC0使用64字节突发以提升效率而TC1用于处理一些零散的外设数据保持默认的16字节。uint32_t temp SYSCFG_REGS-CFGCHIP0; temp ~(0x3 0); // 清零TC0DBS位域 [1:0] temp | (0x2 0); // 设置TC0DBS 2即64字节 (0:16, 1:32, 2:64) temp ~(0x3 2); // 清零TC1DBS位域 [3:2] temp | (0x0 2); // 设置TC1DBS 0即16字节 SYSCFG_REGS-CFGCHIP0 temp;3.3 外设联动的“编程开关”CFGCHIP1这是SYSCFG模块中最能体现其“系统配置”灵活性的寄存器之一。它允许你将不同外设模块的事件信号连接起来实现硬件级的自动触发极大减轻CPU负担。CAPxSRC位域eCAP的事件输入源选择功能将eCAP模块的捕获输入信号从默认的物理引脚切换到其他外设的内部事件。例如可以将eCAP0的触发源设置为McASP0的TX DMA事件。应用价值假设你在做电机控制使用eCAP来捕获编码器脉冲以计算转速。同时你用McASP播放一段表示特定状态的音频提示。现在你可以配置eCAP1的触发源为McASP的TX DMA完成事件。这样每当一段音频发送完成硬件会自动触发一次eCAP捕获。你可以在eCAP的中断里读取时间戳精确得知音频播放结束的瞬间进而同步执行下一个动作如改变PWM参数实现音频与电机控制的硬同步无需CPU轮询或软件中断协调精度极高且无延迟。TBCLKSYNC位eHRPWM时钟的全局同步功能一次性同步所有已使能eHRPWM模块的时基时钟。为什么重要在多电机控制如双轴机器人中如果两个PWM通道的时基不同步即使设置相同的占空比它们的脉冲起始边沿也可能有微小偏差导致控制上的不同步。使用此位进行硬件同步可以确保所有PWM通道的时钟相位完全对齐。操作流程停止所有需要同步的eHRPWM模块的时基计数器设置各自的TBCTL[CTRMODE]00b停止模式。确保所有eHRPWM模块的TBCTL[PHSEN]位配置相同。设置CFGCHIP1[TBCLKSYNC] 1。硬件会在下一个TBCLK上升沿同时启动所有eHRPWM模块的时基计数器。AMUTESELx位McASP静音输入信号源功能选择哪个GPIO Bank的中断作为McASP的AMUTEIN音频静音输入信号源。应用场景在音频系统中你可能有一个硬件按键用于紧急静音。将此按键连接的GPIO配置为中断并通过AMUTESELx将其映射到McASP的AMUTEIN。当按键按下GPIO中断触发硬件会自动将McASP的音频输出静音响应速度远超软件检测。3.4 时钟架构的“路由表”CFGCHIP3这个寄存器管理着芯片内部分时钟的生成与路由主要影响外部存储器接口的性能。DIV4P5ENA位使能/禁用DIV4.5分频器功能控制是否启用一个固定的4.5分频器用于从600MHz的PLL时钟生成133MHz时钟。背景知识133MHz是SDRAM如DDR2接口的常用时钟频率。这个4.5分频器提供了一条从高速PLL直接产生所需频率的路径。选择逻辑如果PLL的输出频率恰好是600MHz且你需要133MHz的EMIF时钟那么使能此分频器是最直接高效的方式。否则你可能需要通过PLL自身的分频器或其他时钟路径来生成所需频率。EMA_CLKSRC 和 EMB_CLKSRC位EMIF时钟源选择功能分别为EMIFA和EMIFB存储控制器选择时钟源。可以选择来自PLLC的SYSCLKx或者来自上述DIV4.5分频器的输出。设计考量性能隔离让不同的EMIF使用独立的时钟源可以避免一个EMIF上的频繁访问影响另一个EMIF的带宽和延迟。功耗管理如果某个EMIF暂时不用可以将其时钟源切换到更低频率或关闭以节省功耗。时序满足必须确保所选的时钟源频率能满足所连接存储器的时序要求如tCK, tAC等。配置示例为连接到133MHz DDR2的EMIFA配置时钟。// 假设PLL0输出为600MHz // 1. 首先使能DIV4.5分频器 SYSCFG_REGS-CFGCHIP3 | (1 2); // 设置DIV4P5ENA // 2. 将EMIFA时钟源切换到DIV4.5输出 uint32_t temp SYSCFG_REGS-CFGCHIP3; temp | (1 1); // 设置EMA_CLKSRC 1选择DIV4.5输出 SYSCFG_REGS-CFGCHIP3 temp; // 现在EMIFA的时钟为 600MHz / 4.5 ≈ 133.33MHz3.5 信号清理的“复位键”CFGCHIP4这个寄存器功能单一但很实用清除McASP的AMUTEIN信号锁存状态。功能向AMUTECLRx位写1会产生一个脉冲清除对应McASP的AMUTEIN信号存状态。工作流程当GPIO中断触发McASP静音后该静音状态可能被硬件“锁存”。即使GPIO中断条件已消失McASP可能仍保持静音。此时需要通过软件写CFGCHIP4[AMUTECLRx]来显式清除这个锁存状态从而解除静音。操作这是一个典型的“写1清除”操作通常放在解除静音的控制逻辑中。// 用户按下“取消静音”按钮后 SYSCFG_REGS-CFGCHIP4 | (1 0); // 写1清除McASP0的AMUTEIN锁存 // 注意该位是自清除的无需手动清零4. 实战配置流程与代码剖析理解了单个寄存器后我们来看一个完整的实战场景配置一个基于SYSCFG模块的核间中断通信与EDMA高效传输系统。4.1 场景设定与目标假设我们有一个双核系统DSP Core0, DSP Core1Core0负责高性能算法运算如FFT并将结果数据块通过EDMA搬运到共享内存。Core1负责控制逻辑和通信需要被Core0通知“数据已就绪”。目标Core0完成计算和DMA搬运后通过SYSCFG产生中断通知Core1。同时优化EDMA的传输性能。4.2 系统初始化配置步骤步骤1配置EDMA3传输控制器突发大小系统启动早期在main()函数或系统初始化早期根据数据传输特性配置CFGCHIP0。假设Core0使用的EDMA通道关联到TC0且传输的数据块较大如512字节的FFT结果数组。void syscfg_early_init(void) { // 配置TC0使用64字节突发以提升大数据块传输效率 uint32_t cfgchip0 HWREG(SYSCFG_CFGCHIP0); // 使用硬件抽象层读寄存器 cfgchip0 ~(0x00000003); // 清零TC0DBS[1:0] cfgchip0 | 0x00000002; // 设置TC0DBS 2 (64字节) HWREG(SYSCFG_CFGCHIP0) cfgchip0; // 写回 // 锁定PLL寄存器防止后续误操作时钟初始化完成后 // 假设pll_init()函数已完成PLL配置 pll_init(); cfgchip0 HWREG(SYSCFG_CFGCHIP0); cfgchip0 | 0x00000010; // 设置PLL_MASTER_LOCK位 HWREG(SYSCFG_CFGCHIP0) cfgchip0; }步骤2配置核间中断Core1侧初始化Core1需要使能并连接SYSCFG产生的中断到其CPU可屏蔽中断输入。// Core1 初始化代码 void core1_interrupt_init(void) { // 1. 在中断控制器中将SYSCFG_CHIPINT2映射到Core1的某个可屏蔽中断线如INT8 // 假设使用INTC模块具体函数取决于你的驱动库 IntMapSet(INT_SYSCFG_CHIPINT2, 8); // 将SYSCFG_CHIPINT2源映射到CPU INT8 // 2. 使能CPU的INT8中断 IntEnable(8); // 3. 全局使能中断 EINT; // 或使用对应的库函数 }步骤3Core1的中断服务程序// Core1 中断服务程序 __interrupt void sycfg_chipint2_isr(void) { // 1. 读取共享内存中的数据 process_shared_data(); // 2. 清除SYSCFG中断源告知Core0处理完成 HWREG(SYSCFG_CHIPSIG_CLR) | (1 2); // 清除CHIPSIG2 // 3. 清除中断控制器中的中断标志根据具体INTC操作 IntPendClr(INT_SYSCFG_CHIPINT2); // 4. 确认中断某些架构需要 IntAck(8); }步骤4Core0的数据处理与中断触发// Core0 数据处理函数 void core0_process_and_notify(void) { // 1. 执行计算 perform_fft(); // 2. 配置EDMA将结果从内部存储器搬运到共享内存使用TC0 // 注意由于之前设置了TC0 DBS64这里的大数据块传输会更高效 edma_start_transfer(fft_result_buffer, shared_memory_area, BUFFER_SIZE); // 3. 等待EDMA传输完成可以通过EDMA中断或轮询 while(!edma_transfer_complete()); // 4. 通过SYSCFG触发中断通知Core1数据就绪 HWREG(SYSCFG_CHIPSIG) | (1 2); // 设置CHIPSIG2产生SYSCFG_CHIPINT2 }4.3 配置eCAP与McASP的事件联动高级应用再举一个利用CFGCHIP1实现硬件联动的例子用McASP的帧同步信号触发eCAP捕获。目标在音频系统中精确测量从收到音频帧同步信号到某个外部事件如传感器触发的时间间隔。配置步骤配置McASP设置McASP0工作在主模式产生TX帧同步信号。配置CFGCHIP1将eCAP0的事件源设置为McASP0的TX DMA事件这通常与帧同步关联。void configure_ecap_source_from_mcasp(void) { uint32_t cfgchip1 HWREG(SYSCFG_CFGCHIP1); // 清除CAP0SRC位域 [21:17]然后设置为0x01 (McASP0 TX DMA Event) cfgchip1 ~(0x1F 17); // 0x1F 5 bits mask for CAP0SRC cfgchip1 | (0x01 17); // 设置为1对应McASP0 TX DMA Event HWREG(SYSCFG_CFGCHIP1) cfgchip1; }配置eCAP0工作在捕获模式上升沿触发连续捕获。这样每次McASP0开始发送一帧数据时eCAP0就会自动捕获当前32位计时器的值。测量当外部事件发生时再次触发eCAP捕获例如通过GPIO。在中断中读取两个时间戳其差值即为精确的时间间隔。5. 常见问题排查与调试技巧在实际项目中SYSCFG模块的配置问题往往表现为一些难以定位的系统级异常。以下是我总结的几个典型问题和排查思路。5.1 问题核间中断无法触发或无法清除现象Core0写了CHIPSIG但Core1没有进入中断。或者Core1清除了中断但Core0轮询发现CHIPSIG位始终为1。排查清单中断映射是否正确这是最常见的问题。确认SYSCFG_CHIPINTx这个中断源是否正确地映射到了目标CPU的中断输入线上。查阅芯片的《中断控制器手册》和内存映射表。CPU中断是否全局使能目标CPU的全局中断使能位如CSR寄存器中的GIE位是否打开具体中断线是否使能在CPU或中断控制器中映射到的那个具体中断号如INT8是否被使能中断标志是否被意外清除在中断服务程序中是否先清除了CHIPSIG通过CHIPSIG_CLR然后才清除了中断控制器中的挂起标志顺序错误可能导致中断重复触发或丢失。寄存器位操作是否正确使用“读-修改-写”模式确保没有破坏其他位。使用调试器直接查看CHIPSIG和CHIPSIG_CLR寄存器的值。5.2 问题EDMA传输性能未达预期现象理论计算DMA带宽很高但实测传输速率远低于预期。排查思路检查CFGCHIP0中的DBS设置使用调试器读取CFGCHIP0寄存器确认TCxDBS位域是否按预期设置16, 32, 64字节。一个常见的错误是初始化代码被多次调用意外覆盖了之前的配置。匹配突发大小与数据特性数据对齐确保源地址和目的地址与DBS设置对齐。例如设置DBS64但传输的数据地址是0x80000001非64字节对齐性能会大打折扣因为硬件可能将其拆分成多个非对齐的访问。传输长度如果总传输长度不是DBS的整数倍最后一次传输会是一个小的“残余”突发平均效率会降低。尽量安排传输长度为DBS的整数倍。系统总线竞争即使DBS设置合理如果总线上有其他高优先级主设备如另一个CPU核、另一个DMA控制器频繁发起请求也会抢占带宽。需要结合MSTPRI主设备优先级寄存器整体考虑系统总线仲裁策略。5.3 问题外设信号联动不工作现象按照手册配置了CFGCHIP1将eCAP事件源设置为McASP事件但eCAP无法捕获。排查步骤确认源事件是否真实发生首先确保McASP模块已经正确初始化并正在产生你期望的事件如TX DMA事件。可以通过配置McASP相关的中断或状态寄存器来验证。检查CFGCHIP1配置值在运行时读取CFGCHIP1寄存器确认CAPxSRC位域的值是否正确写入了目标事件代码。理解事件类型McASP TX DMA Event通常指的是McASP发送FIFO到达阈值触发DMA请求的事件而不是每个音频样本发送都会产生。确保你理解所选事件的确切触发条件。检查eCAP模块配置CFGCHIP1只是切换了输入源。eCAP模块本身必须正确使能并配置为捕获模式且其捕获引脚功能可能需要在PinMux中禁用以避免物理引脚信号的干扰。利用中断调试先配置eCAP在目标事件上产生中断。如果中断能触发说明信号通路是通的问题可能在eCAP内部的捕获逻辑如边沿选择、计数器复位模式。如果中断不触发问题更可能出在前端的事件路由上。5.4 调试技巧寄存器查看与脚本化配置使用CCS的寄存器视图在Code Composer Studio中可以方便地查看和修改SYSCFG所有寄存器的值。这是最直观的调试方式。编写配置脚本对于复杂的系统将SYSCFG的初始化步骤写成清晰的函数或宏并添加详细的注释。例如#define SYSCFG_CONFIG_FOR_AUDIO_MOTOR_SYNC() do { \ /* 1. 锁住PLL防止误操作 */ \ SYS_CFGCHIP0_LOCK_PLL(); \ /* 2. 设置EDMA TC0为64字节突发优化音频数据传输 */ \ SYS_CFGCHIP0_SET_DBS(TC0_ID, DBS_64_BYTES); \ /* 3. 将eCAP1连接到McASP0 TX事件用于音频-电机同步 */ \ SYS_CFGCHIP1_SET_ECAP_SRC(ECAP1_ID, EVENT_MCASP0_TX); \ /* 4. 将紧急停止按钮(GPIO Bank2 Int)连接到McASP0静音 */ \ SYS_CFGCHIP1_SET_AMUTE_SRC(MCASP0_ID, GPIO_BANK2_INT); \ } while(0)版本控制与文档将SYSCFG的配置作为系统配置文件的一部分进行版本控制。任何修改都需要记录原因因为它的影响是全局性的。SYSCFG模块的配置是嵌入式系统底层开发的精髓之一。它要求开发者不仅了解单个外设更要理解芯片内部的互联架构和资源调度机制。花时间吃透这些寄存器就像拿到了系统的总布线图在调试复杂问题和进行深度优化时你将拥有降维打击的能力。记住每次修改这些全局配置前都要问自己三个问题这会影响谁为什么要改有没有更安全的方式