乐于分享
好东西不私藏

按键消抖:软件消抖和硬件消抖的原理与实现

按键消抖:软件消抖和硬件消抖的原理与实现
在嵌入式开发中,有一件极其荒谬却又每天都在发生的事情:我们手里掌握着算力高达几百兆赫兹、内部集成几百万个晶体管的精密微控制器(MCU),却常常搞不定一个售价只有一毛钱的机械按键。

我相信你们很多人都经历过这样的“灵异事件”:你在面包板上搭了一个简单的电路,用一个按键控制 LED 灯的亮灭。你的代码逻辑无懈可击——“如果检测到低电平,LED 状态翻转”。你满怀信心地按下按键,结果 LED 灯如同鬼畜一般,疯狂闪烁,最后随机停在一个状态。有时按一下亮,有时按一下却没反应。

你开始怀疑单片机是不是坏了,怀疑电源是不是不稳,甚至怀疑是不是自己的手指带有某种不可名状的静电场。

别怀疑了,单片机没坏,你的手指也没毛病。罪魁祸首,是物理世界的残酷真相与数字世界绝对逻辑之间的巨大鸿沟。

今天,我将结合我过去十几年的底层硬核排坑经验,带你像用显微镜一样,从机械弹片的微观物理学开始,一路向下击穿 RC 滤波网络、施密特触发器,最后在 C 语言代码里,用工业级的状态机架构,教你彻底征服这个磨人的“小妖精”。


放大一万倍看金属碰撞:你的每一次按下,都是一场“地震”

在我们程序员的眼里,按键的逻辑极其简单:按下就是 0(低电平),松开就是 1(高电平)。我们理所当然地认为,电压的变化是一条完美的、垂直跌落的阶跃曲线。

然而,真实的物理世界是不存在“瞬间”这个概念的。

现在,让我们在脑海中把一个普通的微动开关(轻触按键)剖开,并放大一万倍。你会看到,按键的内部是由两片金属触点组成的。当你按下按钮时,上面那片带有弹性的金属簧片,会以极快的速度砸向下面的固定触点。

你觉得它们接触的那一瞬间是完美的贴合吗?绝对不是。

这就好比你把一颗实心钢球,从半空中扔到坚硬的大理石地板上。钢球撞击地板后,绝对不会立刻静止,而是会高高弹起,再次落下,再弹起,幅度越来越小,直到最后完全耗尽动能,才会静止在地板上。

微动开关内部的金属簧片也是一样的。在接触的瞬间,由于金属的弹性和机械结构的惯性,簧片会发生高频的机械弹跳(Bounce)。两个触点会在微秒到毫秒的级别内,经历几十次甚至上百次的“接通-断开-接通-断开”的微观过程。

对于我们人类来说,整个按压过程不到十分之一秒,我们根本感觉不到弹跳。但是,请你看看坐在旁边那个冷酷无情的微控制器(MCU)。

假设你用的是一颗主频为 72MHz 的 STM32 单片机。它的一个机器周期大约是 14 纳秒(ns)。而按键的机械抖动过程,通常会持续 5 毫秒 到 20 毫秒 不等。

这意味着什么?5 毫秒 = 5,000,000 纳秒。在这个短短的抖动期间,STM32 已经执行了超过 350,000 条指令!

在 MCU 看来,你根本不是按了一下按键,你是在用一把加特林机枪,对着它的 GPIO 引脚疯狂扫射了上百个高低电平的脉冲。如果你的代码写的是“检测到下降沿就执行动作”,那么 MCU 就会忠实地在这一瞬间,把你的动作执行几十遍。

这就是所谓的**“按键抖动(Button Bouncing)”。解决这个问题的过程,我们就称之为“消抖(Debouncing)”**。

消抖分为两大流派:硬件消抖软件消抖。一个优秀的嵌入式全栈工程师,必须同时精通这两种武器,并在不同的成本和应用场景下灵活切换。


