全志R128使用SPI驱动ST7789V1.47寸LCD

R128 平台提供了 SPI DBI 的 SPI TFT 接口,具有如下特点:

  • Supports DBI Type C 3 Line/4 Line Interface Mode
  • Supports 2 Data Lane Interface Mode
  • Supports data source from CPU or DMA
  • Supports RGB111/444/565/666/888 video format
  • Maximum resolution of RGB666 240 x 320@30Hz with single data lane
  • Maximum resolution of RGB888 240 x 320@60Hz or 320 x 480@30Hz with dual data lane
  • Supports tearing effect
  • Supports software flexible control video frame rate

同时,提供了 SPILCD 驱动框架以供 SPI 屏幕使用。

此次适配的SPI屏为 ZJY147S0800TG01,使用的是 SPI 进行驱动。

image-20231023091543023

引脚配置如下:

R128 DevkitTFT 模块
PA12CS
PA13SCL
PA18SDA
PA9BLK
PA20RES
PA19DC
3V3VCC
GNDGND

载入方案

我们使用的开发板是 R128-Devkit,需要开发 C906 核心的应用程序,所以载入方案选择 r128s2_module_c906

$ source envsetup.sh 
$ lunch_rtos 1

image-20230802110150203

设置 SPI 驱动

屏幕使用的是SPI驱动,所以需要勾选SPI驱动,运行 mrtos_menuconfig 进入配置页面。前往下列地址找到 SPI Devices

Drivers Options  --->soc related device drivers  --->SPI Devices --->-*- enable spi driver

image-20230825144134701

配置 SPI 引脚

打开你喜欢的编辑器,修改文件:board/r128s2/module/configs/sys_config.fex,在这里我们不需要用到 SPI HOLD与SPI WP引脚,注释掉即可。

;----------------------------------------------------------------------------------
;SPI controller configuration
;----------------------------------------------------------------------------------
;Please config spi in dts
[spi1]
spi1_used       = 1
spi1_cs_number  = 1
spi1_cs_bitmap  = 1
spi1_cs0        = port:PA12<6><0><3><default>
spi1_sclk       = port:PA13<6><0><3><default>
spi1_mosi       = port:PA18<6><0><3><default>
spi1_miso       = port:PA21<6><0><3><default>
;spi1_hold       = port:PA19<6><0><2><default>
;spi1_wp         = port:PA20<6><0><2><default>

image-20230825144205551

设置 PWM 驱动

屏幕背光使用的是PWM驱动,所以需要勾选PWM驱动,运行 mrtos_menuconfig 进入配置页面。前往下列地址找到 PWM Devices

Drivers Options  --->soc related device drivers  --->PWM Devices --->-*- enable pwm driver

image-20230825144408144

配置 PWM 引脚

打开你喜欢的编辑器,修改文件:board/r128s2/module/configs/sys_config.fex,增加 PWM1 节点

[pwm1]
pwm_used        = 1
pwm_positive    = port:PA9<4><0><3><default>

image-20230825150128954

设置 SPI LCD 驱动

SPI LCD 由专门的驱动管理。运行 mrtos_menuconfig 进入配置页面。前往下列地址找到 SPILCD Devices ,注意同时勾选 spilcd hal APIs test 方便测试使用。

Drivers Options  --->soc related device drivers  --->[*] DISP Driver Support(spi_lcd)[*]   spilcd hal APIs test

image-20230825150341879

编写 SPI LCD 显示屏驱动

获取屏幕初始化序列

首先询问屏厂提供驱动源码

image-20231023094633231

找到 LCD 的初始化序列代码

image-20231017103842527

找到屏幕初始化的源码

image-20231023094659100

整理后的初始化代码如下:

LCD_WR_REG(0x11);
delay_ms(120);
LCD_WR_REG(0x36);
LCD_WR_DATA8(0x00);LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x33);LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x35);LCD_WR_REG(0xBB);
LCD_WR_DATA8(0x35);LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x2C);LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x01);LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x13);LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x20);LCD_WR_REG(0xC6);
LCD_WR_DATA8(0x0F);LCD_WR_REG(0xD0);
LCD_WR_DATA8(0xA4);
LCD_WR_DATA8(0xA1);LCD_WR_REG(0xD6);
LCD_WR_DATA8(0xA1);LCD_WR_REG(0xE0);
LCD_WR_DATA8(0xF0);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x29);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x3E);
LCD_WR_DATA8(0x38);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x30);LCD_WR_REG(0xE1);
LCD_WR_DATA8(0xF0);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x0A);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0B);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x3E);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x29);
LCD_WR_DATA8(0x32);LCD_WR_REG(0x21);LCD_WR_REG(0x11);
delay_ms(120);
LCD_WR_REG(0x29);

