当前位置: 首页 > news >正文

嵌入式Linux驱动开发(LCD屏幕专题)(三)

1. 硬件相关的操作

LCD驱动程序的核心就是:

  • 分配fb_info
  • 设置fb_info
  • 注册fb_info
  • 硬件相关的设置

硬件相关的设置又可以分为3部分:

  • 引脚设置
  • 时钟设置
  • LCD控制器设置

2. 在设备树里指定LCD参数

	framebuffer-mylcd {compatible = "100ask,lcd_drv";pinctrl-names = "default";pinctrl-0 = <&mylcd_pinctrl>;backlight-gpios = <&gpio1 8 GPIO_ACTIVE_HIGH>;clocks = <&clks IMX6UL_CLK_LCDIF_PIX>,<&clks IMX6UL_CLK_LCDIF_APB>;clock-names = "pix", "axi";display = <&display0>;display0: display {bits-per-pixel = <24>;bus-width = <24>;display-timings {native-mode = <&timing0>;timing0: timing0_1024x768 {clock-frequency = <50000000>;hactive = <1024>;vactive = <600>;hfront-porch = <160>;hback-porch = <140>;hsync-len = <20>;vback-porch = <20>;vfront-porch = <12>;vsync-len = <3>;hsync-active = <0>;vsync-active = <0>;de-active = <1>;pixelclk-active = <0>;};};};            };

3. 编程

3.1 从设备树获得参数

时序参数、引脚极性等信息,都被保存在一个display_timing结构体里:
在这里插入图片描述

参考内核文件:

  • drivers\video\of_display_timing.c
  • drivers\video\fbdev\mxsfb.c

3.2 使用参数配置LCD控制器

根据芯片手册,一个一个设置寄存器:

  • Framebuffer地址设置
  • Framebuffer中数据格式设置
  • LCD时序参数设置
  • LCD引脚极性设置

4.上机实验

1. 要做的事情

  • 去除内核自带的驱动程序

  • 加入我们编写的驱动程序、设备树文件

  • 重新编译内核、设备树

  • 上机测试:使用编译出来的内核、设备树启动板子

2. 去除内核自带的驱动程序

修改内核文件:drivers/video/fbdev/Makefile,把内核自带驱动程序mxsfb.c对应的那行注释掉,如下:

#obj-$(CONFIG_FB_MXS)             += mxsfb.o

3. 加入新驱动程序、设备树

  • 复制驱动程序:

    • 11_lcd_drv_imx6ull_ok\lcd_drv.c放到内核源码目录drivers/video/fbdev
    • 备份内核自带设备树文件:arch/arm/boot/dts/100ask_imx6ull-14x14.dts
    • 11_lcd_drv_imx6ull_ok\100ask_imx6ull-14x14.dts放到内核源码目录arch/arm/boot/dts/
  • 修改内核文件:

    • 修改:drivers/video/fbdev/Makefile,使用我们提供的lcd_drv.c,如下:
#obj-$(CONFIG_FB_MXS)             += mxsfb.o
obj-$(CONFIG_FB_MXS)             += lcd_drv.o

4. 重新编译内核、设备树

以下命令在Ubuntu中执行。

  • 设置工具链
  export ARCH=armexport CROSS_COMPILE=arm-linux-gnueabihf-export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
  • 配置、编译
  book@100ask:~/100ask_imx6ull-sdk$ cd Linux-4.9.88book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make 100ask_imx6ull_defconfig   book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make zImage book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make dtbs
  • 得到

    • 内核:arch/arm/boot/zImage
    • 设备树文件:arch/arm/boot/dts/100ask_imx6ull-14x14.dtb
  • 复制到NFS目录:

  $ cp arch/arm/boot/zImage ~/nfs_rootfs/$ cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs/

5. 上机测试