纯硬件流的浪漫:RC 滤波网络与施密特触发器的极限拉扯

很多纯写代码的工程师一听到硬件电路就头疼,觉得那是硬件工程师的事。但如果你不懂引脚外面的电子是怎么跑的,你写出来的驱动永远是脆弱的。

硬件消抖的核心逻辑非常简单粗暴:既然物理世界产生了高频的毛刺,那我就在物理层把这些毛刺“磨平”,送给单片机一个干净的信号。

1. RC 低通滤波器(RC Low-Pass Filter):电荷的蓄水池

最经典、成本最低的硬件消抖电路,就是一个由电阻(Resistor)和电容(Capacitor)组成的低通滤波网络。

假设我们的按键一端接地(GND),另一端连接到 MCU 的 GPIO 引脚。为了保证按键松开时引脚是稳定的高电平,我们在引脚上外接一个 10kΩ 的上拉电阻(连接到 3.3V 的 VCC)。这时候,我们在按键的两端,并联一个小电容(通常是 100nF,也就是 0.1μF)。

奇迹就在这个微小的电容上发生了。电容的物理特性是:它两端的电压不能突变。 你可以把它想象成一个蓄水池,电压就是水位,电流就是水流。你要改变水位,就必须往里面注水或者抽水,这是需要时间的。

我们来看看加入电容后,按键按下时发生了什么:

  1. 初始状态(按键断开): 电流从 VCC 流过 10kΩ 的上拉电阻,慢慢给电容充电。经过一段时间后,电容充满了电,两端的电压等于 3.3V。此时 MCU 读到的是稳稳的高电平(逻辑 1)。

  2. 按下瞬间(闭合): 簧片接触!电容两端的电荷找到了一个阻值极低(几乎为 0)的泄放通道(通过金属簧片流向 GND)。蓄水池瞬间崩溃,电容内的电荷瞬间放空,引脚电压被拉低到 0V。

  3. 恐怖的抖动开始(断开-闭合-断开): 关键来了!当簧片因为弹性弹开,接触断开时,电容本来应该恢复到 3.3V。但是,请注意,电容充电是需要通过那个 10kΩ 的上拉电阻的!这就好比你试图通过一根极细的吸管(大电阻)往蓄水池里注水。

由于 RC 充电时间常数  的存在,电压只能缓慢上升。在我们这个例子中:

当开关弹开时,电压刚开始顺着充电曲线缓慢爬升,还没爬到足以让 MCU 识别为高电平的阈值(比如 2.0V),簧片又砸了下来(开关闭合),好不容易充进去的一点点电荷再次被瞬间清零。

在整个十几毫秒的抖动期内,只要你 RC 参数配置得当,电容的电压就会被死死地压在低电位,根本没有机会反弹成高频的脉冲信号。毛刺,就这样被物理学法则无情地抹平了。

2. 施密特触发器(Schmitt Trigger):拯救模拟过渡带的超级英雄

听起来 RC 滤波已经完美了对吧?别急,这里有一个连很多老工程师都会忽略的致命盲区。

RC 滤波虽然把高频的锯齿毛刺抹平了,但它带来了一个极其严重的副作用:把原本瞬间完成的电压跌落,变成了一条缓慢变化的模拟斜坡曲线。

对于数字芯片的 GPIO 引脚来说,这是极其危险的!数字电路内部是由 CMOS 管(互补金属氧化物半导体)构成的。它们最喜欢的是“要么 0,要么 1”。当输入电压正好卡在中间(比如 1.5V 左右的过渡带)时,内部的 NMOS 和 PMOS 管会同时处于半导通状态!

这不仅会导致芯片内部瞬间流过巨大的短路电流(发热、甚至烧毁),还会因为微小的热噪声干扰,导致逻辑判断在 0 和 1 之间疯狂跳变。你用 RC 滤波器消除了外面的抖动,却在芯片内部制造了更可怕的逻辑抖动。