用现成驱动改写 SPI LCD 驱动

选择一个现成的 SPI LCD 改写即可,这里选择 nv3029s.c 驱动来修改

image-20231017104714827

复制这两个驱动,重命名为 st7789v.c

image-20231017104740060

先编辑 st7789v.h 将 nv3029s 改成 st7789v

image-20231017104851772

#ifndef _ST7789V_H
#define _ST7789V_H#include "panels.h"struct __lcd_panel st7789v_panel;#endif /*End of file*/

编辑 st7789v.c 将 nv3029s 改成 st7789v

image-20231017104942286

编写初始化序列

先删除 static void LCD_panel_init(unsigned int sel) 中的初始化函数。

image-20231017105101421

然后将屏厂提供的初始化序列复制进来

image-20231023095000428

然后按照 spi_lcd 框架的接口改写驱动接口,具体接口如下

屏厂函数SPILCD框架接口
LCD_WR_REGsunxi_lcd_cmd_write
LCD_WR_DATA8sunxi_lcd_para_write
delay_mssunxi_lcd_delay_ms

可以直接进行替换

image-20231023095114146

完成后如下

image-20231023095158411

然后对照屏厂提供的驱动修改 address 函数

image-20231023100959968

做如下修改

static void address(unsigned int sel, int x, int y, int width, int height)
{sunxi_lcd_cmd_write(sel, 0x2A); /* Set coloum address */sunxi_lcd_para_write(sel, (x + 34) >> 8);sunxi_lcd_para_write(sel, (x + 34));sunxi_lcd_para_write(sel, (width + 34) >> 8);sunxi_lcd_para_write(sel, (width + 34));sunxi_lcd_cmd_write(sel, 0x2B); /* Set row address */sunxi_lcd_para_write(sel, y >> 8);sunxi_lcd_para_write(sel, y);sunxi_lcd_para_write(sel, height >> 8);sunxi_lcd_para_write(sel, height);sunxi_lcd_cmd_write(sel, 0x2c);
}

完成驱动如下

