当前位置:首页>java>拒绝屎山代码丨嵌入式软件的分层架构设计指南

拒绝屎山代码丨嵌入式软件的分层架构设计指南

  • 2026-02-05 00:58:10
拒绝屎山代码丨嵌入式软件的分层架构设计指南

如果曾维护过一个嵌入式项目,大概率会遇到这样的场景:打开项目,只有一个孤零零的 main.c 文件,点开一看,3000行代码倾泻而下。从GPIO初始化、串口中断,到传感器数据处理、通信协议解析,再到UI显示逻辑,所有的一切都像一锅大杂烩,紧紧地耦合在一起。

这就是我们常说的“屎山”代码。

为什么嵌入式项目,尤其是早期和中期的项目,如此容易演变成“屎山”?

  • “快”字当头:项目周期紧张,功能实现是第一要务,“先让它跑起来再说”,架构设计被无情牺牲。

  • “能省则省”:在资源极其有限的MCU上,每一次函数调用、每一个分层似乎都成了不可接受的“开销”。

  • “野路子”出身:许多嵌入式开发者从硬件转来,或是一路自学,缺乏系统性的软件工程训练。

  • 人员流动:你走了,我来了,没人能完全理解当初那坨代码的“深意”,只能在上面小心翼翼地添砖加瓦,让“屎山”越来越大。

然而,一个项目的生命周期远不止于“跑起来”。随着功能迭代、硬件更换、Bug修复,混乱的架构会让你付出惨痛的代价。分层架构,正是斩断这无尽痛苦的利刃。它带来的可维护性、可移植性、可测试性以及高效的团队协作,是项目从“能用”走向“好用”和“长寿”的基石。

经典的嵌入式分层架构模型

抛弃混乱,拥抱秩序。业界公认的嵌入式软件分层模型,通常包含以下几个层次。它像一个“三明治”,每一层都有其清晰的职责,并遵循严格的依赖规则。

核心规则:上层依赖下层,下层永远不能知道上层的存在。

这意味着,应用层的代码可以调用中间件层的函数,但中间件层的代码绝不能反过来调用应用层的函数。这种单向依赖是解耦的关键。

四层架构详解

第一层:硬件抽象层 (HAL - Hardware Abstraction Layer)

这是与硬件直接对话的最底层,也是实现“可移植性”的第一道防线。

  • 职责:封装对MCU寄存器的直接操作,为上层提供统一、易用的硬件访问接口。屏蔽不同MCU之间的硬件差异。

  • 示例gpio_set_level(port, pin, level)uart_send_byte(byte)spi_transfer(tx_data)

  • 为什么需要HAL:想象一下,你的产品需要从STM32F103迁移到ESP32。如果没有HAL,你可能需要重写所有与硬件相关的代码。有了HAL,你只需要重新实现HAL层中那些与寄存器相关的函数,而上层代码几乎可以原封不动。

  • 代码示例:封装GPIO操作

    // hal/gpio.h

    voidhal_gpio_init(void);

    voidhal_gpio_set_pin_mode(uint8_t port, uint8_t pin, uint8_t mode);

    voidhal_gpio_write_pin(uint8_t port, uint8_t pin, uint8_t level);

    uint8_thal_gpio_read_pin(uint8_t port, uint8_t pin);

    // hal/stm32_gpio.c (针对STM32的实现)

    voidhal_gpio_write_pin(uint8_t port, uint8_t pin, uint8_t level) {

        GPIO_TypeDef* gpio_port = get_gpio_port(port); // 辅助函数,将port号转为GPIOx

    if (level) {

            HAL_GPIO_WritePin(gpio_port, 1 << pin, GPIO_PIN_SET);

        } else {

            HAL_GPIO_WritePin(gpio_port, 1 << pin, GPIO_PIN_RESET);

        }

    }

    技巧:许多芯片厂商(如ST、Nordic)提供的官方库(如STM32 HAL库、nRF5 SDK)本身就是一种HAL层。你可以直接使用,也可以在它们之上再封装一层,以满足更统一的接口需求。

第二层:驱动层 (Driver Layer)

驱动层是各种“设备”的家。它基于HAL提供的能力,驱动具体的外部设备工作。

  • 职责:为特定的硬件设备(如传感器、显示屏、存储芯片)提供逻辑封装。驱动层不关心这些设备是如何连接到MCU上的(那是HAL的活),只关心如何与设备通信。

  • 示例:温湿度传感器AHT20驱动、OLED显示屏SSD1306驱动、外部Flash W25Q64驱动。

  • 代码示例:一个完整的传感器驱动封装

    // drivers/aht20.h

    #include<stdbool.h>

    boolaht20_init(void);

    boolaht20_read_temperature_humidity(float* temp, float* humi);

    // drivers/aht20.c

    #include"aht20.h"

    #include"hal_i2c.h"// 驱动层依赖HAL层

    #define AHT20_I2C_ADDR 0x38

    boolaht20_init(void) {

    // 通过HAL层的I2C接口发送初始化命令

    uint8_t cmd[] = {0xBE0x080x00};

    return hal_i2c_master_write(AHT20_I2C_ADDR, cmd, sizeof(cmd));

    }

    boolaht20_read_temperature_humidity(float* temp, float* humi) {

    // ... 通过HAL层的I2C接口读取数据并进行计算 ...

    // ... 计算结果存入temp和humi指针指向的地址 ...

    returntrue;

    }

    </stdbool.h>