这个时候,数字世界的超级英雄——施密特触发器登场了。

现代 MCU 的 GPIO 内部,通常都会集成施密特触发器。它的核心魔法叫做“迟滞效应(Hysteresis)”

普通的逻辑门只有一个阈值(比如超过 1.5V 算 1,低于 1.5V 算 0)。在 1.5V 附近有微小波动,输出就会跟着剧烈翻转。而施密特触发器有两个不同的阈值:一个正向阈值电压(,假设为 2.0V),一个负向阈值电压(,假设为 1.0V)。

  • 当输入电压从 0V 缓慢上升时,即便超过了 1.0V,输出依然保持低电平。必须等到电压越过 2.0V () 这个高门槛,输出才会瞬间翻转为高电平。

  • 此时,如果电压再往下降,哪怕降到了 1.8V、1.5V,输出依然死死锁定在高电平。只有当电压跌破 1.0V () 这个低门槛时,输出才会翻转回低电平。

发现其中的奥妙了吗?在  到  之间这足足  的巨大区间里,无论输入信号怎么带着噪声上下波动,输出状态都犹如磐石般岿然不动!

RC 低通滤波器负责把高频抖动“揉”成一个缓慢的斜坡,而内部的施密特触发器则像一把锋利的快刀,在这个缓慢的斜坡上“咔嚓”一刀,再次切出一个干净利落、完美无瑕的数字阶跃信号。这就是软硬件协同的顶级浪漫。


拒绝“死等”:用状态机思维重塑软件消抖的底层逻辑

理论上,如果在每个按键上都放上电阻和电容,世界就清静了。但是,商业世界是受成本和空间驱动的。如果你的设备只有 1 个按键,加个电容无所谓。但如果你做的是一个工业键盘,上面有 104 个按键呢?104 个电容加上走线,不仅大大增加了 PCB 的面积,BOM(物料清单)成本也会随之上升,贴片厂的打件费用也会增加。

所以,在实际项目中,我们往往采用“裸按键直接接 MCU 引脚”的极简硬件方案(仅靠内部或外部上拉电阻),把消除那 10 毫秒抖动的艰巨任务,全部扔给软件工程师来解决。

菜鸟的妥协:阻塞型延时(Delay)

几乎所有的大学教材和网上的单片机入门教程,教你的软件消抖都是这样的:

if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0// 第一步:检测到按键按下

{

    delay_ms(20);                                  // 第二步:死等20毫秒,避开抖动期

if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0// 第三步:再次检测

    {

// 确认是真实按下,执行动作...

while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0); // 第四步:死等按键松开

    }

}

我在这里非常严肃地告诉你:这种写法,在实验室里玩玩可以,一旦带入真实的商业项目,就是灾难!

这段代码有两个不可饶恕的罪行:第一,delay_ms(20) 是阻塞性的。在这 20 毫秒里,单片机的 CPU 就像一个傻子一样在原地空转计数,什么都不干。如果这期间你的串口收到了一串重要数据,如果你的电机需要急停,对不起,CPU 没空理你。第二,while(等待松开) 更是致命。如果用户按住这个按钮不松手(或者按钮被卡住了),整个系统的代码就彻底卡死在这里,直接宕机,必须等看门狗(Watchdog)来复位系统。

我们要写的是非阻塞型(Non-blocking)的代码。单片机不应该去“等”按键,而是应该每隔一段时间“扫”一眼按键。这就引出了现代嵌入式开发中处理复杂逻辑的终极武器——有限状态机(Finite State Machine, FSM)

四步状态机架构

