当前位置:首页>Linux>告别冗长的 main 函数:移植 Linux 内核的"自动初始化"机制到单片机

告别冗长的 main 函数:移植 Linux 内核的"自动初始化"机制到单片机

  • 2026-01-14 11:24:48
告别冗长的 main 函数:移植 Linux 内核的"自动初始化"机制到单片机

用链接脚本玩出花活,让模块自己注册自己


0. 引言:你的 main 函数是不是也长这样?

打开你的项目,翻到 main.c,是不是这种画风:

int main(void) {
    HAL_Init();
    SystemClock_Config();

    // 下面是无尽的初始化...

    GPIO_Init();
    Uart_Init();
    I2C_Init();
    SPI_Init();
    Screen_Init();
    Wifi_Init();
    Sensor_Init();
    Motor_Init();
    LED_Init();
    Key_Init();
    // ...此处省略20行


    while
(1) {
        // 业务逻辑

    }
}

别笑,咱们都写过。

这种写法有两个致命问题:

问题一:耦合度爆表。 每次新增一个功能模块,比如加个温湿度传感器,你不仅要写 dht11.c,还得跑到 main.c 里加一行 DHT11_Init()。多人协作的时候,main.c 就成了兵家必争之地,天天冲突。

问题二:容易遗漏。 头文件引用了,驱动也写好了,结果忘了在 main 里调 Init 函数。程序跑飞了查半天,最后发现是初始化没调——相信不少人都踩过这个坑。

Linux 内核从来不这么干。它用一个叫 module_init 的宏,让每个模块"自己注册自己"。今天我们就把这套机制搬到单片机上。


1. 核心原理:链接器不只是用来生成 hex 的

很多嵌入式工程师只盯着编译器(Compiler),对链接器(Linker)知之甚少。顶多知道它能生成 hex 文件,用来烧录。

但链接器能玩的花活远不止这些。

"段"是个什么玩意儿

你写的代码,编译完之后并不是乱糟糟堆在一起的。它们被分门别类地放在不同的"段"(Section)里:

  • • 代码放在 .text 段
  • • 已初始化的全局变量放在 .data 段
  • • 未初始化的全局变量放在 .bss 段

这些是编译器自动安排的。但重点来了:你完全可以自己发明一个段,比如叫 .my_init_call,然后把东西塞进去。

自动初始化的核心思路

既然能自定义段,我们就可以这么玩:

  1. 1. 定义一个自定义段:比如叫 .auto_init
  2. 2. 把函数指针塞进去:每个模块的 Init 函数,通过宏把它的函数指针强行塞到这个段里
  3. 3. 它们会在内存中连续排列:就像一个数组,只不过这个"数组"是链接器帮你组装的
  4. 4. 启动时遍历执行:只要知道这个段的起始地址和结束地址,一个 for 循环就能把所有 Init 函数都调一遍

原理就这么简单。难点在于:怎么让编译器和链接器配合你完成这件事。


2. 手把手移植实战(GCC / Keil 双适配)

下面开始上代码。我会以 GCC 为主讲解,Keil 用户也别急,原理完全一样,我会标注区别。

第一步:定义函数指针类型

先给初始化函数定个统一的接口:

typedef int (*init_fn_t)(void);

所有要注册的初始化函数,都得长这样:返回 int,参数为空。

第二步:实现"注册宏"

这是整个机制的灵魂:

// GCC 写法
#define INIT_EXPORT(fn) \
    static init_fn_t __init_#
#fn \
    __attribute__((used, section(".auto_init"))) = fn

看着有点绕,拆开来说:

  • • __attribute__((section(".auto_init"))):告诉编译器,把这个变量放到 .auto_init 段里,而不是默认的 .data 段
  • • __attribute__((used)):告诉编译器"这个变量我用了,别给我优化掉"。因为这个变量没有被显式引用,编译器可能会认为它是死代码,直接删掉
  • • __init_##fn:用函数名拼出一个变量名,避免多个模块冲突

