OpenHarmony-3.HDF Display子系统(6)
- Display 子系统
1.Display驱动模型介绍
当前操作系统和 SOC 种类繁多,各厂商的显示屏器件也各有不同,随之针对器件的驱动代码也不尽相同,往往是某一款器件驱动,只适用于某单一内核系统或 SOC,如果要迁移到其他内核或者 SOC,可能会有不小的移植工作量。而且,不同驱动 IC 的驱动代码差异较大,产品更换驱动 IC,则又需要重新开发对应的器件驱动,造成重复工作。因此基于 HDF 驱动框架,编写一套较通用的 Display 器件驱动模型,尽可能降低驱动开发者的开发或移植工作量,简化器件驱动开发,提升开发效率。
Display驱动编程,通过对显示器上电、初始化显示器驱动IC(Integrated Circuit)内部寄存器等操作,使其可以正常工作。基于HDF(Hardware Driver Foundation)驱动框架构建的Display驱动模型作用如下:
-
为LCD器件驱动开发提供了基础驱动框架,提升驱动开发效率。
-
便于开发的器件驱动实现跨OS、跨芯片平台迁移。
基于HDF驱动框架的Display驱动模型如下所示:
模型各层设计说明:
-
Display 驱动模型基于 HDF 驱动框架、Platform 接口及 OSAL 接口开发,可以做到不区分OS(LiteOS、Linux)和芯片平台(Hi35xx、Hi38xx、V3S等),为 LCD 器件提供统一的驱动模型。
-
当前 HDF Display 驱动模型主要分为四层:标准架构适配层(DRM Panel Adapter Driver)、显示公共驱动层(Display Common Driver)、芯片平台适配层(SoC Adapter Driver)、器件驱动层(Display Panel Driver)。
1.1.标准架构适配层
- drivers_hdf_core\framework\model\display\driver\hdf_drm_panel.c
本层主要完成对接标准的显示驱动架构,如 DRM(Direct Rending Manager)或 FB(Framebuffer),以 DRM 为例,将 panel 侧驱动接口对接到标准框架中,保证在 DRM 框架中实现对 Panel 驱动的操作接口,当前注册的接口如下:
static struct drm_panel_funcs g_hdfDrmPanelFuncs = {.get_modes = HdfDrmPanelGetModes,.enable = HdfDrmPanelEnable,.disable = HdfDrmPanelDisable,.prepare = HdfDrmPanelPrepare,.unprepare = HdfDrmPanelUnprepare,
};
1.2.显示公共驱动层
- drivers_hdf_core\framework\model\display\driver\hdf_disp.c
此部分属于整个驱动模型的中枢,所有的屏端接口注册、Panel 信息管理、屏幕状态控制、用户态 HDI 接口命令处理、以及通用的基础显示特性,目前都是通过这部分实现。
在本层通过结构体 DispManager 管理所有的显示信息,其成员 PanelManager 用于记录与显示屏相关的接口及参数信息。同时接收并处理 HDI 层直接对 panel 操作相关的指令(主要用于 L0-L1 等轻量级系统),如 Panel 器件信息的获取、休眠唤醒、背光设置等指令。此外,本层还负责实现一些基础显示特性的业务框架,如 ESD 检查机制,力求将显示相关的共有逻辑集中到本层实现,以简化 Panel 器件驱动的实现,避免 panel 驱动中相同功能的重复实现,便于统一管理和维护。
1.3.芯片平台适配层
借助此 SoC 适配层,实现 Display 器件驱动和 SoC 侧硬件资源的解耦,主要完成芯片平台强相关的参数配置,如 mipi 速率计算及设置、管脚复用配置,以及其他和 SoC 强相关的差异化配置及初始化等。
1.4.器件驱动层
- drivers_hdf_core\framework\model\display\driver\panel
器件驱动层主要实现和器件自身强相关的驱动适配接口,例如发送初始化序列、休眠唤醒流程、背光设置、ESD 检测等,同时完成 panel 信息的解析,并将 panel 向上注册到公共驱动层进行管理。
1.5.驱动加载及运行
HDF 的驱动的加载方式,框架通过解析设备描述的 hcs 配置文件,获取到各设备的配置信息,根据 moduleName 来匹配对应设备的驱动文件入口,按照配置的加载优先级,依次加载驱动。
加载流程分为 9 步,分别说明如下:
- HDF Device Manager 解析设备描述;
- HDF 优先加载器件驱动层,构建 Panel 设备;
- 将 panel信息及操作接口注册到公共驱动层;
- HDF 其次加载芯片平台适配层,进行 SoC 相关硬件资源初始化;
- HDF再次加载公共驱动层,对共有特性进行初始化;
- HDF 最后加载标准架构适配层;
- 从公共驱动层中获取到 PanelManager,;
- 将对应panel 注册到 DRM 框架中;
- 在系统运行起来后,DRM 会调用 panel ops 进行显示屏控制。
备注:
对于LiteOS 这种轻量内核的系统,不会像 Linux 内核那样提供标准的显示框架,驱动模型也无法与其对接,因而上层图形系统可以通过 HDI 接口,来直接操控显示屏。
2.LCD接口
LCD接口通常可分为MIPI DSI接口、TTL接口和LVDS接口,常用的是MIPI DSI接口和TTL接口。
-
MIPI DSI接口
MIPI DSI接口是MIPI(Mobile Industry Processor Interface)联盟定义的显示接口,主要用于移动终端显示屏接口,接口数据传输遵循MIPI协议,MIPI DSI接口为数据接口,传输图像数据,通常情况下MIPI DSI接口的控制信息以MIPI包形式通过MIPI DSI接口发送到对端IC,不需要额外的外设接口。
-
TTL接口
TTL接口是并行方式传输数据的接口,有数据信号、时钟信号和控制信号(行同步、帧同步、数据有效信号等),在控制信号控制下完成数据传输。通常TTL接口的LCD,内部寄存器读写需要额外的外设接口,比如SPI接口、I2C接口等。
3.HDF LCD 驱动
3.1.LCD 内核配置
- Kconfig\Makefile
drivers_hdf_core\adapter\khdf\linux\model\display\Kconfig:
config DRIVERS_HDF_DISPbool "Enable HDF Display driver"default ndepends on DRIVERS_HDFhelpAnswer Y to choice HDF Display driver.
config DRIVERS_HDF_LCDKITbool "Enable HDF Lcdkit driver"default ndepends on DRIVERS_HDF_DISPhelpAnswer Y to enable HDF Lcdkit driver.
config DRIVERS_HDF_LCD_ICN9700bool "Enable HDF Icn9700 driver"default ndepends on DRIVERS_HDF_DISPhelpAnswer Y to enable HDF Icn9700 driver.drivers_hdf_core\adapter\khdf\linux\model\display\Makefile:
KHDF_DISPLAY_BASE_ROOT_DIR = ../../../../../../..
DISPLAY_ROOT_DIR = ../../../../../framework/model/display/driverifeq ($(CONFIG_DRIVERS_HDF_DISP), y)
obj-y += \$(DISPLAY_ROOT_DIR)/hdf_disp.o \$(DISPLAY_ROOT_DIR)/backlight/hdf_bl.o#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0))
ifeq ($(CONFIG_ARCH_ROCKCHIP), y)
obj-y += $(DISPLAY_ROOT_DIR)/hdf_drm_panel.o
endif
#endifobj-$(CONFIG_DRIVERS_HDF_PLATFORM_PWM) += \$(DISPLAY_ROOT_DIR)/backlight/pwm_bl.oobj-$(CONFIG_ARCH_SPRD) += \$(DISPLAY_ROOT_DIR)/panel/ili9881c_boe.oobj-$(CONFIG_ARCH_HI3516DV300) += \$(DISPLAY_ROOT_DIR)/adapter_soc/hi35xx_disp.oobj-$(CONFIG_DRIVERS_HDF_LCDKIT) += \$(DISPLAY_ROOT_DIR)/lcdkit/lite_lcdkit.o \$(DISPLAY_ROOT_DIR)/lcdkit/lcdkit_parse_config.o
...ccflags-y += -lm -lc -lgcc \-I$(srctree)/drivers/hdf/framework/model/display/driver \-I$(srctree)/drivers/hdf/framework/model/display/driver/adapter_soc \...
ccflags-y +=-I$(srctree)/bounds_checking_function/includeendif
3.2.LCD 设备配置
- 配置设备描述信息(vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcs)
驱动注册到 HDF 框架所需要的设备驱动描述信息,如驱动是否加载以及加载次序等。device_info.hcs 中的信息主要提供给 HDF 框架使用,包含了 Input 模型各层驱动注册到 HDF 框架所必需的信息,开发者无特殊场景需求无需改动。各驱动层私有配置信息通过**“deviceMatchAttr”字段与 input_config.hcs 中的“match_attr”**相关内容进行匹配。
237 display :: host {
238 hostName = "display_host";
239 device_hdf_drm_panel :: device {
240 device0 :: deviceNode {
241 policy = 0;
242 priority = 197;
243 preload = 0;
244 moduleName = "HDF_DRMPANEL";
245 }
246 }/* Display平台驱动设备描述 */
247 device_hdf_disp :: device {
248 device0 :: deviceNode {
249 policy = 2;
250 priority = 196;
251 permission = 0660;
252 moduleName = "HDF_DISP";
253 serviceName = "hdf_disp";
254 }
255 }/* SOC适配层驱动设备描述 */
256 device_hi35xx_disp :: device {
257 device0 :: deviceNode {
258 policy = 0;
259 priority = 195;
260 moduleName = "HI351XX_DISP";
261 }
262 }/* LCD器件驱动设备描述 */
263 device_lcd :: device {
271 ...
283 device3 :: deviceNode {
284 policy = 0;
285 priority = 100;
286 preload = 0;
287 moduleName = "LCD_ILI9881_ST_5P5";
288 }
289 }
290 device_pwm_bl :: device {
291 device0 :: deviceNode {
292 policy = 0;
293 priority = 95;
294 preload = 0;
295 moduleName = "PWM_BL";
296 deviceMatchAttr = "pwm_bl_dev";
297 }
298 }
299 device_backlight :: device {
300 device0 :: deviceNode {
301 policy = 2;
302 priority = 90;
303 preload = 0;
304 permission = 0660;
305 moduleName = "HDF_BL";
306 serviceName = "hdf_bl";
307 }
308 }
309 }
- .板级配置及器件私有配置(vendor/hihope/rk3568/hdf_config/khdf/lcd/lcd_config.hcs )
1 root {2 backlightConfig {3 pwmBacklightConfig {4 match_attr = "pwm_bl_dev";5 pwmDevNum = 1;6 pwmMaxPeriod = 25000;7 backlightDevName = "hdf_pwm";8 minBrightness = 0;9 defBrightness = 127;10 maxBrightness = 255;11 }12 }13 }
3.3.驱动实现
- 对于LCD类型的设备,公共驱动框架已实现。
drivers_hdf_core\framework\model\display\driver\hdf_drm_panel.cdrivers_hdf_core\framework\model\display\driver\hdf_disp.cdrivers_hdf_core\framework\model\display\driver\backlight\hdf_bl.cdrivers_hdf_core\framework\model\display\driver\backlight\pwm_bl.c
-
适配 ili9881_st_5p5 需要完成器件层驱动初始化、释放资源、注册驱动至HDF框架。
drivers_hdf_core\framework\model\display\driver\panel\ili9881_st_5p5.c
3.3.1.ssp_st7789器件驱动
1).注册到HDF框架
struct HdfDriverEntry PanelDevEntry = {.moduleVersion = 1,.moduleName = "LCD_ILI9881_ST_5P5",.Init = PanelEntryInit,
};HDF_INIT(PanelDevEntry);
2).器件层驱动初始化
struct panel_ili9881_dev {bool power_invert;struct PanelData panel; //重要数据结构struct mipi_dsi_device *dsiDev;struct regulator *supply;struct gpio_desc *enable_gpio;struct gpio_desc *reset_gpio;struct gpio_desc *hpd_gpio;struct panel_hw_delay hw_delay;
};struct PanelData {struct HdfDeviceObject *object;int32_t (*init)(struct PanelData *panel);int32_t (*on)(struct PanelData *panel);int32_t (*off)(struct PanelData *panel);int32_t (*prepare)(struct PanelData *panel);int32_t (*unprepare)(struct PanelData *panel);struct PanelInfo *info;enum PowerStatus powerStatus;struct PanelEsd *esd;struct BacklightDev *blDev;void *priv;
};static int32_t PanelEntryInit(struct HdfDeviceObject *object)
{struct device_node *panelNode = NULL;struct panel_ili9881_dev *panel_dev = NULL;panel_dev = (struct panel_ili9881_dev *)OsalMemCalloc(sizeof(struct panel_ili9881_dev));g_panel_dev = panel_dev;panelNode = of_find_compatible_node(NULL, NULL, "simple-panel-dsi");panel_dev->dsiDev = of_find_mipi_dsi_device_by_node(panelNode);panel_dev->supply = devm_regulator_get(&panel_dev->dsiDev->dev, "power");if (PanelRequestGpio(panel_dev) != HDF_SUCCESS) {goto FAIL;}PanelResInit(panel_dev);panel_dev->panel.object = object;object->priv = panel_dev;if (RegisterPanel(&panel_dev->panel) != HDF_SUCCESS) {...}return HDF_SUCCESS;
}
- 申请struct panel_ili9881_dev结构体,根据"simple-panel-dsi"查找内核设备数节点panelNode;
- 获取plane 供电regulator和gpio 引脚;
- 调用 PanelResInit进行初始化panel结构体;
Panel 操作函数有:panel_dev->panel.init = PanelInit;panel_dev->panel.on = PanelOn;panel_dev->panel.off = PanelOff;panel_dev->panel.prepare = PanelPrepare;panel_dev->panel.unprepare = PanelUnprepare;
- 调用RegisterPanel 注册panel到g_panelManager。
3.3.2. HDF LCD 公共驱动层
3.3.2.1.HDF_DISP
- 结构体
drivers_hdf_core\framework\model\display\driver\hdf_disp.h
struct DispManager {struct PanelManager *panelManager;struct OsalMutex dispMutex;HdfWorkQueue dispWorkQueue;bool initialzed;struct DispEsd *esd;
};struct PanelManager {struct PanelData *panel[PANEL_MAX];uint32_t panelNum;
};
- 初始化及注册驱动至HDF框架
drivers_hdf_core\framework\model\display\driver\hdf_disp.c
struct HdfDriverEntry g_dispDevEntry = {.moduleVersion = 1,.moduleName = "HDF_DISP",.Init = HdfDispEntryInit,.Bind = HdfDispBind,
};HDF_INIT(g_dispDevEntry);
- .Init = HdfDispEntryInit,
DispManagerInit初始化struct DispManager ,将 panelManager 注册到g_dispManager->panelManager,然后创建一个工作队列 HdfWorkQueueInit(&g_dispManager->dispWorkQueue, “dispWQ”); - .Bind = HdfDispBind,
绑定服务HdfDispDispatch,调用DispCmdProcess通过g_dispCmdHandle进行显示命令处理。
static int HdfDispBind(struct HdfDeviceObject *dev)
{if (dev == NULL) {return HDF_FAILURE;}static struct IDeviceIoService dispService = {.object.objectId = 1,.Dispatch = HdfDispDispatch,};dev->service = &dispService;return HDF_SUCCESS;
}DispCmdHandle g_dispCmdHandle[] = {GetPowerStatus,GetInfo,SetPowerStatus,SetBacklight,GetBacklight,
};
3.3.2.2.HDF_DRMPANEL
- 结构体
drivers_hdf_core\framework\model\display\driver\hdf_drm_panel.h
struct HdfDrmPanel {struct drm_panel panel;struct DispManager *manager;struct drm_display_mode mode;struct mipi_dsi_device *dsiDev;uint32_t index;
};
- 初始化及注册驱动至HDF框架
drivers_hdf_core\framework\model\display\driver\hdf_drm_panel.c
struct HdfDriverEntry g_hdfDrmPanelEntry = {.moduleVersion = 1,.moduleName = "HDF_DRMPANEL",.Init = HdfDrmPanelEntryInit,
};
refer to
- https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/driver-peripherals-lcd-des.md
- https://blog.csdn.net/HarmonyOS_666/article/details/140824498?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-140824498-blog-143099522.235%5Ev43%5Epc_blog_bottom_relevance_base2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-140824498-blog-143099522.235%5Ev43%5Epc_blog_bottom_relevance_base2&utm_relevant_index=8
相关文章:
OpenHarmony-3.HDF Display子系统(6)
Display 子系统 1.Display驱动模型介绍 当前操作系统和 SOC 种类繁多,各厂商的显示屏器件也各有不同,随之针对器件的驱动代码也不尽相同,往往是某一款器件驱动,只适用于某单一内核系统或 SOC,如果要迁移到其他内核或者…...
第10章:CSS最佳实践 --[CSS零基础入门]
代码组织 在CSS开发中,良好的代码组织和最佳实践对于项目的可维护性和扩展性至关重要。以下是两个示例,展示了如何遵循CSS最佳实践来组织代码。 示例 1: 使用 BEM(Block Element Modifier)命名法 BEM 是一种用于提高 CSS 可读性…...
备战美赛!2025美赛数学建模C题模拟预测!用于大家练手模拟!
完整的思路代码模型见文末 2025 美赛数学建模 C 题 模拟题:城市交通拥堵指数的预测与管理策略 背景 随着全球城市化进程的加快,交通拥堵问题成为城市发展的重要挑战之一。交通拥堵不仅影响居民出行效率,还增加了能源消耗和碳排放。近年来&…...
ESP8266 Ubuntu 安装
文章参考:https://blog.csdn.net/AUST_129/article/details/119406722文章浏览阅读1.8k次,点赞4次,收藏19次。参考:https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/linux-setup.htmlhttp://aicloud…...
tryhackme-Pre Security-Defensive Security Intro(防御安全简介)
任务一:Introduction to Defensive Security防御安全简介 此room的两个要点: Preventing intrusions from occurring 防止入侵发生Detecting intrusions when they occur and responding properly 检测发生的入侵并正确响应 防御安全还有更多内容。 除上…...
单片机:实现倒计时(附带源码)
使用单片机实现倒计时功能是一个常见的嵌入式应用,它能帮助你更好地理解如何进行时间控制和如何通过定时器实现精确的倒计时。通过该项目,你将学习如何使用单片机的定时器来进行时间计算,并通过LED或LCD显示倒计时的结果。 1. 项目概述 倒计…...
安全防御之可信计算技术
可信计算技术是一种计算机安全体系结构,旨在提高计算机系统在面临各种攻击和威胁时的安全性和保密性。它通过包括硬件加密、受限访问以及计算机系统本身的完整性验证等技术手段,确保计算机系统在各种攻击和威胁下保持高度安全和保密性。 一、可信计算基…...
视频生成缩略图
文章目录 视频生成缩略图使用ffmpeg 视频生成缩略图 最近有个需求,视频上传之后在列表和详情页需要展示缩略图 使用ffmpeg 首先引入jar包 <dependency><groupId>org.bytedeco</groupId><artifactId>javacpp</artifactId><vers…...
PySide6程序框架设计
pyside6有一个优点自动适配高分辨ui pyqt5需要自己写这部分逻辑 1、主程序代码 DINGSHI01Main.py # -*- coding: utf-8 -*- import sys,time,copy from PySide6.QtWidgets import QWidget,QApplication from PySide6.QtCore import Qt from PySide6 import QtCore, QtGui, Q…...
WebSocket入门与结合redis
WebSocket是什么 WebSocket 是一种用于在客户端和服务器之间建立双向通信的协议,它能实现实时、持久的连接。与传统的 HTTP 请求响应模式不同,WebSocket 在建立连接后允许客户端和服务器之间相互发送消息,直到连接关闭。由于 WebSocket 具有…...
锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测,附锂电池最新文章汇集
锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测,附锂电池最新文章汇集 目录 锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测,附锂电池最新文章汇集预测效果基本描述程序设计参考资料 预测效果 基本描述 锂电池SOH预测 | 基于Bi…...
C# 结构体和类
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、类(Class)二、结构体(Struct)示例代码(定义类和结构体)类的继承代码示例(…...
C语言中的内存管理:理解指针、动态内存分配与内存泄漏
在C语言中,内存管理是一个至关重要的主题。与许多高级语言不同,C语言要求程序员显式地管理内存的分配与释放。虽然这种做法提供了更高的灵活性和控制权,但也容易导致内存泄漏、越界访问等问题。正确地管理内存对于编写高效、稳定的C程序至关重…...
web:pc端企业微信登录-vue版
官方文档:developer.work.weixin.qq.com/document/pa… 不需要调用ww.register,直接调用ww.createWWLoginPanel即可创建企业微信登录面板 - 文档 - 企业微信开发者中心 (qq.com) 引入 //通过 npm 引入 npm install wecom/jssdk import * as ww from we…...
GC.2015.四年级
GC.2015.四年级.01.奖励 题目描述 晨晨班主任想奖励班里面的每个学生一只圆珠笔和铅笔,已知每只圆珠笔和铅笔的价格,以及班里面的学生人数n,你能帮助老师算出总价吗? 输入格式 第一行:一个整数n,代表班里…...
一篇文章掌握WebService服务、工作原理、核心组件、主流框架
目录 1、WebService定义 解决问题: 2、WebService的工作原理 2.1 实现一个完整的Web服务包括以下步骤 2.2 调用方式 3、Web Service的核心组件 3.1 XML 3.2 SOAP 3.3 WSDL 3.4 UDDI 4、主流框架 4.1 AXIS(已淘汰) 4.2 XFire 4.3 CXF 5、Soap协议详解…...
中软高科身份证云解码金融(银行)解决方案介绍
多年来,中软高科一直深耕身份证云解码领域,对身份证云解码应用于金融(银行),进行了大量且深入的研究。从长期调研来看,金融(银行)的痛点需求主要有: 传统身份证解码设备…...
Linux NVIDIA GPU linpack 测试
前言 多节点多GPU测试有点坑,这篇文章有解决方法。 环境 操作系统信息 lsb_release -aNo LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammycpu 信息 lscpuArchitecture: x86_64CPU op-mod…...
LiteFlow决策系统的策略模式,顺序、最坏、投票、权重
个人博客:无奈何杨(wnhyang) 个人语雀:wnhyang 共享语雀:在线知识共享 Github:wnhyang - Overview 想必大家都有听过或做过职业和性格测试吧,尤其是现在的毕业生,在投了简历之后经…...
“AI换脸”骗过人脸识别?黑产攻击新手段应如何防御?
在著名美剧《权力的游戏》中,有一个神秘的刺客组织叫“无面者”,这个组织中的人可以通过某种神秘手段切换无数种不同的面孔,实现“一人千面”。 电视剧毕竟魔幻。但如今,基于人工智能的深度合成伪造技术正在让“一人千面”成为现…...
面试题整理6----什么是进程最大数、最大线程数、进程打开的文件数,怎么调整
什么是进程最大数、最大线程数、进程打开的文件数,怎么调整 1. 进程最大数1.1 调整方法: 2. 最大线程数2.1 调整方法: 3. 注意事项 #linux 1. 进程最大数 进程最大数是指操作系统允许同时运行的进程数量上限。这个限制通常由内核参数 ulimi…...
android RadioButton + ViewPager+fragment
RadioGroup viewpage fragment 组合显示导航栏 1、首先主界面的布局控件就是RadioGroup viewpage <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools…...
Zabbix6.0升级为6.4
为了体验一些新的功能,比如 Webhook 和问题抑制等,升级个小版本。 一、环境信息 1. 版本要求 一定要事先查看官方文档,确认组件要求的版本,否则版本过高或者过低都会出现问题。 2. 升级前后信息 环境升级前升级后操作系统CentOS…...
Unity 根据文本宽度自动移动图像位置
游戏中有时候需要变动的显示一个物品的数量,变化的文本宽度不停的变化,这时候需要将物品的icon随着文本的长度而改变位置。 实现思路:使用Content Size Fitter来动态改变内容的大小。 首先建立一个文本组件,添加Content Size Fi…...
spring @Mapper Converter转换泛型异常
spring Mapper Converter转换泛型异常 需要在每个list类型转换上面加Named 注解,否则会影响page生成的类型转换 比如: import org.mapstruct.Mapper; import org.mapstruct.Named;import com.baomidou.mybatisplus.core.metadata.IPage; import com.b…...
如何设计一个秒杀系统
开局一张图 结局要说清 对于设计一个秒杀系统,结合图片分层结构,根据每一层从访问层,负载层,服务层,业务层,支撑层,数据层,详细说明每一层应该怎么设计。 应该注意那些事项。比如访…...
SPL06 基于stm32F103 HAL库驱动(软件模拟IIC)
talk is cheap, show you my code SPL06.c #include "SPL06.h"//*************全局变量*************// Factor_List* b_list; //存储过采样率对应的系数KP,KT COEF_ValueStruct Coefficient { 0 }; //存储校准系数…...
arcgisPro将面要素转成CAD多段线
1、说明:正常使用【导出为CAD】工具,则导出的是CAD三维多线段,无法进行编辑操作、读取面积等。这是因为要素面中包含Z值,导出则为三维多线段数据。需要利用【复制要素】工具禁用M值和Z值,再导出为CAD,则得到…...
Cocos Creator 试玩广告开发
之前主要是使用Unity,这次刚好项目是试玩游戏的开发,所以临时学了Cocos来开发。所以这篇文章,更加关注从Unity转到Cocos开发的经历以及试玩的基本开发。 首先,我是没有使用过Cocos的,也没有接触过Ts语言,对于Ts的开发开…...
【Linux】解锁文件描述符奥秘,高效缓存区的实战技巧
fd和缓冲区 1. 文件描述符fd1.1. 概念与本质1.2. 打开文件的管理1.3. 一切皆文件的理解1.4. 分配规则1.5. 重定向的本质1.5.1. dup2 2. FILE中的缓冲区2.1. 概念2.2. 存在的原因2.3. 类型(刷新方案)2.4. 存放的位置2.4.1. 代码证明、现象解释 2.5. 模拟C标准库中的方法 1. 文件…...
MySQL基础笔记(五)
在此特别感谢尚硅谷-康师傅的MySQL精品教程 获取更好的阅读体验请前往我的博客主站! 如果本文对你的学习有帮助,请多多点赞、评论、收藏,你们的反馈是我更新最大的动力! 约束 1. 约束(constraint)概述 1.1 为什么需要约束 数据完整性&…...
夯实数字技术,培育创新人才:数据科学与大数据技术专业人才培养实践
近年来,得益于全球各国家和地区对大数据产业的政策扶持以及数字经济的蓬勃发展,大数据市场在全球范围内展现出了迅猛的增长态势。国家层面相继出台了诸如《“数据要素 ” 三年行动计划(2024—2026 年)》《数字中国建设整体布局规划…...
Java爬虫大冒险:如何征服1688商品搜索之巅
在这个信息爆炸的时代,数据就是力量。对于电商平台而言,数据更是金矿。今天,我们要踏上一场Java爬虫的冒险之旅,目标是征服1688这个B2B电商巨头,获取按关键字搜索的商品信息。这不仅是技术的挑战,更是智慧的…...
IEC 101/104 中为什么我们需要单点和双点信号
REDISANT 提供互联网与物联网开发测试套件 # 互联网与中间件: Redis AssistantZooKeeper AssistantKafka AssistantRocketMQ AssistantRabbitMQ AssistantPulsar AssistantHBase AssistantNoSql AssistantEtcd AssistantGarnet Assistant 工业与物联网࿱…...
01、NodeJS学习笔记,第一节:Node.js初识与内置模块
一、初识Node.js与内置模块 ##网址 https://nodejs.org##npm包 https://www.npmjs.com/ (搜索)https://registry.npmjs.org/ (下载)1、初识Node.js ##思考:为什么JavaScript可以在浏览器中被执行因为浏览器…...
ElasticSearch 自动补全
1、前言 当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项,根据用户输入的字母,提示完整词条的功能,就是自动补全。 2、安装拼音分词器 Github地址:https://github.com/infinilabs/analysis-pinyin 插件…...
整点(枚举)
Hello!大家好!我是学霸小羊,今天分享一道c枚举题: 题目描述 在二维坐标系, 有一个圆,圆心在(0,0),圆的半径是r。问圆内有多少个整点(所谓的整点就是横坐标和纵坐标都是整数的点)。若点P的横坐标是整数a&a…...
【WRF安装】WRF编译错误:problems building executables look for error in the build log
WRF编译错误 错误内容:problems building executables, look for error in the build log原因1:gcc版本过低安装高版本gcc 原因2:netcdf版本和配置有误原因3:库冲突原因4:export NETCDF_classic1终极手段:重…...
2024年12月陪玩系统-仿东郊到家约玩系统是一种新兴的线上预约线下社交、陪伴系统分享-优雅草央千澈-附带搭建教程
2024年12月陪玩系统-仿东郊到家约玩系统是一种新兴的线上预约线下社交、陪伴系统分享-优雅草央千澈-附带搭建教程 产品介绍 仿东郊到家约玩系统是一种新兴的线上预约,线下社交、陪伴、助娱、助攻、分享、解答、指导等服务模式,范围涉及电竞、运动、音乐…...
社区版 IDEA 开发webapp 配置tomcat
1.安装tomcat 参考Tomcat配置_tomcat怎么配置成功-CSDN博客 2.构建webapp项目结构 新建一个普通项目 然后添加webapp的目录结构: main目录下新建 webapp 文件夹 webapp文件夹下新建WEB_INF文件夹 *WEB_INF目录下新建web.xml wenapp文件夹下再新建index.html …...
IDEA中解决Edit Configurations中没有tomcat Server选项的问题
今天使用IDEA2024专业版的时候,发现Edit Configurations里面没有tomcat Server,最终找到解决方案。 一、解决办法 1、打开Settings 2、搜索tomcat插件 搜索tomcat插件之后,找到tomcat 发现tomcat插件处于未勾选状态,然后我们将其勾选保存即可。 二、结果展示 最后,再次编…...
【Python】主成分分析PCA - 算法、问题与Python实现
【Python】主成分分析PCA - 算法、问题与Python实现 一、PCA 算法简介(一)概念及作用(二)基本原理(三)算法步骤1.数据预处理2.计算协方差矩阵3.进行特征值分解4.选择主成分5.完成数据降维 二、PCA 常见问题…...
Go怎么做性能优化工具篇之pprof
工欲善其事、必先利其器。这次我们来看看Go的性能优化工具有哪些吧 Go性能优化的工具 一、pprof 工具 pprof 是 Go 语言自带的性能分析工具,可以帮助开发者分析程序的 CPU 使用情况、内存使用情况、goroutine 调度情况等,从而定位性能瓶颈。通过 pprof…...
DataOps驱动数据集成创新:Apache DolphinScheduler SeaTunnel on Amazon Web Services
引言 在数字化转型的浪潮中,数据已成为企业最宝贵的资产之一。DataOps作为一种文化、流程和实践的集合,旨在提高数据管道的质量和效率,从而加速数据从源头到消费的过程。白鲸开源科技,作为DataOps领域的领先开源原生公司…...
递归读取指定目录下的文件
序言 需要读取sftp服务器上符合指定的文件名正则的文件列表,目前想到的最好的办法就是递归。 我这里引入的依赖是: <!-- jsch-sftp连接 --><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artif…...
代码随想录算法训练营day46|动态规划part12
今天就结束动态规划章节了,以后还要多加练习。 今天的两道题都很有难度,647回文子串的思路非常巧妙,因为用一维dp数组比较难表示子串的起点和终点,所以需要用二维dp数组表示,dp[i][j]表示以i为起点,j为终点…...
ubuntu 24.04.1安装FTP流程
1、安装vsftpd: sudo apt update sudo apt install vsftpd 2、安装后重启查看vsftpd状态 sudo systemctl status vsftpd 输出如下所示,表明vsftpd服务处于活动状态并正在运行: * vsftpd.service - vsftpd FTP server Loaded: loaded (/…...
【Linux】UDP通信
udp使用的是数据报传输。可以一对一,一对多进行传输,用于快速,实时性高的场景 服务器端: 使用步骤: 1.创建socket 2.bind绑定可接收的客户端 3.while{ recv接收数据 send发送数据 } #include <stdio.h> #inclu…...
日期格式、JSR303校验
日期格式 public class Monster() {DateTimeFormat(pattern "yyyy-MM-dd")private Date birthday; } 输入:2024-11-12, 输出:Monster{birthdaySun Nov 12 00:00:00 CST 2024} public class Monster {JsonFormat(pattern &…...
ELK系列-(六)Redis也能作为消息队列?(上)
一、前文回顾 🔍 在前面的ELK系列中,我们已经搭建了ELK的核心组件,包括: ELK系列-(一)Docker部署ELK核心组件ELK系列-(二)LogStash数据处理的瑞士军刀ELK系列-(三&…...