我们把按键的整个生命周期,拆解为四个独立的状态。无论何时,按键必然处于这四个状态之一。我们只需要设置一个定时器(比如利用 SysTick 滴答定时器),每隔 1 毫秒(或者 5 毫秒)去执行一次状态机的轮询函数即可。

  1. 状态 0:空闲状态(IDLE)在这个状态下,我们只是冷眼旁观引脚的电平。只要是高电平,说明没人碰它,我们就什么都不做。一旦发现电平变成了低电平(按键可能被按下了),我们不执行任何动作,也不延时,而是立刻将状态切换为“状态 1”,并清零一个内部的计时器。

  2. 状态 1:按下抖动期(PRESS_DEBOUNCE)这是甄别“渣男”的关键阶段。在这个状态里,我们每次进来都去读电平。如果读到高电平,说明刚才那个低电平只是一个干扰毛刺,或者是弹片弹开了,我们直接无情地把状态踢回“空闲状态”。如果读到低电平,我们就让内部计时器加 1。当计时器累计达到了消抖时间(比如连读 20 毫秒都是低电平),这就说明这绝不是干扰,而是人类实打实地按下了按键!此时,触发“按键按下”事件,并将状态切换为“状态 2”。

  3. 状态 2:确认按下状态(PRESSED)在这个状态下,动作已经执行过了。我们现在唯一的任务,就是等待用户松开手指。所以我们盯着高电平。只要一直是低电平,我们就什么都不干(完美解决了 while 死等的问题)。一旦引脚变高了,说明用户有松手的迹象,我们将状态切换为“状态 3”,并清零计时器。

  4. 状态 3:松开抖动期(RELEASE_DEBOUNCE)和按下时一样,松开手指时,簧片同样会发生抖动!如果在计时器达到 20 毫秒之前,引脚又变低了,说明是簧片的抖动,我们把状态踢回“确认按下状态”。如果连读 20 毫秒都是高电平,说明弹片彻底静止,用户完全松开了手指。此时,触发“按键松开”事件,并将状态完美归位到“空闲状态”。

闭上眼睛想象一下这个过程,是不是如同行云流水一般丝滑?没有任何一处 delay,没有任何死循环。CPU 每次进入这个状态机函数,只需要耗费几微秒判断一下电平、加一下变量,然后立刻退出,去干其他更重要的事情。这就是大师级的架构思维。


写一段能扛住工业级摧残的按键驱动框架

讲完了理论,下面是激动人心的保姆级 C 语言源码环节。

在实际的项目中,往往不止一个按键。如果按照菜鸟的写法,有几个按键就得复制几遍代码,维护起来简直是灾难。因此,在下面的代码中,我们将采用面向对象(Object-Oriented)的思想。

我们会把每一个按键抽象成一个结构体(Struct)。这个结构体里保存了按键当前的状态、计时器,以及读取引脚电平的函数指针(Function Pointer)。这样,我们的核心状态机代码就彻底与底层的硬件(比如 STM32 的 HAL 库或 GD32 的标准库)解耦了。你把这段代码拿走,稍加修改,甚至可以在 Linux 的应用层里跑!

1. 头文件设计(button.h):抽象数据结构

首先,我们定义按键的状态枚举和控制块结构体。

#ifndef __BUTTON_H__

#define __BUTTON_H__

#include<stdint.h>

/* 定义按键状态机的四个核心状态 */

typedefenum {

    BTN_STATE_IDLE = 0,         // 状态0:空闲,等待按下

    BTN_STATE_PRESS_DEBOUNCE,   // 状态1:按下抖动滤波中

    BTN_STATE_PRESSED,          // 状态2:确认处于按下状态

    BTN_STATE_RELEASE_DEBOUNCE  // 状态3:松开抖动滤波中

} ButtonState_t;

/* 定义按键动作事件枚举 */

typedefenum {

    BTN_EVENT_NONE = 0,         // 无动作

    BTN_EVENT_DOWN,             // 触发按下事件

    BTN_EVENT_UP                // 触发松开事件

} ButtonEvent_t;

/* 按键控制块结构体(面向对象思想的精髓) */