以下命令在开发板中执行。

  • 挂载NFS

    • vmware使用NAT(假设windowsIP为192.168.1.100)

      [root@100ask:~]# mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 
      192.168.1.100:/home/book/nfs_rootfs /mnt
      
    • vmware使用桥接,或者不使用vmware而是直接使用服务器:假设Ubuntu IP为192.168.1.137

      [root@100ask:~]#  mount -t nfs -o nolock,vers=3 192.168.1.137:/home/book/nfs_rootfs /mnt
      
  • 更新单板文件

  [root@100ask:~]# cp /mnt/zImage /boot[root@100ask:~]# cp /mnt/100ask_imx6ull-14x14.dtb /boot[root@100ask:~]# sync
  • 重启开发板观察现象

    • 如果可以看到企鹅LOGO,就表示正常
    • 如果在终端中可以查看到存在/dev/fb0节点,也表示正常
  • 解决BUG

    • 现象:LCD上没有企鹅LOGO,在终端中执行ls -l /dev/fb0发现没有设备节点

    • 观察内核启动信息,看到:

      [    0.619880] imx6ul-pinctrl 20e0000.iomuxc: pin MX6UL_PAD_GPIO1_IO08 already requested by 2080000.pwm; cannot claim for 21c8000.framebuffer-mylcd
      [    0.619920] imx6ul-pinctrl 20e0000.iomuxc: pin-31 (21c8000.framebuffer-mylcd) status -22
      [    0.619954] imx6ul-pinctrl 20e0000.iomuxc: could not request pin 31 (MX6UL_PAD_GPIO1_IO08) from group mylcd_pingrp  on device 20e0000.iomuxc
      [    0.619985] mylcd 21c8000.framebuffer-mylcd: Error applying setting, reverse things back
      [    0.620070] mylcd: probe of 21c8000.framebuffer-mylcd failed with error -22
      
    • 原因:引脚冲突

      • 设备树中pwm节点、framebuffer-mylcd节点,都使用到的同一个引脚:PAD_GPIO1_IO08
    • 解决方法:修改arch/arm/boot/dts/100ask_imx6ull-14x14.dts,禁止pwm节点,如下:
      在这里插入图片描述