第三层:中间件/服务层 (Middleware/Service Layer)

这一层提供了与具体硬件无关的、可重用的通用功能模块。

  • 职责:提供上层应用所需的各种“服务”。这些服务是通用的,不与特定业务逻辑绑定。

  • 示例

    • RTOS:FreeRTOS、ThreadX等,提供任务调度、同步、通信等服务。

    • 通信协议栈:LwIP (TCP/IP)、Modbus、CANopen。

    • 文件系统:FatFS、LittleFS。

    • 通用模块:日志系统、命令解析器、事件管理器、状态机框架。

  • 代码示例:一个简单的日志系统实现

    // middleware/logger.h

    #include<stdio.h>

    // 使用宏定义,方便全局调用和未来扩展(如增加日志级别)

    #define LOG_INFO(format, ...) printf("[INFO] " format "\", ##__VA_ARGS__)

    #define LOG_ERROR(format, ...) printf("[ERROR] " format "\", ##__VA_ARGS__)

    voidlogger_init(void)// 底层可以绑定到UART, RTT, 或文件

    </stdio.h>

第四层:应用层 (Application Layer)

这是整个架构的最顶层,也是产品“灵魂”所在的地方。

  • 职责:实现产品的具体业务逻辑和功能。它编排、调用下层提供的各种驱动和中间件服务,来完成一个完整的任务。

  • 示例:智能家居中的温控算法、运动手环的计步和心率监测逻辑、无人机的飞行控制算法。

  • 代码示例:应用层如何调用下层接口

    // app/main.c

    #include"aht20.h"// 调用驱动层

    #include"logger.h"// 调用中间件层

    #include"hal_delay.h"// 调用HAL层

    voidmain_task(void* arg) {

        aht20_init();

        logger_init();

    while(1) {

    float temperature, humidity;

    if (aht20_read_temperature_humidity(&temperature, &humidity)) {

                LOG_INFO("Temp: %.2f C, Humi: %.2f %%", temperature, humidity);

    if (temperature > 30.0f) {

    // 执行业务逻辑:比如打开风扇

    // fan_turn_on();

                }

            } else {

                LOG_ERROR("Failed to read AHT20 sensor.");

            }

            hal_delay_ms(5000);

        }

    }

    最佳实践:应用层应该是最“干净”的。理想情况下,应用层的代码读起来就像是在描述产品的功能需求,而不是在操作硬件。

接口设计的艺术:层与层之间的“握手”

分层的关键在于定义清晰的层间接口。一个优秀的接口设计,可以使用结构体和函数指针来实现极致的解耦和灵活性。

技巧:借鉴Linux内核的 file_operations 思想,我们可以为一类设备定义一个标准的操作集。

// drivers/device_ops.h

