当前位置:首页>Linux>别再乱写单片机驱动!仿 Linux 接口设计,换项目不用重写一行代码

别再乱写单片机驱动!仿 Linux 接口设计,换项目不用重写一行代码

  • 2026-06-27 00:10:47
别再乱写单片机驱动!仿 Linux 接口设计,换项目不用重写一行代码

之前有读者留言问:“能不能写一个单片机类似Linux驱动的开发思路,比如拿到一个模块,应该开放哪些驱动函数给应用层调用? 如何约定参数?”

其实不止这位读者,很多嵌入式开发者都有过类似的困扰:

拿到一个硬件模块,驱动写得乱七八糟,接口混乱、参数难猜,换个项目就要重写,应用层调用还要翻半天底层代码;更头疼的是,入口参数太多且难以管理,想写出 Linux 驱动那样的模块化代码,却无从下手。

今天就彻底解决这个问题——不用复杂操作,只要借鉴 Linux 驱动分层解耦、接口标准化、抽象化”的核心思路,就能写出易维护、易移植、应用层零困惑的驱动。

全文从驱动封装规则、接口设计、入参规范,到多参数打包、Linux 风格抽象驱动来分步说明,最后附上 AHT10 温湿度传感器完整可运行源码,新手能直接参考,老手能规范代码、实现进阶,彻底告别野路子驱动开发。

一、先搞懂:驱动到底用来干什么?

驱动的核心是“抽象硬件”,提供稳定、标准的接口;应用层(或中间层)的核心是“用数据做事情”,实现具体项目需求,二者严格分离,才是驱动的核心逻辑。

不管是 AHT10、OLED,还是 Flash、串口,驱动的职责总结起来其实只有 4 件事:初始化硬件、读硬件数据、写硬件命令、控制硬件行为。这是Linux 驱动思想在单片机上的极简落地,每次写驱动之前先想一想这个设备的功能如何划分到这4件事里面。同时,也有5件事情不应该让驱动干:业务逻辑、数据滤波、算法处理、界面显示、定时逻辑。

一句话总结:驱动负责和硬件“打交道”,应用层负责用数据做业务,彻底分离,才是驱动可移植、易维护的关键。

二、固定接口:借鉴Linux,应用层一看就懂

Linux 驱动的 open/read/write/ioctl/close 设计,是经过无数项目验证的标准化接口,单片机完全可以照搬。任何模块都按这套接口来,不用翻底层,应用层开发者一看就知道怎么调用。

接口类型

函数格式

主要作用

初始化

XXX_Init

初始化硬件、自检校准

读数据

XXX_Read

读取硬件原始数据

写命令

XXX_Write

向硬件发送命令、配置参数

控制

XXX_Ctrl

控制硬件行为(如休眠、唤醒、复位)

反初始化

XXX_DeInit

关闭硬件、释放资源

三、核心规范:入参 & 返回值,避免踩坑

很多驱动写崩,都是因为入参返回值不规范。下面 7 条规范,是我们在写驱动过程中经常遇到的,记牢就能少走很多弯路。

1. 禁止魔法值,全部用枚举

❌ 反面写法(纯数字,可读性为 0,维护必崩):

AHT10_Ctrl(0);AHT10_Ctrl(1);AHT10_Ctrl(2);//问题:没人知道 0/1/2 分别代表什么,改一处逻辑,全线崩盘

✅ 推荐写法(见名知意,可维护性拉满):