6、代码

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/err.h>
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/fb.h>
#include <linux/init.h>
#include <linux/dma-mapping.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/cpufreq.h>
#include <linux/io.h>
#include <video/display_timing.h>
#include <video/of_display_timing.h>
#include <linux/gpio/consumer.h>
#include <asm/div64.h>
#include <asm/mach/map.h>struct imx6ull_lcdif {volatile unsigned int CTRL;                              volatile unsigned int CTRL_SET;                        volatile unsigned int CTRL_CLR;                         volatile unsigned int CTRL_TOG;                         volatile unsigned int CTRL1;                             volatile unsigned int CTRL1_SET;                         volatile unsigned int CTRL1_CLR;                       volatile unsigned int CTRL1_TOG;                       volatile unsigned int CTRL2;                            volatile unsigned int CTRL2_SET;                       volatile unsigned int CTRL2_CLR;                        volatile unsigned int CTRL2_TOG;                        volatile unsigned int TRANSFER_COUNT;   unsigned char RESERVED_0[12];volatile unsigned int CUR_BUF;                          unsigned char RESERVED_1[12];volatile unsigned int NEXT_BUF;                        unsigned char RESERVED_2[12];volatile unsigned int TIMING;                          unsigned char RESERVED_3[12];volatile unsigned int VDCTRL0;                         volatile unsigned int VDCTRL0_SET;                      volatile unsigned int VDCTRL0_CLR;                     volatile unsigned int VDCTRL0_TOG;                     volatile unsigned int VDCTRL1;                          unsigned char RESERVED_4[12];volatile unsigned int VDCTRL2;                          unsigned char RESERVED_5[12];volatile unsigned int VDCTRL3;                          unsigned char RESERVED_6[12];volatile unsigned int VDCTRL4;                           unsigned char RESERVED_7[12];volatile unsigned int DVICTRL0;    unsigned char RESERVED_8[12];volatile unsigned int DVICTRL1;                         unsigned char RESERVED_9[12];volatile unsigned int DVICTRL2;                        unsigned char RESERVED_10[12];volatile unsigned int DVICTRL3;                        unsigned char RESERVED_11[12];volatile unsigned int DVICTRL4;                          unsigned char RESERVED_12[12];volatile unsigned int CSC_COEFF0;  unsigned char RESERVED_13[12];volatile unsigned int CSC_COEFF1;                        unsigned char RESERVED_14[12];volatile unsigned int CSC_COEFF2;                        unsigned char RESERVED_15[12];volatile unsigned int CSC_COEFF3;                        unsigned char RESERVED_16[12];volatile unsigned int CSC_COEFF4;   unsigned char RESERVED_17[12];volatile unsigned int CSC_OFFSET;  unsigned char RESERVED_18[12];volatile unsigned int CSC_LIMIT;  unsigned char RESERVED_19[12];volatile unsigned int DATA;                              unsigned char RESERVED_20[12];volatile unsigned int BM_ERROR_STAT;                     unsigned char RESERVED_21[12];volatile unsigned int CRC_STAT;                        unsigned char RESERVED_22[12];volatile  unsigned int STAT;                             unsigned char RESERVED_23[76];volatile unsigned int THRES;                             unsigned char RESERVED_24[12];volatile unsigned int AS_CTRL;                           unsigned char RESERVED_25[12];volatile unsigned int AS_BUF;                            unsigned char RESERVED_26[12];volatile unsigned int AS_NEXT_BUF;                     unsigned char RESERVED_27[12];volatile unsigned int AS_CLRKEYLOW;                    unsigned char RESERVED_28[12];volatile unsigned int AS_CLRKEYHIGH;                   unsigned char RESERVED_29[12];volatile unsigned int SYNC_DELAY;                      
} ;struct lcd_regs {volatile unsigned int fb_base_phys;volatile unsigned int fb_xres;volatile unsigned int fb_yres;volatile unsigned int fb_bpp;	
};static struct lcd_regs *mylcd_regs;
static struct fb_info *myfb_info;
static unsigned int pseudo_palette[16];static struct gpio_desc *bl_gpio;
static struct clk* clk_pix;
static struct clk* clk_axi;static void lcd_controller_enable(struct imx6ull_lcdif *lcdif)
{lcdif->CTRL |= (1<<0);
}static int lcd_controller_init(struct imx6ull_lcdif *lcdif, struct display_timing *dt, int lcd_bpp, int fb_bpp, unsigned int fb_phy)
{int lcd_data_bus_width;int fb_width;int vsync_pol = 0;int hsync_pol = 0;int de_pol = 0;int clk_pol = 0;if (dt->flags & DISPLAY_FLAGS_HSYNC_HIGH)hsync_pol = 1;if (dt->flags & DISPLAY_FLAGS_VSYNC_HIGH)vsync_pol = 1;if (dt->flags & DISPLAY_FLAGS_DE_HIGH)de_pol = 1;if (dt->flags & DISPLAY_FLAGS_PIXDATA_POSEDGE)clk_pol = 1;if (lcd_bpp == 24)lcd_data_bus_width = 0x3;else if (lcd_bpp == 18)lcd_data_bus_width = 0x2;else if (lcd_bpp == 8)lcd_data_bus_width = 0x1;else if (lcd_bpp == 16)lcd_data_bus_width = 0x0;elsereturn -1;if (fb_bpp == 24 || fb_bpp == 32)fb_width = 0x3;else if (fb_bpp == 18)fb_width = 0x2;else if (fb_bpp == 8)fb_width = 0x1;else if (fb_bpp == 16)fb_width = 0x0;elsereturn -1;/* * 初始化LCD控制器的CTRL寄存器* [19]       :  1      : DOTCLK和DVI modes需要设置为1 * [17]       :  1      : 设置为1工作在DOTCLK模式* [15:14]    : 00      : 输入数据不交换(小端模式)默认就为0,不需设置* [13:12]    : 00      : CSC数据不交换(小端模式)默认就为0,不需设置* [11:10]    : 11		: 数据总线为24bit* [9:8]    根据显示屏资源文件bpp来设置:8位0x1 , 16位0x0 ,24位0x3* [5]        :  1      : 设置elcdif工作在主机模式* [1]        :  0      : 24位数据均是有效数据,默认就为0,不需设置*/	lcdif->CTRL = (0<<30) | (0<<29) | (0<<28) | (1<<19) | (1<<17) | (lcd_data_bus_width << 10) |\(fb_width << 8) | (1<<5);/** 设置ELCDIF的寄存器CTRL1* 根据bpp设置,bpp为24或32才设置* [19:16]  : 111  :表示ARGB传输格式模式下,传输24位无压缩数据,A通道不用传输)*/	  if(fb_bpp == 24 || fb_bpp == 32){	  lcdif->CTRL1 &= ~(0xf << 16); lcdif->CTRL1 |=  (0x7 << 16); }elselcdif->CTRL1 |= (0xf << 16); /** 设置ELCDIF的寄存器TRANSFER_COUNT寄存器* [31:16]  : 垂直方向上的像素个数  * [15:0]   : 水平方向上的像素个数*/lcdif->TRANSFER_COUNT  = (dt->vactive.typ << 16) | (dt->hactive.typ << 0);/** 设置ELCDIF的VDCTRL0寄存器* [29] 0 : VSYNC输出  ,默认为0,无需设置* [28] 1 : 在DOTCLK模式下,设置1硬件会产生使能ENABLE输出* [27] 0 : VSYNC低电平有效	,根据屏幕配置文件将其设置为0* [26] 0 : HSYNC低电平有效 , 根据屏幕配置文件将其设置为0* [25] 1 : DOTCLK下降沿有效 ,根据屏幕配置文件将其设置为1* [24] 1 : ENABLE信号高电平有效,根据屏幕配置文件将其设置为1* [21] 1 : 帧同步周期单位,DOTCLK mode设置为1* [20] 1 : 帧同步脉冲宽度单位,DOTCLK mode设置为1* [17:0] :  vysnc脉冲宽度 */lcdif->VDCTRL0 = (1 << 28)|( vsync_pol << 27)\|( hsync_pol << 26)\|( clk_pol << 25)\|( de_pol << 24)\|(1 << 21)|(1 << 20)|( dt->vsync_len.typ << 0);/** 设置ELCDIF的VDCTRL1寄存器* 设置垂直方向的总周期:上黑框tvb+垂直同步脉冲tvp+垂直有效高度yres+下黑框tvf*/	  lcdif->VDCTRL1 = dt->vback_porch.typ + dt->vsync_len.typ + dt->vactive.typ + dt->vfront_porch.typ;  /** 设置ELCDIF的VDCTRL2寄存器* [18:31]  : 水平同步信号脉冲宽度* [17: 0]   : 水平方向总周期* 设置水平方向的总周期:左黑框thb+水平同步脉冲thp+水平有效高度xres+右黑框thf*/ lcdif->VDCTRL2 = (dt->hsync_len.typ << 18) | (dt->hback_porch.typ + dt->hsync_len.typ + dt->hactive.typ + dt->hfront_porch.typ);/** 设置ELCDIF的VDCTRL3寄存器* [27:16] :水平方向上的等待时钟数 =thb + thp* [15:0]  : 垂直方向上的等待时钟数 = tvb + tvp*/ lcdif->VDCTRL3 = ((dt->hback_porch.typ + dt->hsync_len.typ) << 16) | (dt->vback_porch.typ + dt->vsync_len.typ);/** 设置ELCDIF的VDCTRL4寄存器* [18]	   使用VSHYNC、HSYNC、DOTCLK模式此为置1* [17:0]  : 水平方向的宽度*/ lcdif->VDCTRL4 = (1<<18) | (dt->hactive.typ);/** 设置ELCDIF的CUR_BUF和NEXT_BUF寄存器* CUR_BUF	 :	当前显存地址* NEXT_BUF :	下一帧显存地址* 方便运算,都设置为同一个显存地址*/ lcdif->CUR_BUF  =  fb_phy;lcdif->NEXT_BUF =  fb_phy;return 0;
}/* from pxafb.c */
static inline unsigned int chan_to_field(unsigned int chan,struct fb_bitfield *bf)
{chan &= 0xffff;chan >>= 16 - bf->length;return chan << bf->offset;
}static int mylcd_setcolreg(unsigned regno,unsigned red, unsigned green, unsigned blue,unsigned transp, struct fb_info *info)
{unsigned int val;/* dprintk("setcol: regno=%d, rgb=%d,%d,%d\n",regno, red, green, blue); */switch (info->fix.visual) {case FB_VISUAL_TRUECOLOR:/* true-colour, use pseudo-palette */if (regno < 16) {u32 *pal = info->pseudo_palette;val  = chan_to_field(red,   &info->var.red);val |= chan_to_field(green, &info->var.green);val |= chan_to_field(blue,  &info->var.blue);pal[regno] = val;}break;default:return 1;	/* unknown type */}return 0;
}static struct fb_ops myfb_ops = {.owner		= THIS_MODULE,.fb_setcolreg	= mylcd_setcolreg,.fb_fillrect	= cfb_fillrect,.fb_copyarea	= cfb_copyarea,.fb_imageblit	= cfb_imageblit,
};static int mylcd_probe(struct platform_device *pdev)
{struct device_node *display_np;dma_addr_t phy_addr;int ret;int width;int bits_per_pixel;struct display_timings *timings = NULL;struct display_timing *dt = NULL;struct imx6ull_lcdif *lcdif;struct resource *res;display_np = of_parse_phandle(pdev->dev.of_node, "display", 0);/* get common info */ret = of_property_read_u32(display_np, "bus-width", &width);ret = of_property_read_u32(display_np, "bits-per-pixel",&bits_per_pixel);/* get timming */timings = of_get_display_timings(display_np);dt = timings->timings[timings->native_mode];/* get gpio from device tree */bl_gpio = gpiod_get(&pdev->dev, "backlight", 0);/* config bl_gpio as output */gpiod_direction_output(bl_gpio, 1);/* set val: gpiod_set_value(bl_gpio, status); *//* get clk from device tree */clk_pix = devm_clk_get(&pdev->dev, "pix");clk_axi = devm_clk_get(&pdev->dev, "axi");/* set clk rate */clk_set_rate(clk_pix, dt->pixelclock.typ);/* enable clk */clk_prepare_enable(clk_pix);clk_prepare_enable(clk_axi);/* 1.1 分配fb_info */myfb_info = framebuffer_alloc(0, NULL);/* 1.2 设置fb_info *//* a. var : LCD分辨率、颜色格式 */myfb_info->var.xres_virtual = myfb_info->var.xres = dt->hactive.typ;myfb_info->var.yres_virtual = myfb_info->var.yres = dt->vactive.typ;myfb_info->var.bits_per_pixel = 16;  /* rgb565 */myfb_info->var.red.offset = 11;myfb_info->var.red.length = 5;myfb_info->var.green.offset = 5;myfb_info->var.green.length = 6;myfb_info->var.blue.offset = 0;myfb_info->var.blue.length = 5;/* b. fix */strcpy(myfb_info->fix.id, "100ask_lcd");myfb_info->fix.smem_len = myfb_info->var.xres * myfb_info->var.yres * myfb_info->var.bits_per_pixel / 8;if (myfb_info->var.bits_per_pixel == 24)myfb_info->fix.smem_len = myfb_info->var.xres * myfb_info->var.yres * 4;/* fb的虚拟地址 */myfb_info->screen_base = dma_alloc_wc(NULL, myfb_info->fix.smem_len, &phy_addr,GFP_KERNEL);myfb_info->fix.smem_start = phy_addr;  /* fb的物理地址 */myfb_info->fix.type = FB_TYPE_PACKED_PIXELS;myfb_info->fix.visual = FB_VISUAL_TRUECOLOR;myfb_info->fix.line_length = myfb_info->var.xres * myfb_info->var.bits_per_pixel / 8;if (myfb_info->var.bits_per_pixel == 24)myfb_info->fix.line_length = myfb_info->var.xres * 4;/* c. fbops */myfb_info->fbops = &myfb_ops;myfb_info->pseudo_palette = pseudo_palette;/* 1.3 注册fb_info */register_framebuffer(myfb_info);/* 1.4 硬件操作 *///lcdif = ioremap(0x021C8000, sizeof(*lcdif));res = platform_get_resource(pdev, IORESOURCE_MEM, 0);lcdif = devm_ioremap_resource(&pdev->dev, res);lcd_controller_init(lcdif, dt, bits_per_pixel, 16, phy_addr);lcd_controller_enable(lcdif);gpiod_set_value(bl_gpio, 1); return 0;
}static int mylcd_remove(struct platform_device *pdev)
{/* 反过来操作 *//* 2.1 反注册fb_info */unregister_framebuffer(myfb_info);/* 2.2 释放fb_info */framebuffer_release(myfb_info);iounmap(mylcd_regs);return 0;
}static const struct of_device_id mylcd_of_match[] = {{ .compatible = "100ask,lcd_drv", },{ },
};
MODULE_DEVICE_TABLE(of, simplefb_of_match);static struct platform_driver mylcd_driver = {.driver = {.name = "mylcd",.of_match_table = mylcd_of_match,},.probe = mylcd_probe,.remove = mylcd_remove,
};static int __init lcd_drv_init(void)
{int ret;ret = platform_driver_register(&mylcd_driver);if (ret)return ret;return 0;
}/* 2. 出口 */
static void __exit lcd_drv_exit(void)
{platform_driver_unregister(&mylcd_driver);
}module_init(lcd_drv_init);
module_exit(lcd_drv_exit);
MODULE_LICENSE("GPL");