#include "st7789v.h"static void LCD_power_on(u32 sel);
static void LCD_power_off(u32 sel);
static void LCD_bl_open(u32 sel);
static void LCD_bl_close(u32 sel);
static void LCD_panel_init(u32 sel);
static void LCD_panel_exit(u32 sel);
#define RESET(s, v) sunxi_lcd_gpio_set_value(s, 0, v)
#define power_en(sel, val) sunxi_lcd_gpio_set_value(sel, 0, val)static struct disp_panel_para info[LCD_FB_MAX];static void address(unsigned int sel, int x, int y, int width, int height)
{sunxi_lcd_cmd_write(sel, 0x2A); /* Set coloum address */sunxi_lcd_para_write(sel, (x + 34) >> 8);sunxi_lcd_para_write(sel, (x + 34));sunxi_lcd_para_write(sel, (width + 34) >> 8);sunxi_lcd_para_write(sel, (width + 34));sunxi_lcd_cmd_write(sel, 0x2B); /* Set row address */sunxi_lcd_para_write(sel, y >> 8);sunxi_lcd_para_write(sel, y);sunxi_lcd_para_write(sel, height >> 8);sunxi_lcd_para_write(sel, height);sunxi_lcd_cmd_write(sel, 0x2c);
}static void LCD_panel_init(unsigned int sel)
{if (bsp_disp_get_panel_info(sel, &info[sel])) {lcd_fb_wrn("get panel info fail!\n");return;}sunxi_lcd_cmd_write(sel, 0x11);sunxi_lcd_delay_ms(120);sunxi_lcd_cmd_write(sel, 0x36);sunxi_lcd_para_write(sel, 0x00);sunxi_lcd_cmd_write(sel, 0x3A);sunxi_lcd_para_write(sel, 0x05);sunxi_lcd_cmd_write(sel, 0xB2);sunxi_lcd_para_write(sel, 0x0C);sunxi_lcd_para_write(sel, 0x0C);sunxi_lcd_para_write(sel, 0x00);sunxi_lcd_para_write(sel, 0x33);sunxi_lcd_para_write(sel, 0x33);sunxi_lcd_cmd_write(sel, 0xB7);sunxi_lcd_para_write(sel, 0x35);sunxi_lcd_cmd_write(sel, 0xBB);sunxi_lcd_para_write(sel, 0x35);sunxi_lcd_cmd_write(sel, 0xC0);sunxi_lcd_para_write(sel, 0x2C);sunxi_lcd_cmd_write(sel, 0xC2);sunxi_lcd_para_write(sel, 0x01);sunxi_lcd_cmd_write(sel, 0xC3);sunxi_lcd_para_write(sel, 0x13);sunxi_lcd_cmd_write(sel, 0xC4);sunxi_lcd_para_write(sel, 0x20);sunxi_lcd_cmd_write(sel, 0xC6);sunxi_lcd_para_write(sel, 0x0F);sunxi_lcd_cmd_write(sel, 0xD0);sunxi_lcd_para_write(sel, 0xA4);sunxi_lcd_para_write(sel, 0xA1);sunxi_lcd_cmd_write(sel, 0xD6);sunxi_lcd_para_write(sel, 0xA1);sunxi_lcd_cmd_write(sel, 0xE0);sunxi_lcd_para_write(sel, 0xF0);sunxi_lcd_para_write(sel, 0x00);sunxi_lcd_para_write(sel, 0x04);sunxi_lcd_para_write(sel, 0x04);sunxi_lcd_para_write(sel, 0x04);sunxi_lcd_para_write(sel, 0x05);sunxi_lcd_para_write(sel, 0x29);sunxi_lcd_para_write(sel, 0x33);sunxi_lcd_para_write(sel, 0x3E);sunxi_lcd_para_write(sel, 0x38);sunxi_lcd_para_write(sel, 0x12);sunxi_lcd_para_write(sel, 0x12);sunxi_lcd_para_write(sel, 0x28);sunxi_lcd_para_write(sel, 0x30);sunxi_lcd_cmd_write(sel, 0xE1);sunxi_lcd_para_write(sel, 0xF0);sunxi_lcd_para_write(sel, 0x07);sunxi_lcd_para_write(sel, 0x0A);sunxi_lcd_para_write(sel, 0x0D);sunxi_lcd_para_write(sel, 0x0B);sunxi_lcd_para_write(sel, 0x07);sunxi_lcd_para_write(sel, 0x28);sunxi_lcd_para_write(sel, 0x33);sunxi_lcd_para_write(sel, 0x3E);sunxi_lcd_para_write(sel, 0x36);sunxi_lcd_para_write(sel, 0x14);sunxi_lcd_para_write(sel, 0x14);sunxi_lcd_para_write(sel, 0x29);sunxi_lcd_para_write(sel, 0x32);sunxi_lcd_cmd_write(sel, 0x21);sunxi_lcd_cmd_write(sel, 0x11);sunxi_lcd_delay_ms(120);sunxi_lcd_cmd_write(sel, 0x29);if (info[sel].lcd_x < info[sel].lcd_y)address(sel, 0, 0, info[sel].lcd_x - 1, info[sel].lcd_y - 1);elseaddress(sel, 0, 0, info[sel].lcd_y - 1, info[sel].lcd_x - 1);
}static void LCD_panel_exit(unsigned int sel)
{sunxi_lcd_cmd_write(sel, 0x28);sunxi_lcd_delay_ms(20);sunxi_lcd_cmd_write(sel, 0x10);sunxi_lcd_delay_ms(20);sunxi_lcd_pin_cfg(sel, 0);
}static s32 LCD_open_flow(u32 sel)
{lcd_fb_here;/* open lcd power, and delay 50ms */LCD_OPEN_FUNC(sel, LCD_power_on, 50);/* open lcd power, than delay 200ms */LCD_OPEN_FUNC(sel, LCD_panel_init, 200);LCD_OPEN_FUNC(sel, lcd_fb_black_screen, 50);/* open lcd backlight, and delay 0ms */LCD_OPEN_FUNC(sel, LCD_bl_open, 0);return 0;
}static s32 LCD_close_flow(u32 sel)
{lcd_fb_here;/* close lcd backlight, and delay 0ms */LCD_CLOSE_FUNC(sel, LCD_bl_close, 50);/* open lcd power, than delay 200ms */LCD_CLOSE_FUNC(sel, LCD_panel_exit, 10);/* close lcd power, and delay 500ms */LCD_CLOSE_FUNC(sel, LCD_power_off, 10);return 0;
}static void LCD_power_on(u32 sel)
{/* config lcd_power pin to open lcd power0 */lcd_fb_here;power_en(sel, 1);sunxi_lcd_power_enable(sel, 0);sunxi_lcd_pin_cfg(sel, 1);RESET(sel, 1);sunxi_lcd_delay_ms(100);RESET(sel, 0);sunxi_lcd_delay_ms(100);RESET(sel, 1);
}static void LCD_power_off(u32 sel)
{lcd_fb_here;/* config lcd_power pin to close lcd power0 */sunxi_lcd_power_disable(sel, 0);power_en(sel, 0);
}static void LCD_bl_open(u32 sel)
{sunxi_lcd_pwm_enable(sel);/* config lcd_bl_en pin to open lcd backlight */sunxi_lcd_backlight_enable(sel);lcd_fb_here;
}static void LCD_bl_close(u32 sel)
{/* config lcd_bl_en pin to close lcd backlight */sunxi_lcd_backlight_disable(sel);sunxi_lcd_pwm_disable(sel);lcd_fb_here;
}/* sel: 0:lcd0; 1:lcd1 */
static s32 LCD_user_defined_func(u32 sel, u32 para1, u32 para2, u32 para3)
{lcd_fb_here;return 0;
}static int lcd_set_var(unsigned int sel, struct fb_info *p_info)
{return 0;
}static int lcd_set_addr_win(unsigned int sel, int x, int y, int width, int height)
{address(sel, x, y, width, height);return 0;
}static int lcd_blank(unsigned int sel, unsigned int en)
{return 0;
}struct __lcd_panel st7789v_panel = {/* panel driver name, must mach the name of lcd_drv_name in sys_config.fex*/.name = "st7789v",.func = {.cfg_open_flow = LCD_open_flow,.cfg_close_flow = LCD_close_flow,.lcd_user_defined_func = LCD_user_defined_func,.blank = lcd_blank,.set_var = lcd_set_var,.set_addr_win = lcd_set_addr_win,},
};