typedefstruct {

    ButtonState_t   state;          // 记录当前按键处于哪个状态

uint16_t        debounce_cnt;   // 消抖计时器(单位通常是调用周期的倍数)

uint16_t        debounce_time;  // 设定的消抖阈值(比如20次)

uint8_t         active_level;   // 按下时的有效电平(通常是0,低电平有效)

    ButtonEvent_t   event;          // 当前产生的事件(给外部应用层读取使用)

/* 函数指针:硬件抽象层接口。让驱动层不知道底层到底用的是什么MCU */

uint8_t         (*read_pin_func)(void); 

} Button_t;

/* 外部函数声明 */

voidButton_Init(Button_t *btn, uint8_t active_level, uint16_t debounce_time, uint8_t (*read_func)(void));

voidButton_Tick(Button_t *btn);

#endif

</stdint.h>

2. 核心源码(button.c):状态机引擎

接下来的这段代码,是整个消抖框架的心脏。你需要将 Button_Tick 函数放在一个硬件定时器中断里(例如 1 毫秒中断一次),或者放在 RTOS(如 FreeRTOS)的软件定时器回调函数中。

#include"button.h"

/**  * @brief  按键对象初始化函数  * @param  btn: 按键对象的指针  * @param  active_level: 按下时的电平(0为低,1为高)  * @param  debounce_time: 消抖时间阈值(如果Tick周期是1ms,这里传入20就是20ms)  * @param  read_func: 读取底层GPIO电平的回调函数  */

voidButton_Init(Button_t *btn, uint8_t active_level, uint16_t debounce_time, uint8_t (*read_func)(void))

{

// 将所有参数装载到结构体实例中

    btn->state = BTN_STATE_IDLE;

    btn->debounce_cnt = 0;

    btn->debounce_time = debounce_time;

    btn->active_level = active_level;

    btn->event = BTN_EVENT_NONE;

    btn->read_pin_func = read_func;

}

/**  * @brief  按键状态机轮询函数(必须周期性调用,例如每1ms调用一次)  * @param  btn: 按键对象的指针  */

voidButton_Tick(Button_t *btn)

{

// 如果没有注册读取底层的函数,为了防呆,直接退出避免宕机

if (btn->read_pin_func == 0return;

// 读取当前引脚真实的物理电平

uint8_t current_level = btn->read_pin_func();

// 每次进入,先清除上一次的事件标志,防止事件被重复处理

    btn->event = BTN_EVENT_NONE; 

/* === 核心四步有限状态机(FSM)开始 === */

switch (btn->state)

    {

case BTN_STATE_IDLE:

// 状态0:如果检测到电平变成有效电平(有人按下了)

if (current_level == btn->active_level)

            {

                btn->debounce_cnt = 0;                  // 清零计时器

                btn->state = BTN_STATE_PRESS_DEBOUNCE;  // 跳转到消抖状态

            }

break;

case BTN_STATE_PRESS_DEBOUNCE:

// 状态1:再次确认当前电平

if (current_level == btn->active_level)

            {

                btn->debounce_cnt++; // 持续按下,计时器累加

// 如果连续检测到有效电平的时间,达到了我们设定的阈值(比如20ms)

if (btn->debounce_cnt >= btn->debounce_time)

                {

                    btn->event = BTN_EVENT_DOWN;        // 确诊真实按下!抛出按下事件

                    btn->state = BTN_STATE_PRESSED;     // 跃迁到确认按下状态

                }

            }

else

            {

// 只要中间有一次读到了无效电平,说明是毛刺干扰,直接踢回空闲状态

                btn->state = BTN_STATE_IDLE;

            }

break;

case BTN_STATE_PRESSED:

// 状态2:在按下状态中,我们只关心什么时候松手

if (current_level != btn->active_level)

            {

                btn->debounce_cnt = 0;                    // 清零计时器

                btn->state = BTN_STATE_RELEASE_DEBOUNCE;  // 用户好像松手了,进入松开消抖验证

            }

break;

case BTN_STATE_RELEASE_DEBOUNCE:

// 状态3:验证是否真的松开了

if (current_level != btn->active_level)

            {

                btn->debounce_cnt++; // 持续处于无效电平状态

// 连续多次确认真的松开了

if (btn->debounce_cnt >= btn->debounce_time)

                {

                    btn->event = BTN_EVENT_UP;          // 抛出松开事件

                    btn->state = BTN_STATE_IDLE;        // 完美闭环,回到空闲状态待命

                }

            }

else

            {

// 如果中间又变回有效电平,说明是松开过程中的弹片抖动,退回按下状态继续等

                btn->state = BTN_STATE_PRESSED;

            }

break;

default:

            btn->state = BTN_STATE_IDLE; // 防御性编程,如果状态机跑飞,强制拉回初始态

break;

    }

}

3. 如何优雅地使用这个框架?

在你的应用层代码(比如 main.c)中,使用这个框架变得极其简单和清爽:

#include"button.h"

// 假设这是你基于STM32 HAL库写的底层引脚读取函数

uint8_tRead_Key1_GPIO(void) {

return HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);

}