相关文章:

嵌入式Linux驱动开发(LCD屏幕专题)(三)

1. 硬件相关的操作 LCD驱动程序的核心就是&#xff1a; 分配fb_info设置fb_info注册fb_info硬件相关的设置 硬件相关的设置又可以分为3部分&#xff1a; 引脚设置时钟设置LCD控制器设置 2. 在设备树里指定LCD参数 framebuffer-mylcd {compatible "100ask,lcd_drv&qu…...

MySQL视图用户管理

文章目录 视图视图的规则用户用户信息创建用户删除用户修改密码 用户权限给用户授权回收权限 视图 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会…...

我发现了一个很好看的字体,霞鹜文楷!如何换windows和typora字体?

1、字体 官方地址如下&#xff0c;下载也很简单。 https://github.com/lxgw/LxgwWenKai 有1W多的stars。 方式&#xff1a; 直接打包下载。下载不来&#xff0c;可以联系我。 然后ttf的文件&#xff0c;全部安装就行了。 reg save "HKCU\Control Panel" .\res…...

微软8月系统更新引发问题:虚拟内存分页文件出现错误

微软的八月系统更新引发了一系列问题&#xff0c;其中包括“UNSUPPORTED_PROCESSOR”蓝屏错误和文件管理器故障。尽管微软已经修复了前者&#xff0c;但据国外科技媒体Windows Latest报道&#xff0c;仍有用户反馈在非微星设备上出现“fault in nonpaged area”蓝屏错误。 如果…...