对接驱动框架

完成了屏幕驱动的编写,接下来需要对接到 SPILCD 驱动框架。首先编辑 Kconfig

image-20231017105738155

增加 st7789v 的配置

image-20231017105814814

config LCD_SUPPORT_ST7789Vbool "LCD support st7789v panel"default n---help---If you want to support st7789v panel for display driver, select it.

然后编辑 panels.c 在 panel_array 里增加 st7789 驱动的引用

image-20231017105948156

如下图

image-20231017105919628

#ifdef CONFIG_LCD_SUPPORT_ST7789V&st7789v_panel,
#endif

之后编辑 panels.h 同样增加引用

image-20231017110043805

如下图

image-20231017110122397

#ifdef CONFIG_LCD_SUPPORT_ST7789V
extern struct __lcd_panel st7789v_panel;
#endif

最后编辑外层的 Makefile 增加编译选项

image-20231017110204681

如下所示

image-20231017110242997

obj-${CONFIG_LCD_SUPPORT_ST7789V} += panels/st7789v.o

选择 ST7789V 驱动

在 SPILCD 驱动选择界面可以看到 LCD_FB panels select 选择 SPI 屏幕的驱动

进入 LCD_FB panels select 选项

image-20230825150812435

选择并勾选 [*] LCD support st7789v panel

image-20231017110344277

配置 SPI LCD 引脚

打开你喜欢的编辑器,修改文件:board/r128s2/module/configs/sys_config.fex

[lcd_fb0]
lcd_used            = 1   
lcd_model_name      = "spilcd"   
lcd_driver_name     = "st7789v" 
lcd_x               = 172   
lcd_y               = 320  
lcd_width           = 17  
lcd_height          = 32  
lcd_data_speed      = 50
lcd_pwm_used        = 1
lcd_pwm_ch          = 1
lcd_pwm_freq        = 5000 
lcd_pwm_pol         = 0 
lcd_if              = 0
lcd_pixel_fmt       = 11 
lcd_dbi_fmt         = 2
lcd_dbi_clk_mode    = 1
lcd_dbi_te          = 1
fb_buffer_num       = 2
lcd_dbi_if          = 4
lcd_rgb_order       = 0
lcd_fps             = 60
lcd_spi_bus_num     = 1
lcd_frm             = 2
lcd_gamma_en        = 1
lcd_backlight       = 100lcd_power_num       = 0
lcd_gpio_regu_num   = 0
lcd_bl_percent_num  = 0lcd_spi_dc_pin      = port:PA19<1><0><3><0>
;RESET Pin
lcd_gpio_0          = port:PA20<1><0><2><0>