// 实例化一个按键对象

Button_t myKey1;

intmain(void)

{

// ... 其他系统初始化 ...

// 初始化按键:低电平有效,消抖20次(假设Tick周期为1ms),传入读取函数指针

    Button_Init(&myKey1, 020, Read_Key1_GPIO);

while(1)

    {

// 假设这里是你的主循环,你可以在这里根据事件执行任务

if (myKey1.event == BTN_EVENT_DOWN)

        {

// 按键按下了!点亮LED或者发送无线数据包

            Turn_On_LED();

        }

elseif (myKey1.event == BTN_EVENT_UP)

        {

// 按键松开了!熄灭LED

            Turn_Off_LED();

        }

    }

}

// 在SysTick中断服务函数中(每1ms进一次):

voidSysTick_Handler(void)

{

// 驱动状态机的心跳!

    Button_Tick(&myKey1); 

}

你看,应用层的代码再也不用见到恶心的 delay 和 while 了。你的主循环跑得飞快,按键事件就像一个个包裹一样,被状态机打包好准时送到你手上。这,才叫做软件架构的艺术。


资深工程师的避坑指南

读到这里,你已经掌握了干掉按键抖动的核心武功。但是,作为一名在一线战场摸爬滚打过的老兵,我还必须给你敲响最后的几声警钟。很多新人和面试官最喜欢在以下这几个暗坑里设伏:

 1:把机械按键接在外部中断(EXTI)上(找死行为)

如果你去面试嵌入式工程师,面试官问你:“如何高效地检测按键按下的动作?”很多半桶水的新人为了彰显自己懂底层,会脱口而出:“为了不占用 CPU 资源,我不用轮询,我把按键配置为下降沿触发的外部中断(EXTI),在中断服务函数里处理按键!”

如果你这么回答,恭喜你,面试大概率直接挂掉。

结合本文第一段学到的微观物理学,你想想这有多可怕:按键按下的那 10 毫秒内,引脚电平剧烈抖动,会产生几十上百个下降沿。这意味着什么?这意味着在这 10 毫秒内,你的单片机将被暴力打断几十次,疯狂地进出中断服务函数!如果你的中断里还执行了一些耗时的动作,或者你的栈空间稍微留小了一点,整个系统的主程序将被完全阻塞,甚至因为中断嵌套导致堆栈溢出(Stack Overflow),当场死机。

老兵铁律:永远不要把未经纯硬件 RC 彻底消抖的机械开关信号,直接接入单片机的外部中断引脚! 机械按键,老老实实用定时器状态机轮询去扫,1 毫秒扫一次,消耗的 CPU 算力连千分之一都不到。

 2:幽灵般的悬空引脚(Floating Pin)

很多时候,你在代码里把 GPIO 配置成了“输入模式”,外部接了一个按键,按键另一端接地。你跑起代码来发现,就算你不碰按键,程序也一直在疯狂触发按下事件。你用手在电路板上方挥舞一下,灯还在闪!