swiper删除虚拟slide问题

在存在缓存的情况下&#xff0c;删除较前的slide&#xff0c;会出现当前slide与后一个slide重复出现的情况 假设当前存在5个slide&#xff0c;且这5个slide已缓存&#xff0c;则删除slide2后&#xff0c;仍为5个slide&#xff0c;且slide2的内容变为slide3的内容&#xff0c;此…...

FPGA实战小项目2

基于FPGA的贪吃蛇游戏 基于FPGA的贪吃蛇游戏 基于fpga的数字密码锁ego1 基于fpga的数字密码锁ego1 基于fpga的数字时钟 basys3 基于fpga的数字时钟 basys3...

一些关于完整小程序项目的优秀开源

转载自&#xff1a; 35个项目&#xff0c;开源&#xff0c;开源&#xff01; (qq.com) 那几本霸占我休息时间的PDF&#xff01; (qq.com) 13个超强的 SpringBoot 实战项目 &#xff08;还不赶紧收藏起来&#xff09; (qq.com) 用SpringBoot开发一个人脸识别系统&#xff01…...

Windows模拟器推荐

物是人非事事休&#xff0c;欲语泪先流 Windows模拟器推荐 如果你需要在 Windows 操作系统之外运行 Windows 应用程序或测试不同版本的 Windows&#xff0c;有几个 Windows 模拟器和虚拟机软件可供选择。以下是一些常用的 Windows 模拟器和虚拟机软件&#xff1a; VirtualBox&…...