typedef enum {    AHT10_CMD_SLEEP,  // 休眠    AHT10_CMD_WAKEUP, // 唤醒    AHT10_CMD_RESET   // 复位} AHT10_CmdTypeDef;// 调用时见名知义,不用猜AHT10_Ctrl(AHT10_CMD_SLEEP);

2. 返回值只表示状态,不表示数据

❌ 反面写法(无法判断失败,极易踩坑):

floatAHT10_ReadTemp(void);//问题:失败时返回0或无效值,上层无法区分“正常数据”与“异常状态”。

✅ 推荐写法(状态 + 数据分离,健壮清晰):

uint8_tAHT10_Read(float *temp, float *humi);//说明:返回值表示“读取成功/失败”,数据通过指针传出,上层能清晰判断状态。

3. 指针必须带长度,防止越界

❌ 反面写法(无长度,越界死机风险极高):

voidAHT10_Write(uint8_t *data);// 调用时,函数不知道数据长度,极易越界uint8_t buf[5] = {1,2,3,4,5};AHT10_Write(buf);

✅ 推荐写法(安全规范,杜绝越界):

uint8_tAHT10_Write(constuint8_t *data, uint16_t len);

4. 全局统一状态码,拒绝混乱

❌ 反面写法(每个驱动自定义,混乱不堪):

// aht10.h#defineAHT_OK     0#defineAHT_ERR    1// sht30.h#defineSHT_SUCCESS  0#defineSHT_FAIL     1#defineSHT_TIMEOUT  -1//问题:上层判断逻辑混乱,无法统一封装,复用性极差。

✅ 正面写法(全局一套,所有驱动通用):

typedef enum {    DRV_OK = 0,        // 成功    DRV_ERROR = 1,     // 通用错误    DRV_TIMEOUT = 2,   // 超时错误    DRV_PARAM_ERR = 3// 参数错误    DRV_HW_ERR = 4     // 硬件错误} DRV_StatusTypeDef;

5. 控制函数用 cmd + void* 万能结构

❌ 反面写法(接口泛滥,函数越来越多):

voidAHT10_Sleep(void);voidAHT10_WakeUp(void);voidAHT10_Reset(void);voidAHT10_SetMode(uint8_t mode);//问题:功能越多,函数越多,无法抽象统一,换平台难移植。

✅ 正面写法(一个接口搞定所有控制):

uint8_tAHT10_Ctrl(AHT10_CmdTypeDef cmd, void *param);//说明:cmd 用枚举表示“控制指令”,param 用 void* 适配不同参数,灵活且统一。

6. 必须做入参校验,驱动更健壮

❌ 反面写法(不做校验,直接解引用,极易死机):

uint8_tAHT10_Read(float *temp, float *humi){    *temp = 25.0f;    *humi = 50.0f;}

✅ 正面写法(参数校验,规避空指针风险):

uint8_tAHT10_Read(float *temp, float *humi){    if(temp == NULL || humi == NULL)        return DRV_PARAM_ERR; // 参数错误    // 正常读取逻辑    *temp = 25.0f;    *humi = 50.0f;    return DRV_OK;}

7. 头文件只暴露接口,隐藏底层实现

❌ 反面写法(头文件泄露底层细节,毫无封装):

// aht10.h#define AHT10_ADDR 0x70extern uint8_t aht10_rx_buf[6]; // 内部缓冲区暴露给外部voidAHT10_I2C_WriteByte(uint8_t data)// 底层I2C操作暴露//问题:应用层可随意修改内部变量、调用底层函数,驱动完全失控,移植时极易出问题。

✅ 正面写法(严格分层,信息隐藏):

.h 文件:只暴露函数声明、枚举、结构体(对外接口).c 文件:硬件操作、私有函数、内部变量全部隐藏,外部不可访问

四、参数太多?用结构体打包

当驱动初始化或控制的参数 ≥3 个时,别再一个个传参,直接用结构体打包,代码瞬间清爽,可读性和可维护性翻倍。

// AHT10 配置参数结构体typedef struct {    I2C_HandleTypeDef *hi2c;        // I2C句柄    uint16_t dev_addr;              // 设备地址    uint8_t reset_pin;              // 复位引脚    GPIO_TypeDef* reset_port;       // 复位引脚端口    uint8_t is_auto_calibrate;      // 是否自动校准(1=是,0=否)} AHT10_ConfigTypeDef;// 调用时,直接初始化结构体,清晰明了AHT10_ConfigTypeDef aht10_cfg = {    .hi2c = &hi2c1,    .dev_addr = 0x70 << 1,    .reset_pin = GPIO_PIN_5,    .reset_port = GPIOA,    .is_auto_calibrate = 1};AHT10_Init(&aht10_cfg);

五、活用 static / const:正规驱动 vs 野路子的分水岭

很多开发者忽略这两个关键字,导致驱动代码混乱、易篡改。记住下面的用法,瞬间提升代码规范度。

1. static:隐藏内部细节,避免冲突

- 对外接口:不加 static(供应用层调用)

- 内部函数 / 变量:必须加 static(仅驱动内部可用,外部不可访问)

// 对外接口(供应用层调用)DRV_StatusTypeDef AHT10_Init(...);// 内部函数(仅驱动.c文件可用)static DRV_StatusTypeDef AHT10_CheckReady(void);// 内部变量(仅驱动.c文件可用)static uint8_t aht10_is_ready;

2. const:只读防篡改,节省RAM

适用于:设备地址、命令码、只读参数、抽象驱动实例,会被编译器放在 Flash 中,不占用 RAM。

// 设备默认地址(只读,防篡改)const uint16_t AHT10_DEFAULT_ADDR = 0x70 << 1;// 抽象驱动实例(只读,固定接口)const DRV_OperationsTypeDef AHT10_Drv = { ... };

3. 用法总结(记牢)

- 对外函数:不加 static

- 内部函数 / 变量:static

- 固定数据 / 只读参数 / 抽象驱动实例:const

- 配置表(固定不变):static + const

六、进阶:仿 Linux file_operations 抽象驱动

Linux 驱动的灵魂,就是 file_operations 结构体——将所有驱动接口统一封装,实现“驱动抽象化、平台无关化”。单片机完全可以照搬,这也是驱动开发的进阶思路。

1. 定义抽象驱动结构体(类似 file_operations)

typedef struct {    DRV_StatusTypeDef (*Init)(void *config);  // 初始化    DRV_StatusTypeDef (*Read)(float *temp, float *humi); // 读数据    DRV_StatusTypeDef (*Write)(const uint8_t *data, uint16_t len); // 写命令    DRV_StatusTypeDef (*Ctrl)(uint8_t cmd, void *param); // 控制    DRV_StatusTypeDef (*DeInit)(void); // 反初始化} DRV_OperationsTypeDef;

2. 实例化驱动(类似 Linux 驱动注册)

// AHT10 驱动实例化,将具体函数绑定到抽象接口const DRV_OperationsTypeDef AHT10_Drv = {    .Init    = AHT10_Init,    .Read    = AHT10_Read,    .Write   = AHT10_Write,    .Ctrl    = AHT10_Ctrl,    .DeInit  = AHT10_DeInit};

3. 应用层统一调用(简洁高效)

// 初始化AHT10_Drv.Init(&aht10_cfg);// 读温湿度AHT10_Drv.Read(&temp, &humi);// 复位设备AHT10_Drv.Ctrl(AHT10_CMD_RESET, NULL);// 反初始化AHT10_Drv.DeInit();

七、实战源码:AHT10 温湿度传感器完整驱动

下面是精简后的 AHT10 核心驱动,仅保留关键结构和演示逻辑,新手可快速看懂规范用法,直接参考适配。

1. aht10.h(只暴露接口)

#ifndef __AHT10_H#define __AHT10_H#include"stm32f1xx_hal.h"// 全局统一状态码(核心,所有驱动通用)typedef enum {    DRV_OK = 0,    DRV_ERROR = 1,    DRV_PARAM_ERR = 3,    DRV_HW_ERR = 4} DRV_StatusTypeDef;// 控制指令枚举(核心,避免魔法值)typedef enum {    AHT10_CMD_SLEEP = 0,    AHT10_CMD_WAKEUP,    AHT10_CMD_RESET} AHT10_CmdTypeDef;// 配置结构体(核心,多参数打包)typedef struct {    I2C_HandleTypeDef *hi2c;        // 核心依赖    uint16_t dev_addr;              // 设备地址    uint8_t is_auto_calibrate;      // 关键配置} AHT10_ConfigTypeDef;// 抽象驱动结构体(核心,仿Linux file_operations)typedef struct {    DRV_StatusTypeDef (*Init)(void *config);    DRV_StatusTypeDef (*Read)(float *temp, float *humi);    DRV_StatusTypeDef (*Ctrl)(uint8_t cmd, void *param);} DRV_OperationsTypeDef;// 提供驱动实例const DRV_OperationsTypeDef* AHT10_GetDrv(void);#endif/* __AHT10_H */

2. aht10.c(隐藏底层实现)

#include"aht10.h"// 内部变量(static隐藏,核心)static AHT10_ConfigTypeDef aht10_cfg;static uint8_t aht10_is_ready = 0;// 内部简化函数:模拟硬件就绪检查static DRV_StatusTypeDef AHT10_CheckReady(void){    // 简化实现    aht10_is_ready = 1// 模拟硬件就绪    return DRV_OK;}// 对外接口:初始化static DRV_StatusTypeDef AHT10_Init(void *config){    // 核心:参数校验(必做规范)    if(config == NULLreturn DRV_PARAM_ERR;    aht10_cfg = *(AHT10_ConfigTypeDef*)config;    // 简化硬件复位、校准流程    if(AHT10_CheckReady() != DRV_OK) return DRV_HW_ERR;    if(aht10_cfg.is_auto_calibrate) {        // 简化校准操作,仅演示逻辑    }    return DRV_OK;}// 对外接口:读数据static DRV_StatusTypeDef AHT10_Read(float *temp, float *humi){    // 核心:参数校验(必做规范)    if(temp == NULL || humi == NULLreturn DRV_PARAM_ERR;    if(!aht10_is_ready) return DRV_HW_ERR;    // 简化I2C读取、数据解析    *temp = 25.5f;  // 模拟读取到的温度    *humi = 52.3f;  // 模拟读取到的湿度    return DRV_OK;}// 对外接口:控制static DRV_StatusTypeDef AHT10_Ctrl(uint8_t cmd, void *param){    (void)param;    if(!aht10_is_ready) return DRV_HW_ERR;    // 核心:cmd枚举匹配,保留万能控制结构    switch(cmd) {        case AHT10_CMD_SLEEP: aht10_is_ready = 0break;        case AHT10_CMD_WAKEUP: aht10_is_ready = 1break;        case AHT10_CMD_RESET: AHT10_Init(&aht10_cfg); break;        defaultreturn DRV_PARAM_ERR;    }    return DRV_OK;}// 驱动实例化(核心,绑定接口,与抽象结构体对应)static const DRV_OperationsTypeDef AHT10_Drv = {    .Init    = AHT10_Init,    .Read    = AHT10_Read,    .Ctrl    = AHT10_Ctrl};// 实现获取驱动实例的函数const DRV_OperationsTypeDef* AHT10_GetDrv(void){    return &AHT10_Drv;}

3. main.c(调用驱动接口,模拟实际使用场景)

intmain(void){    // 1. 初始化HAL库(简化,实际项目需完整初始化)    HAL_Init();    // 2. 配置AHT10参数(多参数打包,演示结构体用法)    AHT10_ConfigTypeDef aht10_cfg = {        .hi2c = &hi2c1,          // 实际项目需绑定真实I2C句柄        .dev_addr = 0x70 << 1,   // 设备地址(左移1位,I2C标准用法)        .is_auto_calibrate = 1   // 开启自动校准    };    // 3. 驱动初始化(演示抽象接口调用)     const DRV_OperationsTypeDef* aht10_drv = AHT10_GetDrv();    DRV_StatusTypeDef status = aht10_drv.Init(&aht10_cfg);    if(status != DRV_OK) {        // 简化错误处理,演示状态码用法        while(1); // 初始化失败,死循环提示    }    // 4. 读取温湿度(演示读接口调用,参数传递)    float temp, humi;    status = aht10_drv.Read(&temp, &humi);    if(status == DRV_OK) {        // 简化演示,实际项目可对接界面显示(应用层职责)    }    // 5. 控制传感器(演示控制接口调用,枚举指令用法)    aht10_drv.Ctrl(AHT10_CMD_SLEEP, NULL);  // 休眠    HAL_Delay(1000);    aht10_drv.Ctrl(AHT10_CMD_WAKEUP, NULL); // 唤醒    // 主循环(模拟实际项目,持续调用驱动)    while(1) {        aht10_drv.Read(&temp, &humi);        HAL_Delay(500); // 定时逻辑(应用层职责,演示用法)    }}

最后总结

其实单片机仿 Linux 驱动开发,核心就3点:

  1. 分层解耦:驱动只碰硬件,应用层只做业务;
  2. 接口标准化:统一 Init/Read/Write/Ctrl/DeInit 接口;
  3. 细节规范:枚举代替魔法值、结构体打包多参数、static/const 合理使用等。

按照这个思路写驱动,不管是换项目、换平台,还是多人协作,都能轻松应对,彻底告别野路子,写出规范的驱动代码。再说点题外话,关于分层解耦,你要明确当前你的驱动是要解决什么问题,比如换相似的器件不想改驱动,那么可以看看我之前写的配置和驱动分离;比如想换个其他类型的MCU, 但是也不想改驱动的实现,那么可以看看Bus层的适配方法。不管怎么去适配,但是今天讲的是实现这些方式的基础。

如果觉得有用,记得点赞、在看,转发给身边的嵌入式同行,有其他的想法也可以打在评论区一起交流,谢谢~

最新文章

随机文章

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