Keil AC6 的写法几乎一样。如果用 AC5(armcc),语法略有不同:

// Keil AC5 写法
#define INIT_EXPORT(fn) \
    static init_fn_t __init_##fn \
    __attribute__((used, section("auto_init"))) = fn

注意 AC5 的段名不需要加点号前缀。

第三步:修改链接脚本

光有宏还不够,链接器得知道这个段放在哪,以及它的边界在哪。

GCC(.ld 文件):

在你的链接脚本里找到 .text 段附近,加上这么一段:

.auto_init : {
    . = ALIGN(4);
    __init_start = .;
    KEEP(*(.auto_init))
    __init_end = .;
} > FLASH

解释一下:

  • • __init_start 和 __init_end:这是两个符号,标记这个段的起始和结束地址
  • • KEEP(...):告诉链接器"这些东西不能删",防止被当成未引用代码优化掉
  • • . = ALIGN(4):4 字节对齐,保证函数指针读取正确

Keil:

好消息是,Keil 比较智能。对于 AC6,它会自动生成 Image$$auto_init$$Base 和 Image$$auto_init$$Limit 这样的符号。你只需要在代码里这样声明:

extern init_fn_t Image$$auto_init$$Base[];
extern
 init_fn_t Image$$auto_init$$Limit[];
#define __init_start Image$$auto_init$$Base

#define __init_end   Image$$auto_init$$Limit

不用手动改散列文件,省事不少。

第四步:实现自动遍历器

最后一步,写一个函数来遍历执行所有注册的初始化函数:

extern init_fn_t __init_start[];
extern
 init_fn_t __init_end[];

void
 auto_init(void)
{
    init_fn_t
 *fn;

    for
 (fn = __init_start; fn < __init_end; fn++) {
        if
 (*fn) {
            (*fn)();
        }
    }
}

现在你的 main() 就可以瘦身成这样了:

int main(void)
{
    HAL_Init();
    SystemClock_Config();

    auto_init();  // 一行搞定所有模块初始化

    while
(1) {
        // 业务逻辑

    }
}

使用示例

在任意一个模块文件底部,比如 uart.c

static int uart_init(void)
{
    // 串口初始化代码...

    return
 0;
}
INIT_EXPORT(uart_init);

完事。不用去动 main 函数,不用到处加 extern。这个模块只要参与编译,它的初始化函数就会被自动调用。

调试小技巧: 如果程序卡死在初始化阶段,不知道是哪个模块出了问题,可以在 auto_init() 循环里加个打印:

printf("Calling init at: %p\n", *fn);
(*fn)();

通过地址配合 .map 文件,很容易定位是谁的锅。


3. 进阶玩法:给初始化分个等级

基础版本搞定了,但细心的你可能会发现一个问题:

如果 Wifi_Init() 依赖 SPI_Init() 呢?

自动初始化的执行顺序,通常取决于链接顺序(哪个 .o 文件先链接)。这个顺序是不稳定的,换个编译器版本可能就变了。

Linux 内核怎么解决的?它定义了一堆不同等级的初始化宏:early_initcallsubsys_initcalldevice_initcall……等级越低,越早执行。

我们也可以抄这个思路。

利用段名的字母排序

链接器在排列段的时候,会按照段名的 ASCII 码顺序来排。也就是说,.init_0 会排在 .init_1 前面,.init_1 会排在 .init_2 前面。

利用这个特性,我们可以定义一组分级宏:

// 第 0 级:板级初始化(时钟、GPIO 基础配置)
#define INIT_BOARD_EXPORT(fn) \
    static init_fn_t __init_##fn \
    __attribute__((used, section(".init_0"))) = fn


// 第 1 级:驱动初始化(SPI、I2C、UART 等)

#define INIT_DRIVER_EXPORT(fn) \
    static init_fn_t __init_##fn \
    __attribute__((used, section(".init_1"))) = fn


