当前位置:首页>Linux>嵌入式Linux--regmapAPI实验:核心知识与实践全解析

嵌入式Linux--regmapAPI实验:核心知识与实践全解析

  • 2026-08-20 07:02:50
嵌入式Linux--regmapAPI实验:核心知识与实践全解析
Linux内核中regmap子系统的应用,核心目标是解决传统I2C/SPI驱动开发中代码冗余、接口不统一、移植性差的问题,通过抽象化的寄存器操作接口,实现硬件寄存器访问的标准化与高效化。以下从核心概念、框架原理、实践改造、关键细节等维度,系统梳理本章核心内容。
---
一、regmap的核心价值:为何要引入regmap?
在传统驱动开发中,无论是I2C还是SPI设备,本质都是通过总线接口读写芯片内部寄存器。但不同总线的底层操作API差异巨大,直接导致了两大核心痛点:
1. 代码冗余与重复:I2C设备依赖`i2c_transfer`,SPI设备依赖`spi_write/spi_read`,大量重复的底层代码充斥内核,不仅增加维护成本,还降低了代码复用性。
2. 移植性极差:以支持I2C和SPI双接口的ICM20608为例,若产品初期设计为SPI接口,后期因硬件资源限制需切换为I2C接口,驱动需完全重写底层收发逻辑,工作量巨大。
为解决上述问题,Linux内核引入regmap模型,其核心价值体现在三方面:
- 统一操作接口:将I2C、SPI、MMIO等不同物理总线的寄存器操作抽象为统一的regmap API,驱动开发者无需关注底层总线细节,只需调用`regmap_read`、`regmap_write`等通用函数即可。
- 提升访问效率:regmap在驱动与硬件之间内置高速缓存(如红黑树、LZO等策略),减少低速I/O操作次数,降低总线负载,但需注意缓存会牺牲部分实时性。
- 增强驱动可移植性:同一驱动可适配不同物理总线的硬件,硬件接口切换时,仅需修改regmap初始化函数,无需改动核心寄存器操作逻辑。
regmap的适用场景明确:
- 需通过I2C/SPI等总线读写硬件寄存器的场景;
- 追求代码复用性、驱动一致性,简化开发流程的场景;
- 需减少底层I/O操作次数,提升访问效率的场景。
---
二、regmap驱动框架:三层架构与核心数据结构
regmap采用三层架构设计,将底层硬件差异与上层操作逻辑彻底解耦,同时通过核心数据结构定义操作规则,是理解regmap的基础。
1. 三层框架结构
- 底层物理总线层:封装各类物理总线,目前regmap支持的总线包括I2C、SPI、MMIO、I3C、SCCB、Slimbus、IRQ、SPMI、W1等,实现不同总线的硬件交互逻辑。
- regmap核心层:实现regmap的核心机制,包括缓存管理、并发锁控制、掩码处理、错误处理等,开发者无需关心其内部实现,由内核自动完成。
- regmap API抽象层:向驱动开发者提供统一的操作接口,涵盖寄存器读写、批量操作、位操作等核心功能,是驱动开发的核心入口。
2. 核心数据结构:regmap与regmap_config
regmap的运行依赖两大核心结构体,二者分工明确,共同定义了寄存器操作的规则与实例。
- regmap结构体:代表一个具体的regmap实例,是驱动与硬件交互的句柄,定义在`drivers/base/regmap/internal.h`中。结构体包含锁机制、总线上下文、缓存配置、寄存器访问回调等核心成员,其中关键成员包括:
- 锁相关:`mutex`、`spinlock`,用于并发访问保护;
- 总线与格式:`bus`指向底层物理总线,`format`定义寄存器与值的格式;
- 访问控制:`writeable_reg`、`readable_reg`等回调函数,用于判断寄存器是否可读写;
- 缓存配置:`cache_type`指定缓存策略,`reg_defaults`定义寄存器默认值。
- regmap_config结构体:用于初始化regmap,定义寄存器操作的核心规则,定义在`include/linux/regmap.h`中,是驱动开发者需要重点配置的结构。核心配置项如下:
- 必填字段:`reg_bits`(寄存器地址位数,如ICM20608为8位)、`val_bits`(寄存器值位数,ICM20608为8位),这两个字段决定了寄存器地址与值的位宽;
- 掩码配置:`read_flag_mask`(读操作时与寄存器地址进行或运算的掩码)、`write_flag_mask`(写操作时的掩码),针对特殊总线时序设计,如SPI接口的ICM20608,读寄存器时地址最高位需置1,此时`read_flag_mask`设为0x80,regmap会自动完成掩码拼接;
- 访问控制:`writeable_reg`、`readable_reg`等回调函数,用于判断特定寄存器是否可读写;
- 缓存配置:`cache_type`指定缓存类型,`reg_defaults`定义寄存器默认值;
- 性能优化:`fast_io`启用快速I/O,用自旋锁替代互斥锁提升性能;`max_register`定义有效最大寄存器地址,避免无效访问。
---
三、regmap核心操作:初始化、API函数与掩码机制
regmap的使用流程围绕“初始化-操作-释放”展开,核心是掌握初始化函数、常用API,以及掩码机制的原理。
1. regmap的申请与初始化
regmap的初始化需根据物理总线类型选择对应的初始化函数,核心逻辑是为指定总线创建regmap实例,并绑定配置参数。
- SPI总线初始化:使用`regmap_init_spi`函数,原型为`structregmap regmap_init_spi(struct spi_device spi, const struct regmap_config config)`,参数为待操作的SPI设备和初始化配置,返回初始化完成的regmap实例。
- I2C总线初始化:使用`regmap_init_i2c`函数,原型为`struct regmap regmap_init_i2c(struct i2c_client i2c, const struct regmap_config config)`,参数为I2C客户端设备和配置。
- 资源释放:无论底层总线类型,释放regmap统一使用`regmap_exit`函数,原型为`voidregmap_exit(struct regmap map)`,传入待释放的regmap实例即可。
驱动开发中,初始化操作一般在`probe`函数中完成,释放操作在`remove`函数中执行,确保资源生命周期与设备绑定。
2. regmap核心操作API
regmap提供了丰富的API,覆盖单寄存器、批量寄存器、位操作等场景,核心API如下:
- 单寄存器读写:最基础的操作,`regmap_read`用于读取单个寄存器,原型为`int regmap_read(struct regmap map, unsigned int reg,unsigned intval)`,返回0表示成功;`regmap_write`用于写入单个寄存器,原型为`int regmap_write(struct regmap map, unsigned int reg, unsigned int val)`,逻辑与读操作一致。
- 位更新操作:`regmap_update_bits`用于修改寄存器指定bit位,原型为`int regmap_update_bits(struct regmap map, unsigned int reg, unsigned int mask, unsigned int val)`,核心逻辑是先读取寄存器值,将mask对应的bit位替换为val的对应位,再写回寄存器,实现原子性修改,适合配置寄存器的位操作。
- 批量读写:`regmap_bulk_read`用于连续读取多个寄存器,原型为`int regmap_bulk_read(struct regmap map, unsigned int reg, void val, size_t val_count)`,从起始寄存器`reg`开始,读取`val_count`个寄存器,结果存入`val`缓冲区;`regmap_bulk_write`用于批量写入,原型为`int regmap_bulk_write(struct regmap map, unsigned int reg, const void val, size_t val_count)`,逻辑与读操作对应。
这些API屏蔽了底层总线的差异,无论底层是I2C还是SPI,操作方式完全一致,极大简化了驱动开发。
3. 掩码机制:解决特殊总线时序的核心
掩码机制是regmap适配特殊总线时序的关键,核心原理是在寄存器地址与掩码进行位运算,自动完成时序所需的地址拼接,无需驱动开发者手动处理。
以SPI接口的ICM20608为例,其SPI读操作要求寄存器地址最高位必须置1,写操作时最高位需置0。传统SPI驱动中,需手动拼接地址:读操作时`reg | 0x80`,写操作时`reg & 0x7F`。
使用regmap后,无需手动拼接,只需在`regmap_config`中配置掩码:
- 读掩码:`read_flag_mask = 0x80`,regmap执行读操作时,会自动将寄存器地址与0x80进行或运算,实现最高位置1;
- 写掩码:`write_flag_mask = 0x00`,写操作时不修改地址,保持最高位为0。
掩码的生效逻辑由内核自动完成:初始化regmap时,若`regmap_config`中配置了掩码,会覆盖底层总线的默认掩码;若未配置,则使用底层总线的默认掩码。例如,regmap的SPI总线默认`read_flag_mask`为0x80,若设备无需此掩码,必须显式设置为0x00,否则会导致读操作错误。
---
四、实验实践:将ICM20608 SPI驱动改造为regmap驱动
本章核心实验是将第24章的SPI接口ICM20608驱动,改造为使用regmap API的驱动,完整流程包括结构体改造、初始化配置、API替换、资源释放,最终验证功能正常。
1. 第一步:修改设备结构体,新增regmap相关成员
regmap的核心是regmap实例和配置,因此需在设备私有结构体`icm20608_dev`中新增两个成员:
- `struct regmap regmap`:regmap实例指针,用于后续调用regmap API;
- `struct regmap_config regmap_config`:regmap配置实体,用于初始化regmap的规则。
改造后的结构体核心成员如下:
```c
struct icm20608_dev {
struct spi_device spi;
dev_t devid;
struct cdev cdev;
struct class class;
struct device device;
//传感器原始数据
signed int gyro_x_adc, gyro_y_adc, gyro_z_adc;
signed int accel_x_adc, accel_y_adc, accel_z_adc;
signed int temp_adc;
// regmap核心成员
struct regmap regmap; // regmap实例指针
struct regmap_config regmap_config; // regmap配置
};
```
2. 第二步:在probe函数中初始化regmap
初始化流程分为配置`regmap_config`和申请regmap实例两步,核心逻辑如下:
1. 配置regmap_config:
- 设置寄存器地址位宽:`reg_bits = 8`,ICM20608的寄存器地址为8位;
- 设置寄存器值位宽:`val_bits = 8`,每个寄存器存储8位数据;
- 配置读掩码:`read_flag_mask = 0x80`,适配SPI读操作的地址时序。
2. 申请并初始化regmap实例:调用`regmap_init_spi`,传入SPI设备和配置,获取regmap实例,若申请失败则释放资源并返回错误。
3. 后续驱动注册:完成regmap初始化后,继续执行字符设备号申请、cdev注册、类与设备节点创建等原有流程。
核心代码如下:
```c
static int icm20608_probe(struct spi_device spi)
{
int ret;
struct icm20608_dev icm20608dev;
// 分配设备私有结构体内存
icm20608dev = devm_kzalloc(&spi->dev,sizeof(icm20608dev),GFP_KERNEL);
if(!icm20608dev)
return -ENOMEM;
spi_set_drvdata(spi, icm20608dev);
// 初始化regmap配置
icm20608dev->regmap_config.reg_bits = 8; // 寄存器地址8位
icm20608dev->regmap_config.val_bits = 8; // 寄存器值8位
icm20608dev->regmap_config.read_flag_mask = 0x80; // SPI读掩码
// 申请并初始化SPI总线的regmap
icm20608dev->regmap = regmap_init_spi(spi, &icm20608dev->regmap_config);
if (IS_ERR(icm20608dev->regmap)) {
ret = PTR_ERR(icm20608dev->regmap);
goto err_alloc;
}
// 原有字符设备驱动注册流程...
ret = alloc_chrdev_region(&icm20608dev->devid, 0, ICM20608_CNT, ICM20608_NAME);
if (ret < 0)
goto del_regmap;
// ...省略cdev初始化、类创建、设备节点创建等代码
return 0;
err_alloc:
return ret;
del_regmap:
regmap_exit(icm20608dev->regmap);
del_unregister:
unregister_chrdev_region(icm20608dev->devid, ICM20608_CNT);
return ret;
}
```
3. 第三步:在remove函数中释放regmap资源
驱动卸载时,需调用`regmap_exit`释放regmap实例,避免内存泄漏,核心代码如下:
```c
static int icm20608_remove(struct spi_device spi)
{
struct icm20608_dev icm20608dev = spi_get_drvdata(spi);
// 销毁类、设备节点,删除cdev,注销设备号(原有逻辑)
class_destroy(icm20608dev->class);
device_destroy(icm20608dev->class, icm20608dev->devid);
cdev_del(&icm20608dev->cdev);
unregister_chrdev_region(icm20608dev->devid, ICM20608_CNT);
// 释放regmap资源
regmap_exit(icm20608dev->regmap);
return 0;
}
```
4. 第四步:替换寄存器读写函数,使用regmap API
原有驱动中,ICM20608的寄存器读写依赖手动封装的SPI收发函数,需全部替换为regmap API,大幅简化代码:
- 单寄存器读写:原有`icm20608_read_regs`和`icm20608_write_regs`函数,替换为直接调用`regmap_read`和`regmap_write`,无需手动处理SPI消息和传输结构体。
- 批量数据读取:原有读取14个传感器数据的逻辑,替换为`regmap_bulk_read`,自动完成连续寄存器的读取,无需手动处理地址递增和数据拼接。
改造后的核心读写函数如下:
```c
// 读取单个寄存器
static int icm20608_read_onereg(struct icm20608_dev dev, u8 reg, u8 val)
{
return regmap_read(dev->regmap, reg, val);
}
// 写入单个寄存器
static int icm20608_write_onereg(struct icm20608_dev dev, u8 reg, u8 value)
{
return regmap_write(dev->regmap, reg, value);
}
// 读取传感器原始数据(14个连续寄存器)
void icm20608_readdata(struct icm20608_dev dev)
{
unsigned chardata[14];
// 批量读取14个寄存器
regmap_bulk_read(dev->regmap, ICM20_ACCEL_XOUT_H, data, 14);
// 拼接数据为16位原始值
dev->accel_x_adc = (signedshort)((data[0] << 8) | data[1]);
dev->accel_y_adc = (signed short)((data[2] << 8) | data[3]);
dev->accel_z_adc = (signed short)((data[4] << 8) | data[5]);
dev->gyro_x_adc = (signed short)((data[8] << 8) | data[9]);
dev->gyro_y_adc = (signed short)((data[10] << 8) | data[11]);
dev->gyro_z_adc = (signed short)((data[12] << 8) | data[13]);
dev->temp_adc = (signed short)((data[6] << 8) | data[7]);
}
```
对比原生SPI驱动,regmap改造后的代码剔除了所有SPI消息组包、同步收发的逻辑,代码量大幅精简,且可读性、可维护性显著提升。
5. 第五步:运行测试
测试流程与第24章完全一致,无需修改设备树和测试App,步骤如下:
1. 执行`depmod`更新模块依赖;
2. 执行`modprobe icm20608.ko`加载驱动;
3. 执行`./icm20608App /dev/icm20608`运行测试App。
若regmap配置正确,驱动会正确初始化ICM20608,并输出陀螺仪、加速度计、温度的原始值和换算后的物理值,与原生SPI驱动的运行结果一致,验证regmap改造成功。
---
五、regmap的拓展应用:I2C驱动的regmap改造
regmap对I2C驱动的改造逻辑与SPI完全一致,核心差异仅在于初始化函数和掩码配置。以第23章的AP3216C I2C驱动为例,改造要点如下:
1. 结构体改造:在AP3216C的设备私有结构体中新增`struct regmap regmap`和`struct regmap_config regmap_config`成员。
2. 初始化配置:在`probe`函数中,调用`regmap_init_i2c`初始化regmap,配置`reg_bits=8`、`val_bits=8`,I2C总线无需特殊掩码,因此`read_flag_mask`和`write_flag_mask`保持默认即可。
3. API替换:将原有的I2C读写函数替换为`regmap_read`、`regmap_write`等API。
4. 资源释放:在`remove`函数中调用`regmap_exit`释放regmap。
改造后,AP3216C的I2C驱动同样实现了代码精简和接口统一,若后续需将AP3216C从I2C切换为SPI接口,仅需修改初始化函数和掩码配置,核心操作逻辑无需改动,充分体现regmap的移植性优势。
---
六、关键细节与避坑指南
regmap的使用过程中,部分细节直接影响驱动的正确性,需重点关注:
1. 掩码配置的准确性:针对SPI设备,必须根据芯片手册确认读/写操作的地址掩码,配置错误会导致寄存器读写失败。若设备无需掩码,需显式设置为0x00,避免使用总线默认掩码导致错误。
2. reg_bits与val_bits的匹配:这两个字段必须与芯片寄存器的实际位宽一致,配置错误会导致数据解析错位,例如16位寄存器若配置为8位,会导致数据截断。
3. 资源释放的完整性:卸载驱动时,必须调用`regmap_exit`释放regmap实例,否则会造成内核内存泄漏。
4. 缓存的合理配置:regmap默认启用缓存,对于中断状态寄存器、FIFO寄存器等需要实时读取的寄存器,需通过`volatile_reg`回调标记为易变寄存器,禁用缓存,否则会读取到缓存的旧数据。
5. 并发访问的安全性:regmap内置锁机制,无需开发者手动加锁,天然支持多进程并发访问,简化了并发控制逻辑。
6. 中断上下文的使用:若regmap操作在中断上下文中,需配置`fast_io=true`,使用自旋锁替代互斥锁,避免在中断中休眠,确保操作的安全性。
---
七、总结
regmap是Linux内核为解决寄存器操作冗余、接口不统一问题设计的通用子系统,通过三层架构抽象底层总线差异,以统一的API实现寄存器操作,同时内置缓存提升效率,大幅提升驱动的复用性与可移植性。
本章通过ICM20608 SPI驱动的regmap改造实验,完整展示了regmap的使用流程:从结构体新增、配置初始化,到API替换、资源释放,最终验证功能正常。改造后的驱动代码精简、逻辑清晰,且具备极强的移植性,为后续硬件接口切换提供了极大便利。
掌握regmap的核心在于理解其设计思想——抽象与解耦,以及核心数据结构与API的使用规则。在实际驱动开发中,无论是I2C还是SPI设备,优先采用regmap框架,是提升代码质量、降低维护成本的最佳实践。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 19:41:23 HTTP/2.0 GET : https://f.mffb.com.cn/a/505380.html
  2. 运行时间 : 0.203670s [ 吞吐率:4.91req/s ] 内存消耗:4,576.52kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=932bc70b14da3127d0168ad33e9bcb53
  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.000733s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001361s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.004021s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.003000s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001766s ]
  6. SELECT * FROM `set` [ RunTime:0.005734s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001822s ]
  8. SELECT * FROM `article` WHERE `id` = 505380 LIMIT 1 [ RunTime:0.039470s ]
  9. UPDATE `article` SET `lasttime` = 1787312483 WHERE `id` = 505380 [ RunTime:0.005860s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.001787s ]
  11. SELECT * FROM `article` WHERE `id` < 505380 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001263s ]
  12. SELECT * FROM `article` WHERE `id` > 505380 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.008068s ]
  13. SELECT * FROM `article` WHERE `id` < 505380 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.016965s ]
  14. SELECT * FROM `article` WHERE `id` < 505380 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002368s ]
  15. SELECT * FROM `article` WHERE `id` < 505380 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002858s ]
0.207264s