搭建RabbitMQ消息服务,整合SpringBoot实现收发消息

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;3年JAVA全栈开发经验&#xff0c;专注JAVA技术、系统定制、远程指导&#xff0c;致力于企业数字化转型&#xff0c;CSDN博客专家&#xff0c;蓝桥云课认证讲师。 目录 一、前言1.1 什么是消息队列1.2 RabbitMQ 是什么1.…...

Web framework-Gin(二)

目录 一、Gin 1、Ajax 2、文件上传 2.1、form表单中文件上传(单个文件) 2.2、form表单中文件上传(多个文件) 2.3、ajax上传单个文件 2.4、ajax上传多个文件 3、模板语法 4、数据绑定 5、路由组 6、中间件 一、Gin 1、Ajax AJAX 即“Asynchronous Javascript And XM…...

【聚类】K-Means聚类

cluster&#xff1a;簇 原理&#xff1a; 这边暂时没有时间具体介绍kmeans聚类的原理。简单来说&#xff0c;就是首先初始化k个簇心&#xff1b;然后计算所有点到簇心的欧式距离&#xff0c;对一个点来说&#xff0c;距离最短就属于那个簇&#xff1b;然后更新不同簇的簇心&a…...

超图聚类论文阅读2:Last-step算法

超图聚类论文阅读2&#xff1a;Last-step算法 《使用超图模块化的社区检测算法》 《Community Detection Algorithm Using Hypergraph Modularity》 COMPLEX NETWORKS 2021, SCI 3区 具体实现源码见HyperNetX库 工作&#xff1a;提出了一种用于超图的社区检测算法。该算法的主要…...

React 防抖与节流用法

在React中&#xff0c;防抖和节流是优化性能和提升用户体验的常用技术。下面是它们的用法&#xff1a; 防抖&#xff08;Debounce&#xff09;&#xff1a;防抖是指在某个事件触发后&#xff0c;等待一段时间后执行回调函数。如果在等待时间内再次触发该事件&#xff0c;将重新…...