// 第 2 级:设备初始化(传感器、屏幕等,依赖驱动)

#define INIT_DEVICE_EXPORT(fn) \
    static init_fn_t __init_##fn \
    __attribute__((used, section(".init_2"))) = fn


// 第 3 级:应用初始化(业务逻辑,依赖设备)

#define INIT_APP_EXPORT(fn) \
    static init_fn_t __init_##fn \
    __attribute__((used, section(".init_3"))) = fn

链接脚本里也要相应改一下:

.auto_init : {
    . = ALIGN(4);
    __init_start = .;
    KEEP(*(.init_0))
    KEEP(*(.init_1))
    KEEP(*(.init_2))
    KEEP(*(.init_3))
    __init_end = .;
} > FLASH

这样一来,执行顺序就有保障了:板级 → 驱动 → 设备 → 应用,依赖关系自然满足。

使用的时候也很直观:

// spi.c
INIT_DRIVER_EXPORT(spi_init);

// wifi.c(依赖 SPI)

INIT_DEVICE_EXPORT(wifi_init);

不用操心谁先谁后,等级定好了,顺序就定了。


4. 总结与价值

回头看看,我们干了什么?

之前的 main 函数: 二三十行初始化代码,每加一个模块就得改一次,多人协作天天冲突。

现在的 main 函数:

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    auto_init();
    while
(1) { /* ... */ }
}

三行搞定,清爽无比。

这就是软件架构里常说的**"开闭原则"**——对扩展开放,对修改关闭。新加一个模块?写好驱动,文件末尾加一行 INIT_EXPORT,完事。不用碰 main 函数,不用改任何现有代码。

这种写法在 RT-Thread、FreeRTOS 等嵌入式操作系统里非常常见。掌握了它,你就摸到了构建大型嵌入式系统的门槛。

说到底,MCU 开发和 Linux 开发并没有那么割裂。很多优秀的架构思想是通用的,只不过实现方式有所不同。多翻翻 Linux 内核代码,收获的不只是技术细节,更是解决问题的思路。



🚀 嵌入式底层架构·进阶实战推荐

💡 深度进阶:C 语言设计模式实战合集

专为嵌入式工程师打造,拒绝纸上谈兵,教你如何在 MCU/RTOS 环境下玩转面向对象。

本周重点推荐:

  • • 🔗 发布-订阅模式
  • • 🔗 单例模式
  • • 🔗 命令模式
  • • 🔗 适配器模式
  • • 🔗 工厂模式

【往期推荐】
嵌入式软件模块解耦进阶:构建高内聚、低耦合的系统架构
给你的设备做一套"砖不死"的 OTA 升级方案
STM32中的双栈指针:MSP和PSP是如何切换的?
在嵌入式系统中,环形缓冲区和队列的高级应用
深入剖析:FreeRTOS软件定时器的实现原理

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-09 09:30:30 HTTP/2.0 GET : https://f.mffb.com.cn/a/462239.html
  2. 运行时间 : 0.188895s [ 吞吐率:5.29req/s ] 内存消耗:4,555.04kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=9b645f1bf5adfd0db17d740d7e2fd0da
  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.000925s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001566s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000858s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.002277s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001446s ]
  6. SELECT * FROM `set` [ RunTime:0.003680s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001527s ]
  8. SELECT * FROM `article` WHERE `id` = 462239 LIMIT 1 [ RunTime:0.005662s ]
  9. UPDATE `article` SET `lasttime` = 1770600630 WHERE `id` = 462239 [ RunTime:0.006237s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.001136s ]
  11. SELECT * FROM `article` WHERE `id` < 462239 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.010811s ]
  12. SELECT * FROM `article` WHERE `id` > 462239 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001569s ]
  13. SELECT * FROM `article` WHERE `id` < 462239 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.024154s ]
  14. SELECT * FROM `article` WHERE `id` < 462239 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.027452s ]
  15. SELECT * FROM `article` WHERE `id` < 462239 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.005950s ]
0.192911s