0

0

【i.MX6ULL】驱动开发11——LCD驱动实践

看不見的法師

看不見的法師

发布时间:2025-07-19 11:36:38

|

890人浏览过

|

来源于php中文网

原创

之前在linux系统移植时提到过lcd驱动,本篇来看下linux设备树如何配置lcd驱动。

1 知识点

首先需要了解一个新的概念:Framebuffer

1.1 Framebuffer

Framebuffer直译即帧缓冲,简称 fb,它是Linux将系统中所有跟显示有关的硬件以及软件集合起来,将底层的LCD虚拟抽象出一 个/dev/fbX设备,应用程序可以通过操作/dev/fbX来实现对屏幕的显示控制。

NXP官方Linux内核已默认开启了LCD驱动,在dev/目录下可以看到fb0这样一个设备

【i.MX6ULL】驱动开发11——LCD驱动实践

Framebuffer在内核中的表现就是fb_info结构体:

【i.MX6ULL】驱动开发11——LCD驱动实践

完整的结构体定义如下:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">struct fb_info {atomic_t count;int node;int flags;struct mutex lock;/* Lock for open/release/ioctl funcs */struct mutex mm_lock;/* Lock for fb_mmap and smem_* fields */struct fb_var_screeninfo var;/* 当前的可变参数 */struct fb_fix_screeninfo fix;/* 当前的固定参数 */struct fb_monspecs monspecs;/* Current Monitor specs */struct work_struct queue;/* Framebuffer event queue */struct fb_pixmap pixmap;/* Image hardware mapper */struct fb_pixmap sprite;/* Cursor hardware mapper */struct fb_cmap cmap;/* Current cmap */struct list_head modelist;      /* mode list */struct fb_videomode *mode;/* current mode */#ifdef CONFIG_FB_BACKLIGHT/* assigned backlight device *//* set before framebuffer registration,    remove after unregister */struct backlight_device *bl_dev;/* Backlight level curve */struct mutex bl_curve_mutex;u8 bl_curve[FB_BACKLIGHT_LEVELS];#endif#ifdef CONFIG_FB_DEFERRED_IOstruct delayed_work deferred_work;struct fb_deferred_io *fbdefio;#endifstruct fb_ops *fbops;       /* 帧缓冲操作函数集 */struct device *device;/* This is the parent */struct device *dev;    /* This is this fb device */int class_flag;             /* private sysfs flags */#ifdef CONFIG_FB_TILEBLITTINGstruct fb_tile_ops *tileops;    /* Tile Blitting */#endifchar __iomem *screen_base;    /* 虚拟内存基地址(屏幕显存) */unsigned long screen_size;    /* 虚拟内存大小(屏幕显存大小) */ void *pseudo_palette;    /* 伪16位调色板 */ #define FBINFO_STATE_RUNNING0#define FBINFO_STATE_SUSPENDED1u32 state;            /* Hardware state i.e suspend */void *fbcon_par;                /* fbcon use-only private area *//* From here on everything is device dependent */void *par;/* we need the PCI or similar aperture base/size not   smem_start/size as smem_start may just be an object   allocated inside the aperture so may not actually overlap */struct apertures_struct {unsigned int count;struct aperture {resource_size_t base;resource_size_t size;} ranges[0];} *apertures;bool skip_vt_switch; /* no VT switch on suspend/resume required */};</code>

注意结构体中的fb_fops这一项,/dev/fb0 是个字符设备,fb_fops就是它的文件操作结构体,它的file_operations操作集在drivers/video/fbdev/core/fbmem.c 文件中:

【i.MX6ULL】驱动开发11——LCD驱动实践
代码语言:javascript代码运行次数:0运行复制
<code class="javascript">static const struct file_operations fb_fops = {.owner =THIS_MODULE,.read =fb_read,.write =fb_write,.unlocked_ioctl = fb_ioctl,#ifdef CONFIG_COMPAT.compat_ioctl = fb_compat_ioctl,#endif.mmap =fb_mmap,.open =fb_open,.release =fb_release,#ifdef HAVE_ARCH_FB_UNMAPPED_AREA.get_unmapped_area = get_fb_unmapped_area,#endif#ifdef CONFIG_FB_DEFERRED_IO.fsync =fb_deferred_io_fsync,#endif.llseek =default_llseek,};</code>

可以看到有熟悉的open、release等函数接口。

因此,LCD驱动的重点就是初始化fb_info里面的各个成员。

fb_info结构体的成员变量很多,需要重点关注的是这几个:

var:当前的可变参数fix:当前的固定参数fbops:帧缓冲操作函数集screen_base:虚拟内存基地址(屏幕显存)screen_size:虚拟内存大小(屏幕显存大小)pseudo_palette:伪16位调色板

初始化完成fb_info后,通过register_framebuffer函数向内核注册刚刚初始化的fb_info。

1.2 LCD驱动文件mxsfb介绍

LCD的驱动文件为mxsfb.c,这是一种platform驱动框架,驱动和设备匹配之后,mxsfb_probe函数就会执行。

LCD的初始化通过mxsfb_probe函数来实现,该函数的主要功能有:

申请fb_info初始化fb_info结构体中的各个成员变量初始化eLCDIF控制器使用register_framebuffer函数向Linux内核注册初始化好的fb_info

该函数位于:/drivers/video/fbdev/mxsfb.c中

【i.MX6ULL】驱动开发11——LCD驱动实践

该函数的实现如下:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">static int mxsfb_probe(struct platform_device *pdev){const struct of_device_id *of_id =of_match_device(mxsfb_dt_ids, &pdev->dev);struct resource *res;struct mxsfb_info *host; //<-----NXP的fb_infostruct fb_info *fb_info; //<-----Linux的fb_infostruct pinctrl *pinctrl;int irq = platform_get_irq(pdev, 0);int gpio, ret;if (of_id)pdev->id_entry = of_id->data;gpio = of_get_named_gpio(pdev->dev.of_node, "enable-gpio", 0);if (gpio == -EPROBE_DEFER)return -EPROBE_DEFER;//省略...fb_info = framebuffer_alloc(sizeof(struct fb_info), &pdev->dev);//<--------申请fb_infoif (!fb_info) {dev_err(&pdev->dev, "Failed to allocate fbdev\n");devm_kfree(&pdev->dev, host);return -ENOMEM;}    host->fb_info = fb_info; //<---将mxsfb_info与fb_info联系起来    fb_info->par = host;//省略...ret = mxsfb_init_fbinfo(host);if (ret != 0)goto fb_pm_runtime_disable;mxsfb_dispdrv_init(pdev, fb_info);//省略...    ret = register_framebuffer(fb_info); //<------------注册if (ret != 0) {dev_err(&pdev->dev, "Failed to register framebuffer\n");goto fb_destroy;}console_lock();ret = fb_blank(fb_info, FB_BLANK_UNBLANK);console_unlock();if (ret < 0) {dev_err(&pdev->dev, "Failed to unblank framebuffer\n");goto fb_unregister;}dev_info(&pdev->dev, "initialized\n");}</code>

其中,register_framebuffer函数的原型如下:

【i.MX6ULL】驱动开发11——LCD驱动实践

函数参数和返回值含义:

fb_info:需上报的fb_info返回值:0-成功,负值-失败1.3 LCD 驱动程序编写

6ULL的eLCDIF接口驱动程序 NXP 已经编 写好了,因此 LCD 驱动部分我们不需要去修改。我们需要做的就是按照所使用的 LCD 来修改设备树。

1.3.1 查看设备树

1.3 先来看一下NXP官方编写的Linux下的 LCD 驱动。打开 imx6ull.dtsi,然后找到 lcdif节点内容:

【i.MX6ULL】驱动开发11——LCD驱动实践
代码语言:javascript代码运行次数:0运行复制
<code class="javascript">lcdif: lcdif@021c8000 {    compatible = "fsl,imx6ul-lcdif", "fsl,imx28-lcdif";    reg = <0x021c8000 0x4000>;    interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;    clocks = <&clks IMX6UL_CLK_LCDIF_PIX>,    <&clks IMX6UL_CLK_LCDIF_APB>,    <&clks IMX6UL_CLK_DUMMY>;    clock-names = "pix", "axi", "disp_axi";    status = "disabled";};</code>

其中021c8000 这个地址,可以从参考手册中找到对应的介绍:

【i.MX6ULL】驱动开发11——LCD驱动实践
1.3.2 屏幕IO配置

打开 imx6ull-myboard.dts 文件,在 iomuxc 节点中找到如下内容:

【i.MX6ULL】驱动开发11——LCD驱动实践

具体为:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">pinctrl_lcdif_dat: lcdifdatgrp {fsl,pins = <MX6UL_PAD_LCD_DATA00__LCDIF_DATA00  0x79MX6UL_PAD_LCD_DATA01__LCDIF_DATA01  0x79MX6UL_PAD_LCD_DATA02__LCDIF_DATA02  0x79MX6UL_PAD_LCD_DATA03__LCDIF_DATA03  0x79MX6UL_PAD_LCD_DATA04__LCDIF_DATA04  0x79MX6UL_PAD_LCD_DATA05__LCDIF_DATA05  0x79MX6UL_PAD_LCD_DATA06__LCDIF_DATA06  0x79MX6UL_PAD_LCD_DATA07__LCDIF_DATA07  0x79MX6UL_PAD_LCD_DATA08__LCDIF_DATA08  0x79MX6UL_PAD_LCD_DATA09__LCDIF_DATA09  0x79MX6UL_PAD_LCD_DATA10__LCDIF_DATA10  0x79MX6UL_PAD_LCD_DATA11__LCDIF_DATA11  0x79MX6UL_PAD_LCD_DATA12__LCDIF_DATA12  0x79MX6UL_PAD_LCD_DATA13__LCDIF_DATA13  0x79MX6UL_PAD_LCD_DATA14__LCDIF_DATA14  0x79MX6UL_PAD_LCD_DATA15__LCDIF_DATA15  0x79MX6UL_PAD_LCD_DATA16__LCDIF_DATA16  0x79MX6UL_PAD_LCD_DATA17__LCDIF_DATA17  0x79MX6UL_PAD_LCD_DATA18__LCDIF_DATA18  0x79MX6UL_PAD_LCD_DATA19__LCDIF_DATA19  0x79MX6UL_PAD_LCD_DATA20__LCDIF_DATA20  0x79MX6UL_PAD_LCD_DATA21__LCDIF_DATA21  0x79MX6UL_PAD_LCD_DATA22__LCDIF_DATA22  0x79MX6UL_PAD_LCD_DATA23__LCDIF_DATA23  0x79>;};pinctrl_lcdif_ctrl: lcdifctrlgrp {fsl,pins = <MX6UL_PAD_LCD_CLK__LCDIF_CLK    0x79MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE  0x79MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC    0x79MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC    0x79>;};pinctrl_pwm1: pwm1grp {fsl,pins = <MX6UL_PAD_GPIO1_IO08__PWM1_OUT   0x110b0>;};</code>

这里有3个节点:

子节点**pinctrl_lcdif_dat **,为 RGB LCD 的 24根数据线配置项子节点 **pinctrl_lcdif_ctrl **,为RGB LCD 的 4根控制线配置项,包括 CLK、ENABLE、VSYNC 和 HSYNC子节点 **pinctrl_pwm1 **,为RGB LCD 的背光亮度配置项1.3.3 屏幕参数配置

在imx6ull-myboard.dts 文件中找到lcdif 节点,根据自己使用的LCD,修改为对应的参数。

下面是NXP官方板子的参数:

【i.MX6ULL】驱动开发11——LCD驱动实践

我用的野火7寸屏(GT911,800x480),其参数为:

参数

width

800

height

480

HBP

46

HFP

22

VBP

23

VFP

22

HSPW

PHP Apache和MySQL 网页开发初步
PHP Apache和MySQL 网页开发初步

本书全面介绍PHP脚本语言和MySOL数据库这两种目前最流行的开源软件,主要包括PHP和MySQL基本概念、PHP扩展与应用库、日期和时间功能、PHP数据对象扩展、PHP的mysqli扩展、MySQL 5的存储例程、解发器和视图等。本书帮助读者学习PHP编程语言和MySQL数据库服务器的最佳实践,了解如何创建数据库驱动的动态Web应用程序。

下载

1

VSPW

1

修改后的lcdif 节点如下:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">&lcdif {pinctrl-names = "default";             /* 使用到的 IO */ pinctrl-0 = <&pinctrl_lcdif_dat     &pinctrl_lcdif_ctrl     &pinctrl_lcdif_reset>;display = <&display0>;status = "okay";display0: display {                  /* LCD 属性信息 */ bits-per-pixel = <16>;           /* 一个像素占用几个bit */ bus-width      = <24>;           /* 总线宽度 */ display-timings {native-mode = <&timing0>;    /* 时序信息 */ timing0: timing0 {clock-frequency = <9200000>; /* LCD像素时钟,单位Hz */ hactive      = <800>;        /* LCD X轴像素个数 */ vactive      = <480>;        /* LCD Y轴像素个数 */ hfront-porch = <22>;         /* LCD hfp 参数 */ hback-porch  = <46>;         /* LCD hbp 参数 */hsync-len    = <23>;         /* LCD hspw 参数 */ vback-porch  = <22>;         /* LCD vbp 参数 */vfront-porch = <4>;          /* LCD vfp 参数 */ vsync-len    = <1>;          /* LCD vspw 参数 */ hsync-active    = <0>;       /* hsync 数据线极性 */ vsync-active    = <0>;       /* vsync 数据线极性 */ de-active       = <1>;       /* de 数据线极性 */ pixelclk-active = <0>;       /* clk 数据线极性 */ };};};};</code>
1.3.4 屏幕背光配置

通过PWM信号来控制LCD屏幕背光的亮度

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">pinctrl_pwm1: pwm1grp {    fsl,pins = <        MX6UL_PAD_GPIO1_IO08__PWM1_OUT   0x110b0        >;};</code>

LCD 背光要用到PWM1,因此也要设置 PWM1 节点,在imx6ull.dtsi 文件中找到如下内容:

【i.MX6ULL】驱动开发11——LCD驱动实践

这个节点信息不用修改,使用默认的配置即可。如果要修改的话,也不要修改这里,可以通过imx6ull-myboard.dts文件中进行修改。

imx6ull-myboard.dts中的pwm1节点:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">&pwm1 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_pwm1>;status = "okay";};</code>

imx6ull-myboard.dts中的backlight节点:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">backlight {    compatible = "pwm-backlight";    pwms = <&pwm1 0 5000000>;    brightness-levels = <0 4 8 16 32 64 128 255>;    default-brightness-level = <6>;    status = "okay";};</code>
2 实验测试2.1使能Linux logo显示

uboot启动的时候,LCD左上角上会显示NXP的图标,而Linux内核启动的时候,LCD左上角上会显示一个小企鹅。因此,可以通过小企鹅logo的显示来验证LCD 驱动是否正常。

默认情况下是已经开启logo显示的,可以再确认一下。

在Linux内核源码目录,输入以下指令打开内核的图形化配置:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig</code>

Linux内核配置界面:

【i.MX6ULL】驱动开发11——LCD驱动实践

然后按下路径找到对应的配置项:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">-> Device Drivers       -> Graphics support          -> Bootup logo (LOGO [=y])</code>

最终到达这个界面:

【i.MX6ULL】驱动开发11——LCD驱动实践

这三个选项分别对应黑白、16 位、24 位色彩格式的 logo。

2.2 编译设备树

修改设备树中的lcdif节点后(主要是修改屏幕的参数),在Linux内核源码目录执行下面的命令,重新编译设备树并拷贝到网络启动位置。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">make imx6ull-myboard.dtbcp arch/arm/boot/dts/imx6ull-myboard.dtb ~/myTest/tftpboot/nxp/</code>

然后重启开发板,就可以在Linux内核驱动的时候看到屏幕上的企鹅图标了:

【i.MX6ULL】驱动开发11——LCD驱动实践
2.3 设置LCD作为终端控制台

之前一直使用串口来显示板子的启动和调试信息,实际上可以设置 LCD 作为终端进行同步显示:

2.3.1 设置uboot的bootargs

重启开发板,在倒计时时按回充进入ubout,可以先看下之前的bootargs配置:

【i.MX6ULL】驱动开发11——LCD驱动实践

只需要在原来的基础上再添加console=tty1即可:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">setenv bootargs 'console=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.5.104:/home/xxpcb/myTest/nfs/rootfs,proto=tcp,nfsvers=4 rw ip=192.168.5.102:192.168.5.104:192.168.5.1:255.255.255.0::eth1:off'saveenv</code>

然后重启开发板,在Linux内核驱动的时候就可以在屏幕上看到输出信息了:

【i.MX6ULL】驱动开发11——LCD驱动实践

对比一下串口输出的信息,可以看出屏幕输出到Freeing unused kernel memory: 400K (8090e000 - 80972000)这句后就没有了,没有出现按下回车键继续的提示,也没有显示开启自启动的hello word测试程序的打印,这是因为某些设置还未完成。

【i.MX6ULL】驱动开发11——LCD驱动实践
2.3.2 修改/etc/inittab文件

该修改用于设置屏幕作为终端进行交互。

打开根文件系统中的/etc/inittab 文件,加入下面这一行:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">tty1::askfirst:-/bin/sh </code>
【i.MX6ULL】驱动开发11——LCD驱动实践

保存后重启板子,并在板子的USB接口插上键盘,就可以通过键盘和板子交互了:

【i.MX6ULL】驱动开发11——LCD驱动实践

现在通过板子插入键盘,也可以在屏幕上操作板子了。

注意,之前设置的开机启动的hello word程序的打印没有出现在屏幕上,是因为printf的输入没有设置的LCD中,我们可以通过将输出指向 /dev/tty1 来实现LCD屏幕的打印,比如测试屏幕输出hello linux:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">echo hello linux > /dev/tty1 </code>
【i.MX6ULL】驱动开发11——LCD驱动实践
2.4 其它问题 2.4.1 自动熄屏的问题

当没有操作LCD屏幕一段时间后,屏幕会自动黑屏,这时可以通过接入键盘按下回车键进行唤醒(也可以通过板子的ON/OFF按键进行唤醒,因为该按键也被赋予了回车键的功能)。

这个时间是在Linux源码的 drivers/tty/vt/vt.c中设置的,默认是10分钟(10*60秒)。

【i.MX6ULL】驱动开发11——LCD驱动实践

如果想让屏幕一直亮着,可以将改值设为0,并重新编辑Linux内核得到zImage,然后用新的zImage启动开发板。

如果不想修改zImage,另外一种方式可以创建一个开机启动的应用程序来控制屏幕不熄灭, lcd_always_on.c的内容为:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">#include <fcntl.h> #include <stdio.h> #include <sys/ioctl.h> int main(int argc, char *argv[]) {     int fd;     fd = open("/dev/tty1", O_RDWR);     write(fd, "\033[9;0]", 8);     close(fd);     return 0; } </code>

在ubuntu中编译该程序,然后将可执行程序拷贝到板子的根文件系统中:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">arm-linux-gnueabihf-gcc lcd_always_on.c -o lcd_always_on cp lcd_always_on ~/myTest/nfs/rootfs/usr/bin/</code>
【i.MX6ULL】驱动开发11——LCD驱动实践

然后,/etc/init.d/rcS中设置该程序开机自启动即可。

【i.MX6ULL】驱动开发11——LCD驱动实践

保存后,重启开发板,屏幕就不会自动熄屏了。

2.4.2 屏幕亮度调节

屏幕的亮度也是可以调节的,设备树中背光节点设置了8 个等级,可以在 0~7范围内进行亮度调节,进入下面的目录,可以查看当前屏幕的亮度:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">/sys/devices/platform/backlight/backlight/backlight </code>

通过下面的指令可以实时修改屏幕的亮度,比如修改亮度为1:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">echo 1 > brightness</code>
【i.MX6ULL】驱动开发11——LCD驱动实践
总结

本篇介绍了LCD屏幕驱动相关知识并进行了实验,因为NXP官方的板子和我这个板子的LCD引脚一样,因此主要的修改就是将设备树中的lcdif 节点的屏幕参数进行修改即可。

通过实验,可以将企鹅logo显示出来,并将板子的输出信息定向到了LCD屏幕显示,通过接入键盘可实现与Linux板子的交互。最后,还测试了屏幕熄屏和亮度调节功能。

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

76

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

302

2023.11.28

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

470

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

201

2025.07.04

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1848

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

614

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2356

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.3万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号