发布 VectorTraits v1.0,它是 C# 下增强SIMD向量运算的类库

发布 VectorTraits v1.0, 它是C#下增强SIMD向量运算的类库 VectorTraits: SIMD Vector type traits methods (SIMD向量类型的特征方法). NuGet: https://www.nuget.org/packages/VectorTraits/1.0.0 源代码: https://github.com/zyl910/VectorTraits 用途 总所周知&#x…...

HCIA自学笔记01-冲突域

共享式网络&#xff08;用同一根同轴电缆通信&#xff09;中可能会出现信号冲突现象。 如图是一个10BASE5以太网&#xff0c;每个主机都是用同一根同轴电缆来与其它主机进行通信&#xff0c;因此&#xff0c;这里的同轴电缆又被称为共享介质&#xff0c;相应的网络被称为共享介…...

3D封装技术发展

长期以来&#xff0c;芯片制程微缩技术一直驱动着摩尔定律的延续。从1987年的1um制程到2015年的14nm制程&#xff0c;芯片制程迭代速度一直遵循摩尔定律的规律&#xff0c;即芯片上可以容纳的晶体管数目在大约每经过18个月到24个月便会增加一倍。但2015年以后&#xff0c;芯片制…...

探讨下live555用的编程设计模式

这个应该放到这里 7.live555mediaserver-第1阶段小结&#xff08;完整对象图和思维导图&#xff09; https://blog.csdn.net/yhb1206/article/details/127330771 但是想想&#xff0c;还是拿出来吧。 从这第1阶段就能发现&#xff0c;它实质用到了reactor网络编程模式。...

LeetCode 1123. Lowest Common Ancestor of Deepest Leaves【树,DFS,BFS,哈希表】1607

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

centroen 23版本换界面了

旧版本 新版本 没有与操作系统一起打包的ISO文件了&#xff0c;要么先安装系统&#xff0c;再安装Centreon&#xff0c;要么用pve导入OVF文件...

Postman 调用 Microsoft Graph API (InsCode AI 创作助手)

官方配置参考网址&#xff1a; https://learn.microsoft.com/zh-cn/graph/use-postman 获取 Azure AD 应用程序凭据&#xff1a; 在 Azure AD 中注册你的应用程序&#xff0c;并获取客户端ID和客户端密钥。这些凭据将允许你的应用程序与 Microsoft Graph 进行身份验证和访问权限…...

MySql 游标 触发器

游标 1.什么是游标 MySQL游标是一种数据库对象&#xff0c;它用于在数据库查询过程中迭代访问结果集中的每一行。游标可以被看作是一个指向查询结果集的指针&#xff0c;通过移动游标&#xff0c;可以按行读取和处理结果集的数据。在MySQL中&#xff0c;游标可以用于在存储过程…...

浅谈数据治理中的智能数据目录

在数字化转型的战略实施中&#xff0c;很多企业都在搭建自己的业务、数据及人工智能的中台。在同这些企业合作和交流中&#xff0c;越来越体会到数据目录是中台建设的核心和基础。为了更好地提供数据服务&#xff0c;发挥数据价值&#xff0c;用户需要先理解数据和信任数据。 企…...

算法通关村第十七关:青铜挑战-贪心其实很简单

青铜挑战-贪心其实很简单 1. 难以解释的贪心算法 贪心学习法则&#xff1a;直接做题&#xff0c;不考虑贪不贪心 贪心(贪婪)算法 是指在问题尽心求解时&#xff0c;在每一步选择中都采取最好或者最优&#xff08;最有利&#xff09;的选择&#xff0c;从而希望能够导致结果最…...

[Vue3 博物馆管理系统] 使用Vue3、Element-plus的Layout 布局构建组图文章

系列文章目录 第一章 定制上中下&#xff08;顶部菜单、底部区域、中间主区域显示&#xff09;三层结构首页 第二章 使用Vue3、Element-plus菜单组件构建菜单 第三章 使用Vue3、Element-plus走马灯组件构建轮播图 第四章 使用Vue3、Element-plus tabs组件构建选项卡功能 第五章…...

【LeetCode算法系列题解】第36~40题

CONTENTS LeetCode 36. 有效的数独&#xff08;中等&#xff09;LeetCode 37. 解数独&#xff08;困难&#xff09;LeetCode 38. 外观数列&#xff08;中等&#xff09;LeetCode 39. 组合总和&#xff08;中等&#xff09;LeetCode 40. 组合总和 II&#xff08;中等&#xff09…...