编译打包

运行命令 mp 编译打包,可以看到编译了 st7789v.o

image-20231017111015362

测试

烧录启动之后,屏幕背光启动,但是屏幕全黑。

image-20231023101653067

输入 test_spilcd ,屏幕显示黄色。

image-20231023101719108

image-20231023101636223

输入 lv_examples 1 可以显示 lvgl 界面

image-20231023101800720

常见问题

LVGL 出现 DMA Over Size

image-20231023101154351

这是由于 LVGL 配置的 LV_COLOR_DEPTH 为 32,但是 SPI 屏配置为16位。请修改 lv_conf.h

image-20231023101317634

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/590955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源在线客服系统源码全端通吃:聊天记录云端实时保存 附带完整的搭建教程

随着互联网的普及和消费者对客户服务体验的要求提高&#xff0c;传统的电话客服已经不能满足用户的需求。企业需要一个更加便捷、高效、实时的在线客服系统来提供更好的客户服务。然而&#xff0c;市场上的许多在线客服系统要么功能不全&#xff0c;要么价格昂贵。在这种情况下…

jsp结合servlet

servlet配置 环境配置2023.12.31 idea配置搭建 创建一个普通的java项目 由于新版idea去除了add framework support的ui显示&#xff0c;可以在左边项目栏中使用快捷键shiftk或者setting中搜索add framework support在修改对应的快捷键 点击ok然后应该就是下面这样的结果 这里…

HarmonyOS应用开发-搭建开发环境

本文介绍如何搭建 HarmonyOS 应用的开发环境&#xff0c;介绍下载安装 DevEco Studio 开发工具和 SDK 的详细流程。华为鸿蒙 DevEco Studio 是面向全场景的一站式集成开发环境&#xff0c;面向全场景多设备&#xff0c;提供一站式的分布式应用开发平台&#xff0c;支持分布式多…

监控电脑的软件(无感知、无进程、无图标)

当下&#xff0c;电脑监控软件扮演着越来越重要的角色。然而&#xff0c;在探讨这一话题时&#xff0c;我们必须首先明确一个重要的前提&#xff1a;任何未经他人同意的监控行为都是不道德的&#xff0c;并且可能构成违法行为。因此&#xff0c;本文将专注于合法的、经过授权的…

IRQ Handler 的使用——以USART串口接收中断分别在标准库与HAL库版本下的举例

前言&#xff1a; 1.中断系统及EXTI外部中断知识点见我的博文&#xff1a; 9.中断系统、EXTI外部中断_eirq-CSDN博客文章浏览阅读301次&#xff0c;点赞7次&#xff0c;收藏6次。EXTI&#xff08;Extern Interrupt&#xff09;外部中断EXTI可以监测指定GPIO口的电平信号&…

嵌入式视频播放器(mplayer)

1.文件准备&#xff1a; MPlayer-1.0rc2.tar.bz2 libmad-0.15.1b.tar.gz 直接Git到本地 git clone https://gitee.com/zxz_FINE/mplayer_tarball.git 2.文件夹准备&#xff1a; src存放解压后的源码文件&#xff0c;target_Mplayer存放编译安装的目标文件 mkdir src targe…

RK3568平台 Android13 GKI架构开发方式

一.GKI简介 GKI&#xff1a;Generic Kernel Image 通用内核映像。 Android13 GMS和EDLA认证的一个难点是google强制要求要支持GKI。GKI通用内核映像&#xff0c;是google为了解决内核碎片化的问题&#xff0c;而设计的通过提供统一核心内核并将SoC和板级驱动从核心内核移至可加…

008、所有权

所有权可以说是Rust中最为独特的一个功能了。正是所有权概念和相关工具的引入&#xff0c;Rust才能够在没有垃圾回收机制的前提下保障内存安全。 因此&#xff0c;正确地了解所有权概念及其在Rust中的实现方式&#xff0c;对于所有Rust开发者来讲都是十分重要的。在本文中&…

创新技术,助力电力行业:配网故障定位系统的应用与优势

随着科技的不断发展&#xff0c;电力行业也在不断地进行技术创新。在这个过程中&#xff0c;配网故障定位系统作为一种新型的技术手段&#xff0c;为电力行业的安全生产和管理提供了有力的支持。本文将介绍配网行波型故障预警与定位系统的应用与优势&#xff0c;以期为电力行业…