typedefstruct {

int (*init)(void);

int (*read)(uint8_t *data, size_t len);

int (*write)(constuint8_t *data, size_t len);

int (*ioctl)(uint32_t cmd, void *arg); // 用于特殊控制命令

device_ops_t;

// drivers/sensor_a.c

constdevice_ops_t sensor_a_ops = {

    .init = sensor_a_init,

    .read = sensor_a_read,

    .write = NULL// 不支持写操作

    .ioctl = NULL,

};

// drivers/sensor_b.c

constdevice_ops_t sensor_b_ops = {

    .init = sensor_b_init,

    .read = sensor_b_read,

    .write = NULL,

    .ioctl = sensor_b_ioctl,

};

// app/main.c

// 应用层只与抽象的 device_ops_t 交互,不关心具体是哪个传感器

voidprocess_sensor(constdevice_ops_t* sensor) {

uint8_t buffer[32];

    sensor->init();

    sensor->read(buffer, sizeof(buffer));

}

voidmain_task(void) {

    process_sensor(&sensor_a_ops);

    process_sensor(&sensor_b_ops);

}

通过这种方式,应用层代码与具体的驱动实现完全解耦。未来增加sensor_c时,应用层代码完全不需要修改,真正实现了对扩展开放,对修改封闭

实战:重构一个“屎山”项目

让我们看一个典型的重构案例。

Before:混乱的 main.c

// main.c

#include"stm32f1xx.h"

voidmain(void) {

// 一大堆寄存器配置,用于初始化GPIO和I2C

    RCC->APB2ENR |= (1 << 2); // Enable GPIOA clock

    GPIOA->CRL &= 0xFFFFFF00;

    GPIOA->CRL |= 0x00000033;

// ...

while(1) {

// I2C开始信号的位操作

// 发送AHT20地址

// 读取传感器原始数据

// ...

uint32_t raw_data = ...;

float temp = (float)raw_data * 200 / 1048576 - 50;

// 延时循环

for(volatileint i=0; i<1000000; i++);

    }

}

After:清晰的分层结构

  1. 识别并提取硬件操作 -> hal/

    • hal_gpio.chal_i2c.chal_delay.c
  2. 封装设备驱动 -> drivers/

    • aht20.c (内部调用 hal_i2c 相关函数)
  3. 提取通用功能 -> middleware/ (此例中暂无)

  4. 清理业务逻辑 -> app/

    • main.c

重构后的文件结构:

project/

├── hal/

│   ├── hal_gpio.c

│   ├── hal_gpio.h

│   ├── hal_i2c.c

│   └── hal_i2c.h

├── drivers/

│   ├── aht20.c

│   └── aht20.h

└── app/

    └── main.c

重构后的 main.c

// app/main.c

#include"aht20.h"

#include"hal_delay.h"

#include<stdio.h>// 假设已重定向到串口

voidmain(void) {

// 所有初始化在各自模块的init函数中完成

    aht20_init(); 

while(1) {

float temp, humi;

if(aht20_read_temperature_humidity(&temp, &humi)) {

printf("Temp: %.1f, Humi: %.1f", temp, humi);

        }

        hal_delay_ms(2000);

    }

}

</stdio.h>

对比一目了然:main.c 现在只关心“做什么”,而不再关心“怎么做”。代码的可读性和可维护性得到了质的飞跃。

常见的反模式和陷阱

在实践中,要警惕一些破坏分层原则的“坏味道”。

  • ⚠️ 反模式1:下层依赖上层

    • 表现:驱动代码里调用了应用层的函数,或者包含了应用层的头文件。

    • 后果:造成循环依赖,驱动无法被其他项目复用。

    • 正确做法:使用回调函数。驱动层定义一个函数指针,由应用层注册一个函数进去,驱动在特定事件发生时调用该函数指针。

  • ⚠️ 反模式2:应用层直接操作寄存器

    • 表现main.c 里赫然出现 GPIOA->ODR |= (1 << 5);

    • 后果:破坏了所有分层带来的好处,可移植性、可维护性归零。

    • 正确做法:永远通过HAL层或驱动层提供的接口来操作硬件。

  • ⚠️ 反模式3:全局变量满天飞

    • 表现:在 config.h 里定义了几十个全局变量,各个模块随意读写。

    • 后果:数据流向混乱,模块间高度耦合,极难调试。

    • 正确做法:模块私有数据使用 static 修饰。模块间通信优先使用函数参数、返回值、消息队列等显式方式。

  • ⚠️ 反模式4:过度设计

    • 表现:一个简单的Blinky项目,也硬要套上RTOS+驱动框架+事件总线。

    • 后果:增加了不必要的复杂度和资源开销。

    • 正确做法:架构为项目服务。对于小项目,可以适当简化分层,比如将HAL和Driver合并。关键是保持分层的思想和单向依赖的原则。

总结:告别“屎山”,从现在开始

分层架构不是银弹,但它是在复杂度和可维护性之间取得平衡的最佳工程实践。它将一个庞大、混乱的问题,分解为一系列更小、更清晰、可独立解决的子问题。

拒绝“屎山”,不仅仅是为了一份优雅的代码,更是为了未来的自己,为了你的团队,为了项目的长远成功。

立即可以行动的3个步骤:

  1. 建立目录:在你的下一个新项目中,立即创建 appdrivershalmiddleware 等目录。

  2. 封装第一个HAL函数:当你需要点亮一个LED时,抵制住直接写寄存器的诱惑,把它封装成 hal_led_on() 和 hal_led_off()

  3. Code Review:在代码审查时,多问一句:“这行代码应该属于哪个层次?”

从今天起,像搭建乐高一样去构建你的嵌入式软件,而不是和稀泥。你会发现,编程的乐趣,远不止于让灯闪烁的那一刻。

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

 添加小助手   领取学习包  

添加后回复 “单片机” 更快领取哦

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 02:56:01 HTTP/2.0 GET : https://f.mffb.com.cn/a/471578.html
  2. 运行时间 : 0.930679s [ 吞吐率:1.07req/s ] 内存消耗:4,413.77kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=de115f887482f544c7869c90e214cb23
  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.000946s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001370s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.073662s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.004529s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001631s ]
  6. SELECT * FROM `set` [ RunTime:0.003903s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001850s ]
  8. SELECT * FROM `article` WHERE `id` = 471578 LIMIT 1 [ RunTime:0.020106s ]
  9. UPDATE `article` SET `lasttime` = 1770490561 WHERE `id` = 471578 [ RunTime:0.005619s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.001279s ]
  11. SELECT * FROM `article` WHERE `id` < 471578 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.062995s ]
  12. SELECT * FROM `article` WHERE `id` > 471578 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.146213s ]
  13. SELECT * FROM `article` WHERE `id` < 471578 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.036714s ]
  14. SELECT * FROM `article` WHERE `id` < 471578 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.229328s ]
  15. SELECT * FROM `article` WHERE `id` < 471578 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.187201s ]
0.932352s