java+ssm+mysql电梯管理系统

项目介绍&#xff1a; 使用javassmmysql开发的电梯管理系统&#xff0c;系统包含管理员&#xff0c;监管员、安全员、维保员角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;系统用户管理&#xff08;监管员、安全员、维保员&#xff09;&#xff1b;系统公告&#…...

最近读书了吗?林曦老师与你分享来自暄桐课堂的读书方法

近来&#xff0c;大家有在开心读书吗&#xff1f;对于读书&#xff0c;有一个很生动的说法&#xff1a;“无事常读书&#xff0c;一日是四日。若活七十年&#xff0c;便二百八十。”读书帮助我们超越个体生命经验的限制&#xff0c;此时此地的我们&#xff0c;也可借由书本&…...

【AI理论学习】语言模型:从Word Embedding到ELMo

语言模型&#xff1a;从Word Embedding到ELMo ELMo原理Bi-LM总结参考资料 本文主要介绍一种建立在LSTM基础上的ELMo预训练模型。2013年的Word2Vec及2014年的GloVe的工作中&#xff0c;每个词对应一个vector&#xff0c;对于多义词无能为力。ELMo的工作对于此&#xff0c;提出了…...

多功能透明屏,在智能家居领域中,有哪些功能特点?显示、连接

多功能透明屏是一种新型的显示技术&#xff0c;它能够在透明的表面上显示图像和视频&#xff0c;并且具有多种功能。 这种屏幕可以应用于各种领域&#xff0c;如商业广告、智能家居、教育等&#xff0c;为用户提供更加便捷和多样化的体验。 首先&#xff0c;多功能透明屏可以…...

【List篇】ArrayList 详解(含图示说明)

Java中的ArrayList是一个动态数组&#xff0c;可以自动扩展容量以适应数据的添加和删除。它可以用来存储各种类型的数据&#xff0c;例如String&#xff0c;Integer&#xff0c;Boolean等。ArrayList实现了List接口&#xff0c;可以进行常见的List操作&#xff0c;例如添加、插…...

怎么制作个人求职网站/国产十大erp软件

文章目录TCP服务器与客户端TCP基础net模块创建TCP服务器和客户端UDP服务器与客户端UDP基础dgram模块创建UDP服务器和客户端WebSocket服务器与客户端WebSocket实现机制WebSocket构建实时聊天室学习文章&#xff1a;Node.js 网络编程 &#xff08;上&#xff09;Web基础知识、实现…...

给网站做镜像/北京口碑最好的教育机构

切片不是数组&#xff0c;切片可以当作是没有长度的数组。更准确地理解是动态数组&#xff0c;底层实现和java的ArrayList一样是数组列表&#xff0c;底层数组的长度是切片的cap&#xff0c;切片目前拥有的元素数量构成了切片的len属性。当超出cap后&#xff0c;切片会扩容。 …...

重庆建设机电网站/网络推广运营途径

最近在使用GridView做一个小项目&#xff0c;以下是本人使用过程中的个人总结&#xff0c;本文主要总结控件的属性设置&#xff0c;附上图片&#xff0c;给大家一个参考。后续会给大家分享功能实现和使用的小技巧。 GirdControl是数据的容器&#xff0c;它包含多种显示方式&…...

遵义市做网站的地方/风云榜百度

首页 > 新闻中心发布时间&#xff1a;2020-11-06 08:52:49 导读&#xff1a;鲁南新力机床为您提供舟山200吨液压压力机速度,船用液压机的相关知识与详情&#xff1a; 发起大家在苹果的两端太仔细啃摩擦片的纸浆。-液压闸式剪板机从油入口管线2ysis 当液压折弯机迅速下降&…...

java有没有做项目的网站/营销推广有哪些公司

Commons-SCXML 是一个状态机框架&#xff0c; 首先介绍状态机相关的术语。 1、状态机相关术语 1、1状态机 是一种行为&#xff0c;他说明对象在它的生命周期中响应事件所经历的状态序列以及对那些事件的响应。 1、2状态 是指对象的生命周期中的条件或者状况。在此期间对象将…...

深圳网络营销网站建设/百家号权重查询站长工具

https://www.cnblogs.com/lenve/p/11198718.html#4301909转载于:https://www.cnblogs.com/JonaLin/p/11225303.html...