PHP特性知识点扫盲 - 下篇

概述 在实际的生产环境中遇到了实际需要解决的问题&#xff0c;需要把服务部署的方式梳理出来&#xff0c;在同一个服务器中部署多个PHP环境&#xff0c;架构图如下&#xff1a; 架构方案 在工作实践中遇到的很多问题的普遍性都是相通的&#xff0c;公司运行的可新项目都是版…

复盘2023年,让你变强的54句话(句句扎心!)

w关注 ▲晓衡的游戏开发圈▲ 一起共同成长这是晓衡公众号第 525 篇原创分享 罗翔老师说&#xff1a;“我觉得人最大的痛苦&#xff0c;就是无法跨越知道和做到的鸿沟。”最怕问初衷&#xff0c;梦幻成空&#xff0c;年少励志三千里&#xff0c;踌躇百步无寸功&#xff0c;转眼高…

微服务-理论(CAP,一致性协议)

CAP理论 关于CAP理论的介绍可以直接看这篇文章 CAP分别是什么&#xff1f; 一致性&#xff08;Consistency 一致性包括强一致性&#xff0c;弱一致性&#xff0c;最终一致性。 一致性其实是指数据的一致性&#xff0c;为什么数据会不一致呢&#xff1f; 如上面这张图&…

Redis缓存穿透,缓存击穿,缓存雪崩

文章目录 Redis缓存穿透&#xff0c;缓存击穿&#xff0c;缓存雪崩1. 缓存穿透1.1 解决方案1&#xff1a;缓存空数据1.2 解决方案2&#xff1a;使用布隆过滤器1.2.1 布隆过滤器介绍 2. 缓存击穿2.1 解决方案1&#xff1a;互斥锁2.2 解决方案2&#xff1a;逻辑过期 3. 缓存雪崩3…

【漏洞复现】OpenSSH ProxyCommand命令注入漏洞(CVE-2023-51385)

文章目录 前言一、漏洞背景二、漏洞详情三、影响范围四、漏洞验证 前言 OpenSSH存在命令注入漏洞&#xff08;CVE-2023-51385&#xff09;&#xff0c;攻击者可利用该漏洞注入恶意Shell字符导致命令注入。 一、漏洞背景 OpenSSH 是 SSH &#xff08;Secure SHell&#xff09…

Oracle笔记-查看表已使用空间最大空间

目前以Oracle18c为例&#xff0c;主要是查这个表USER_SEGMENTS。 在 Oracle 18c 数据库中&#xff0c;USER_SEGMENTS 是一个系统表&#xff0c;用于存储当前用户&#xff08;当前会话&#xff09;拥有的所有段的信息。段是 Oracle 中分配存储空间的逻辑单位&#xff0c;用于存…

HTTP协议编程实战(二)实战二

使用析构函数主要是在里面关闭套接字&#xff08;socket&#xff09;; waitForReadyRead()里面参数是毫秒&#xff0c;失败返回false; \r\n表示请求头部已经结束了&#xff0c;HTTP/1.1是版本号&#xff0c;200 ok表示请求响应成功 关闭的话就在前面加/

javaScript中的常用事件

文章目录 javaScript中什么是事件&#xff1f;基本原理javaScript中的时间使用1&#xff0c;窗口事件1.1、onblur1.2、onfocus1.3、onload1.4、onresize 2&#xff0c;表单事件2.1、onchange2.2、**oninput**2.3、oninvalid2.4、onselect2.5、onsubmit 3&#xff0c;键盘事件3.…

国科大图像处理2023速通期末——汇总2017-2019

国科大2023.12.28图像处理0854期末重点 图像处理 王伟强 作业 课件 资料 一、填空 一个阴极射线管它的输入与输出满足 s r 2 sr^{2} sr2&#xff0c;这将使得显示系统产生比希望的效果更暗的图像&#xff0c;此时伽马校正通常在信号进入显示器前被进行预处理&#xff0c;令p…

TF-IDF(Term Frequency-Inverse Document Frequency)算法 简介

TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一种用于信息检索和文本挖掘的常用算法。它用于评估一个词对于一个文档集合中某个文档的重要性。 这个算法的基本思想是&#xff1a;如果一个词在一个文档中频繁出现&#xff0c;并且在整个文档集合…

计算机网络第一课

先了解层级&#xff1a; 传输的信息称为协议数据单元&#xff08;PDU&#xff09;&#xff0c;PDU在每个层次的称呼都不同&#xff0c;见下图&#xff1a;