你以为见鬼了,其实是你忘了配置上拉电阻(Pull-up Resistor)

CMOS 芯片引脚的输入阻抗极大,如果处于“悬空”状态,这个引脚就像一根极其敏感的无线电天线,会捕捉空气中的工频干扰信号和空间电磁波。排坑指南: 必须在硬件电路上外接 10k 左右的上拉电阻,或者在软件初始化 GPIO 时,明确开启内部的弱上拉电阻(Pull-Up)。让引脚在默认状态下,被死死地“拉”向 3.3V 这个确定的电平。

 3:静电击穿(ESD)的毁灭打击

我们人体的构造,让我们在冬天干燥的环境下,身上往往携带几千伏甚至上万伏的静电。当你的手指触碰到暴露在机壳外的按键金属部位时,静电会顺着按键的引脚,以光速直接劈进单片机娇弱的 GPIO 内部。轻则导致芯片内部寄存器状态瞬间复位(系统莫名其妙重启),重则直接击穿内部晶体管,让这个引脚永久性报废。

排坑指南: 对于暴露给最终用户的工业级或消费级电子产品,按键引脚处必须在物理 PCB 上靠近按键端增加防护措施。最简单的是加上我们前面提到的 RC 滤波网络(电容可以吸收相当一部分瞬间的高频能量),更高等级的要求下,必须在引脚到地之间并联一颗 TVS 管(瞬态电压抑制二极管),像避雷针一样把上万伏的静电瞬间导流到大地上。


在物理与数字的交界处起舞

从物理层面上两片弹簧金属的粗暴碰撞,到 RC 模拟电路的温柔平滑;从施密特触发器果断的数字裁决,再到 C 语言有限状态机里精密运转的逻辑齿轮。

一个小小的按键消抖,打通了从纯物理学、模拟电子技术、数字电路逻辑,直到底层软件架构设计的全栈脉络。

作为一个嵌入式工程师,我们的使命,就是站在物理世界与数字世界的交汇处。我们用电阻电容和一行行冰冷严密的代码,将这个混沌、充满噪声与无序的物理世界,驯化成芯片内部绝对可靠、完美跳动的数字节拍。

希望这篇长文,能让你在以后遇到每一个毛刺与 Bug 时,不再抱怨“玄学”,而是有底气拿起示波器和代码,精准地完成击杀。这就是硬核技术的魅力,也是我们全栈开发者的底气。


写在后面
还不知道如何下手学习单片机?信盈达精心整理《STM32全能学习包》,学习书籍、软件工具包、课件教案、项目原理图、芯片手册、例程代码、视频教程等一次性全部送上!助你快速升级打BOSS。大家可以添加下方小助手领取~

 添加小助手   领取学习包  

添加后回复 “嵌入式” 更快领取哦

 - END - 
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-04-24 17:24:57 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/552212.html
  2. 运行时间 : 0.151073s [ 吞吐率:6.62req/s ] 内存消耗:4,816.61kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=20fadb2b78ada1cf1004a2482f236b23
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000417s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000614s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000322s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000269s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001614s ]
  6. SELECT * FROM `set` [ RunTime:0.000525s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001241s ]
  8. SELECT * FROM `article` WHERE `id` = 552212 LIMIT 1 [ RunTime:0.003246s ]
  9. UPDATE `article` SET `lasttime` = 1777022697 WHERE `id` = 552212 [ RunTime:0.004663s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000469s ]
  11. SELECT * FROM `article` WHERE `id` < 552212 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.008180s ]
  12. SELECT * FROM `article` WHERE `id` > 552212 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.013494s ]
  13. SELECT * FROM `article` WHERE `id` < 552212 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.018348s ]
  14. SELECT * FROM `article` WHERE `id` < 552212 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.006940s ]
  15. SELECT * FROM `article` WHERE `id` < 552212 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000844s ]
0.154108s