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

Linux内核4.14版本——drm框架分析(1)——drm简介

目录

1. DRM简介(Direct Rendering Manager)

1.1 DRM发展历史

1.2 DRM架构对比FB架构优势

 1.3 DRM图形显示框架

 1.4 DRM图形显示框架涉及元素

1.4.1 DRM Framebuffer

1.4.2 CRTC

1.4.3 Encoder

1.4.4 Connector

1.4.5 Bridge

1.4.6 Panel

1.4.7 Fence

1.4.8 Plane

1.4.9 小结

2. DRM驱动框架

2.1 DRM驱动对象介绍

2.2 DRM抽象硬件如何关联DRM Object

 3. DRM简单示例

3.1 打开DRM设备文件

 3.2 获取显卡资源句柄

3.3  获取connectorId

3.4 创建FrameBuffer

3.5 设置Crtc模式

3.6 资源清理工作

4. libdrm安装

5. 本章小结

6. 参考文件


1. DRM简介(Direct Rendering Manager)

        传统linux显示设备驱动开发时,通常使用FB驱动架构,随着显卡性能升级:显示覆盖(菜单层级)、GPU加速、硬件光标,传统FB架构无法很好支持,此外,对于多应用的访问冲突也无法很好控制。在这样的背景下,DRM应用而生。

        DRM是linux内核中负责与显卡交互的管理架构,用户空间很方便的利用DRM提供的API,实现3D渲染、视频解码和GPU计算等工作。

1.1 DRM发展历史

        (1)1999年,Precision Insight公司首次为 XFree86 4.0 Server 开发 DRI 显示框架,用于更好的适配 3DFX 公司显卡,初版DRM代码产出后,接下来的几年时间里,DRM 所支持的显卡列表不断被扩充。

        (2)2008年10月,Linux kernel 2.6.27 进行了一次重大的源码重组:DRM 的整套源码被放到了/drivers/gpu/drm/目录下,不同的GPU厂商代码也被放到了各自子目录下。

        (3)2014年6月,Atomic API 被添加到Linux 3.16,许多驱动也都转而使用这些新的 API。

        (4)2018年,又有10个基于 atomic 框架的 DRM 新增驱动被添加到Linux kernel。

1.2 DRM架构对比FB架构优势

        DRM是目前Linux的主流图形显示框架,相比于传统FB架构,DRM允许多个程序同时使用视频硬件资源,管理多个程序的资源请求、访问,综上所述DRM更能适应日益更新的显示硬件,DRM优势主要体现:

       (1)DRM原生支持多图层合成,FB原生不支持多层合成。

       (2)FB不支持VSYNC、DMA-BUF、异步更新和fence机制,但DRM原生都支持。

       (3)DRM统一管理GPU和Display驱动,让软件升级、维护和管理更加方便。

 1.3 DRM图形显示框架

        DRM检测到的每个GPU都作为DRM设备,并为之创建一个设备文件/dev/dri/cardX与之连接,从整体架构上来看主要分为3个主要部分:

       (1)libdrm (接口库)

        对底层接口进行封装,向上层提供通用的API接口,主要是对各种IOCTL接口进行封装,便于重用与代码共享。

      (2)KMS (Kernel Mode Setting)

        正常工作时,需要设置显卡或者图形适配器的模式,主要体现在以下两个方面:

        更新画面:显示buffer的切换,多图层的合成方式控制,以及每个图层的显示位置。

        设置显示参数:包括分辨率、刷新率、电源状态(休眠唤醒)等。

      (3)GEM (Graphics Execution Manager)

       提供内存管理方法,主要负责显示buffer的分配和释放。

DRM图形显示框架总览

 1.4 DRM图形显示框架涉及元素

        本章节介绍DRM框架中的一些重点模块的功能与在显示链路中的作用,下图为APP调用DRM到屏幕显示的流程框图。

         下表对DRM中KMS和GEM两个模型的不同组件进行概述性说明,辅以高通平台代码层级的对应关系说明,以加深架构与流程之间的对应联系。

各部分说明:

1.4.1 DRM Framebuffer

        是一块内存区域,可以理解为一块画布,驱动和应用层都能访问它。绘制前需要将它格式化,设定绘制的色彩模式(例如RGB24,YUV 等)和画布的大小(分辨率),不负责显存的分配释放。

1.4.2 CRTC

       阴极摄像管上下文(显示控制器),也可以理解为扫描仪(对显示buffer进行扫描,并产生时序信号(RGB timing)的硬件模块)。CRTC对内连接 Framebuffer 地址,对外连接 Encoder,会扫描 Framebuffer 上的内容,叠加上 Planes 的内容,最后传给Encoder。在 rockchip 平台是 SOC 内部 VOP(部分文档也称为 LCDC)模块的抽象。如图:

0452b6c900ab4c5095cae5e0cbdd67ba.png

83b9ae47158b4486803adc807a9d6f16.png

 注:crtc代码层面的作用:

        1)DPMS (Display Power Manage System) 电源状态管理 (crtc_funcs->dpms)。

        2)将 Framebuffer 转换成标准的 LCDC Timing ,其实就是一帧图像刷新的过程(crtc_funs->mode_set)。

       3)帧切换,即在 VBlank 消影期间,切换 Framebuffer(crtc_funcs->page_flip)。

       4)gamma校正值调整(crtc_funcs->gamma_set)。

1.4.3 Encoder

        编码器/输出转换器,负责将CRTC输出的timing时序转换成外部设备所需要的信号的模块。它的作用就是将内存的 pixel 像素编码(转换)为显示器所需要的信号(因为画面显示到不同的设备(Display Device)上,需要将画面转化为不同的电信号)。如指 RGB、LVDS、DSI、eDP、HDMI、CVBS、VGA 等显示接口。另外 Encoder 和 CRTC 之间的交互就是我们所说的 ModeSetting,其中包含了前面提到的色彩模式、还有时序(Timing)等。

注:Encoder代码层面的作用:

        1)DPMS (Display Power Manage System) 电源状态管理 (encoder_funcs->dpms)

        2)将 VOP 输出的 lcdc Timing 打包转化为对应接口时序 HDMI TMDS / … (encoder_funcs->mode_set)

1.4.4 Connector

        连接器,指 encoder 和 panel 之间交互的接口部分。对应于物理连接器 (例如 VGA, DVI, FPD-Link, HDMI, DisplayPort, S-Video等) ,它不是指物理线,在 DRM中,Connector 是一个抽象的数据结构,代表连接的显示设备,从Connector中可以得到当前物理连接的输出设备相关的信息。

注:Connector代码层面的作用

        1)获取上报 热拔插 Hotplug 状态

        2)读取并解析屏 (Panel) 的 EDID 信息

1.4.5 Bridge

        桥接设备,一般用于注册 encoder 后面另外再接的转换芯片,如 DSI2HDMI 转换芯片。桥接ic所处位置,如图:

2e32dc90c57a459293dd91ea5d235943.png

1.4.6 Panel

        泛指屏,各种LCD, HDMI等显示设备的抽象。用于获取LCD mode参数,并提供LCD休眠唤醒的回调接口,供encoder调用。

1.4.7 Fence

        buffer 同步机制,基于内核 dma_fence 机制实现,用于防止显示内容出现异步问题。

1.4.8 Plane

        硬件图层, 和 Framebuffer 一样是内存地址。在 rockchip 平台是 SOC 内部 VOP(LCDC)模块 win 图层的抽象。一个Plane代表一个image layer, 最终的image由一个或者多个Planes组成。

plane的主要类型:

DRM_PLANE_TYPE_PRIMARY:主要图层,通常用于仅支持RGB格式的简单图层

DRM_PLANE_TYPE_OVERLAY:叠加图层,通常用于YUV格式的视频图层

DRM_PLANE_TYPE_CURSOR:光标图层,一般用于pc系统,用于显示鼠标

1.4.9 小结

实例解析下 CRTC / Encoder / Connector 的行为:

         1)首先 HDMI 驱动检测到电视 Plugin 信号,读出电视的 EDID 信号,获取电视的分辨率信息 (DRM Connector)。

        2)Userspace 将需要显示的数据填充在 framebuffer 里面,然后通过 libdrm 接口通知 VOP 设备开始显示。

        3)接着 VOP 驱动将 framebuffer 里面的数据转换成标准的 LCDC Timing 时序 (DRM CRTC)。

        4)同时 HDMI 驱动将 HDMI 硬件模块的 LCDC 时序配置与 VOP 输出时序一致,准备将输入的 LCDC Timing 转化为电视识别的 HDMI TMDS 信号 (DRM Encoder)。

名词解释:

        DRI:Direct Rendering Infrastructure,直接访问硬件接口

        EDID:Extended Display Identification Data,扩展显示标识数据,共有128字节。其中包含有关显示器及其性能的参数,包括供应商信息、最大图像大小、颜色设置、厂商预设置、频率范围的限制以及显示器名和序列号的字符串。

        DDC:Display Data Channel,显示数据通道,顾名思义,它是一个通道,DDC是用来传送EDID信息的。EDID信息包含了显示器需要的128字节,128个字节的附加块可以存储在初始的EDID块之后的EDID扩展块VDIF,这些块包含addtional具体的时序信息。

2. DRM驱动框架

2.1 DRM驱动对象介绍

        DRM内部的Objects是组成DRM框架的核心,下图中蓝色部分为物理硬件的抽象,棕色部分则为软件的抽象,其中GEM结构体为:drm_gem_object,其余部分位于结构体drm_mode_object中.

        PS:drm_panel不属于object范畴,只是为了降低LCD驱动与encoder驱动间的耦合,是一堆回调函数集合。

         如图所属,drm将显示部分抽象出了framebuffer、plane、crtc、encoder、connector五部分。

        (1)在同一时刻,一个framebuffer与一个plane动态绑定。

        (2)在同一时刻,通常一个或多个plane与一个crtc静态绑定。

        (3)在同一时刻,一个crtc与多个encoder动态绑定。

        (4)在同一时刻,通常一个encoder与一个connector静态绑定。

2.2 DRM抽象硬件如何关联DRM Object

        DRM的objects并不难理解,重要的是如何将实际的硬件与这些object进行关联,下面会以MIPI DSI接口为例进行介绍软件架构与DRM object的对应关系。

 

 其中组件说明:

 3. DRM简单示例

        DRM代码非常庞大,显卡逻辑也非常复杂,在学习DRM架构时,需要通过实践对DRM的流程进行理解,以达到事半功倍的效果。

        下面会以模式设置案例,对DRM架构的流程进行解析。modeset主要流程如下:

图3.1 DRM Modeset流程总览

3.1 打开DRM设备文件

         DRM框架成功加载后,会创建一个设备文件/dev/dri/card0,上层用户应用可以通过该文件节点,获取显卡的各种操作。

 3.2 获取显卡资源句柄

       打开DRM设备文件后,通过以下函数获取显卡的资源句柄,进而进行显卡资源的操作。

3.3  获取connectorId

        获取了drmModeRes后,获取它的连接对象。

3.4 创建FrameBuffer

        创建FrameBuffer后,然后映射一片内存,对这块内存进行像素数据填充.

3.5 设置Crtc模式

         FB创建成功并进行清0操作,可以在里面填充任何数据,然后设置CRTC后,FB的内容就可以显示在屏幕。

        CRTC模式设置函数:drmModeSetCrtc(),参数为:fd、crtc句柄、FB句柄、X\Y坐标等。

3.6 资源清理工作

        显示完成后,GUI会一直运行,一般不必实施资源清理工作。

4. libdrm安装

 libdrm下载链接:Index of /libdrm

参考:LIBDRM使用_linux_dafei的博客-CSDN博客

5. 本章小结

        本文介绍了DRM架构的发展历史、驱动框架以及简单示例,旨在帮助读者了解DRM架构的形成、功能流程实现,DRM代码庞大且复杂,想要深入理解它的内涵,最好的办法就是根据实际需求来进行代码流程梳理,后续章节也会对该部分进行展开讲解。

         此外,DRM架构符合功能日益强大的现代显示设备,但仍有很多老的设备以及软件需要FB支持,在目前DRM框架中,会存在模拟FB设备的代码,参见drivers/gpu/drm/xxx/drv.c文件,会在设备目录下出现:/dev/fb0 。

6. 参考文件

7. DRM图形显示框架 — [野火]嵌入式Linux驱动开发实战指南——基于STM32MP157开发板 文档

深入讲解DRM架构介绍(一)_Linux内核站的博客-CSDN博客_drm框架

Android 图形系统(3)---- DRM 显示框架初步 - 简书

linux驱动系列学习之DRM(十)-易微帮

LCD DRM驱动框架分析一_drmmodesetcrtc_沉沦者的博客-CSDN博客

DRM 驱动程序开发(开篇)_何小龙的博客-CSDN博客

相关文章:

Linux内核4.14版本——drm框架分析(1)——drm简介

目录 1. DRM简介(Direct Rendering Manager) 1.1 DRM发展历史 1.2 DRM架构对比FB架构优势 1.3 DRM图形显示框架 1.4 DRM图形显示框架涉及元素 1.4.1 DRM Framebuffer 1.4.2 CRTC 1.4.3 Encoder 1.4.4 Connector 1.4.5 Bridge 1.4.6 Panel 1.4.…...

Google的一道经典面试题 - 767. 重构字符串

文章目录Google的一道经典面试题 - 767. 重构字符串767. 重构字符串1054. 距离相等的条形码结论Google的一道经典面试题 - 767. 重构字符串 767. 重构字符串 题目链接:767. 重构字符串 题目大意:给定一个字符串 s ,检查是否能重新排布其中的…...

E8-公共选择框相关的表

起因 昨天同事和我说,要在一个表单里加一组可选项。于是我去了公共选择框维护。这时候才发了这么个问题,前几天我在本机的测试环境里做的流程,导入到我们的生产环境里,表单里所用到的共公选择框的选项都在,在表单里是…...

再学C语言41:变长数组(VLA)

处理二维数组的函数&#xff1a;数组的行可以在函数调用时传递&#xff0c;但是数组的列只能被预置在函数内部 示例代码&#xff1a; #define COLS 4 int sum(int arr[][COLS], int rows) {int r;int c;int temp 0;for(r 0; r < rows; r){for(c 0; c < COLS; c){tem…...

物联网WEB大屏数据可视化

最近了解WEB大屏显示。一般像嵌入式这类的&#xff0c;MQTT协议会走的多一些&#xff0c;走订阅和发布的策略&#xff0c;网上走了一圈之后&#xff0c;目前有几个实现方案。这里对比一下几个物联网协议&#xff0c;相对而言MQTT更合适物联网&#xff0c;其它几个协议不是干这个…...

新:DlhSoft Gantt Chart for WPF Crack

用于 Silverlight/WPF 4.3.48 的 DlhSoft 甘特图灯光库 改进甘特图、网络图和 PERT 图表组件的 PERT 关键路径算法。2023 年 3 月 2 日 - 17:09新版本特征 改进了甘特图、网络图和 PERT 图表组件的 PERT 关键路径算法。Silverlight/WPF 标准版的 DlhSoft 甘特图灯光库 DlhSoft …...

C++基础(一)—— C++概述、C++对C的扩展(作用域、struct类型、引用、内联函数、函数默认参数、函数占位参数、函数重载)

1. C概述1.1 c简介“c”中的来自于c语言中的递增运算符&#xff0c;该运算符将变量加1。c起初也叫”c withclsss”.通过名称表明&#xff0c;c是对C的扩展&#xff0c;因此c是c语言的超集&#xff0c;这意味着任何有效的c程序都是有效的c程序。c程序可以使用已有的c程序库。为什…...

Rust学习总结之if,while,loop,for使用

目录 一&#xff1a;if的使用 二&#xff1a;while的使用 三&#xff1a;loop的使用 四&#xff1a;for的使用 本文总结的四种语句&#xff08;if&#xff0c;while&#xff0c;loop&#xff0c;for&#xff09;除了loop&#xff0c;其他的三个在C语言或者Python中都是常见…...

Java知识复习(十一)RabbitMQ

1、RabbitMQ简介 RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff09;的消息中间件 2、RabbitMQ核心概念 RabbitMQ 整体上是一个生产者与消费者模型&#xff0c;主要负责接收、存储和转发消息 3、Producer和…...

thinkphp图片压缩类

<?php namespace app\lib; /** * 图片压缩类&#xff1a;通过缩放来压缩。 * 如果要保持源图比例&#xff0c;把参数$percent保持为1即可。 * 即使原比例压缩&#xff0c;也可大幅度缩小。数码相机4M图片。也可以缩为700KB左右。如果缩小比例&#xff0c;则体积会更小。…...

如何将图数据库应用于电影智能推荐

导读 电影&#xff0c;是一种结合视觉与听觉的现代艺术。如今&#xff0c;电影已不单是人们娱乐消遣的生活方式&#xff0c;也逐渐成为国家文化软实力的重要标志之一。据有关数据统计&#xff0c;2021年中国影视行业市场规模达2349亿元&#xff0c;同比增长23.2%&#xff0c;预…...

CSS实现动画效果的菜单收起展开图标,html实现动画效果的箭头

效果 实现代码 此处JS代码引入了jquery <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><style>.menu-icon{position: absolute;left: 20%;top: 30%;transition: all .3s;}.menu-icon:before, .menu…...

大数据平台小结

搭建大数据平台启动流程1、启动Nginx服务&#xff08;在bdp-web-mysql服务中&#xff09;cd /usr/local/nginx/# 启动Nginx ./sbin/nginx# 查看端口是否存在 netstat -tunlp|grep 200012、启动zookeeper&#xff08;在bdp-executor-realtime123&#xff09;cd /app/bdp/apache-…...

力扣-139单词拆分

力扣-139单词拆分 1、题目 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s "…...

图机器学习-图神经网络

图神经网络 前面讲了图机器学习的一些传统方法&#xff0c;现在正式进入到课程的核心部分&#xff1a;图神经网络。 Design of GNN 那么图神经网络和我们之前接触的一些深度神经网络有什么不同呢&#xff1f; 对于别的类型的神经网络&#xff0c;往往我们都是处理一些类似网…...

配置Airbyte资源限制

资源限制有三种不同的级别配置&#xff1a;Instance-wide - 应用到Airbyte实例创建的Sync Job的所有容器上。Connector-specific - 应用到Airbyte实例创建的Sync Job的所有指定类型连接器的容器上Connection-specific - 应用到Airbyte实例创建的Sync Job的所有指定管道的容器上…...

python实现PCA降维画分类散点图并标出95%的置信区间

此代码以数据集鸢尾花为例&#xff0c;对其使用PCA降维后&#xff0c;绘制了三个类别的样本点和对应的置信圆&#xff08;即椭圆&#xff09;。先放效果图。 下面是完整代码&#xff1a; from matplotlib.patches import Ellipsedef plot_point_cov(points, nstd3, axNone, **…...

Mysql高级之索引结构详解

Mysql的索引详解1.索引定义2.索引结构2.1数据结构分析2.1.1熟知的数据结构2.1.2分析为什么这么多的数据结构不全适用于索引结构2.2Hash结构2.3B tree结构3.索引分类3.1聚集索引&#xff08;聚簇索引&#xff09;3.2非聚集索引&#xff08;稀疏索引&#xff09;3.3联合索引3.4主…...

【线程-J.U.C】

Lock J.U.C最核心组件&#xff0c;Lock接口出现之前&#xff0c;多线程的并发安全只能由synchronized处理&#xff0c;但java5之后&#xff0c;Lock的出现可以解决synchronized的短板&#xff0c;更加灵活。 Lock本质上是一个接口&#xff0c;定义了释放锁&#xff08;unlock&…...

docker布署spring boot jar包项目

目录docker 安装创建目录制作镜像启动容器查看日志docker 安装 Docker安装、详解与部署 创建目录 服务器中创建一个目录&#xff0c;存放项目jar包和Dockerfile 文件 mkdir /目录位置创建目录后创建Dockerfile文件&#xff0c;上传jar包到同一目录下 创建dockerfile vim Doc…...

极简Vue3教程--Pinia状态管理

Pinia&#xff08;发音为/piːnjʌ/&#xff0c;如英语中的“peenya”&#xff09;是最接近pia&#xff08;西班牙语中的菠萝&#xff09;的词&#xff1b;Pinia开始于大概2019年&#xff0c;最初是作为一个实验为Vue重新设计状态管理&#xff0c;让它用起来像组合式API&#x…...

常用的map转bean互转方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 常用的map转bean互转方法一、hutool工具类二、fastjson工具类三、beanutils_BeanUtils工具类 不太好用四、cglib BeanMap工具类 不太好用五、reflect 反射来玩 不太好玩六、I…...

2.4G收发一体芯片NRF24L01P跟国产软硬件兼容 SI24R1对比

超低功耗高性能 2.4GHz GFSK 无线收发器芯片Si24R1&#xff0c;软硬件兼容NRF24L01P. Si24R1 是一颗工作在 2.4GHz ISM 频段&#xff0c;专为低功耗无线场合设计&#xff0c;集成嵌入式ARQ 基带协议引擎的无线收发器芯片。工作频率范围为 2400MHz-2525MHz&#xff0c;共有 126个…...

设计模式之七大原则(一)——单一职责原则、开放-关闭原则

目录一、设计模式的目的二、设计模式的七大原则1.单一职责原则2.开放-关闭原则一、设计模式的目的 设计模式的目的是为了提高代码重用性、可读性、可扩展性、可靠性&#xff0c;使得程序呈现出高内聚、低耦合的特性。 代码重用性&#xff08;相同功能的代码&#xff0c;不用多…...

C++ set、unordered_set、multiset它们之间的区别与一些使用方法(不断更新)

set、unordered_set、multiset是什么&#xff1f;以及它们之间的区别 首先&#xff0c;它们三个都是C标准库提供的关联容器中的一种。只不过set、multiset容器是有序的&#xff0c;而unordered_set容器是无序的 std::set 是 C 标准库中的一个容器&#xff0c;其存储的元素按设…...

hadoop调优

hadoop调优 1 HDFS核心参数 1.1 NameNode内存生产配置 1.1.1 NameNode内存计算 每个文件块大概占用150byte&#xff0c;如果一台服务器128G&#xff0c;能存储的文件块如下 128 (G)* 1024(MB) * 1024(KB) * 1024(Byte) / 150 Byte 9.1 亿 1.1.2 Hadoop2.x 在Hadoop2.x中…...

EM@三角函数诱导公式

文章目录诱导公式单位圆坐标和三角函数记忆口诀符号看象限奇变偶不变例常用诱导公式&#x1f388;常用部分(5对)倒数关系六种三角函数间的转换关系小结ReflectionsShifts and periodicity诱导公式 诱导公式 - 维基百科&#xff0c;自由的百科全书 (wikipedia.org) 单位圆坐标…...

是不是只能学IT互联网技术才有发展前途?

当然不是&#xff0c;三百六十行&#xff0c;行行出状元。 但我们需要认清一个现实是&#xff0c;我们正处于一个信息爆炸的时代&#xff0c;掌握紧跟潮流的技术&#xff0c;才可以让我们更自信地面对每天的生活&#xff0c;才有多余的精力、财力来享受生活。“人生在世&#…...

Linux 进程:exit和_exit的辨析

目录1.接口与函数2.缓冲区3.exit 与 _exit(1)_exit(2)exit这里来认识exit函数和 _exit接口 &#xff0c;它们的作用是类似的&#xff0c;都是在调用后退出程序&#xff0c;可以在程序的任何地方调用。 1.接口与函数 exit函数和_exit接口&#xff0c;一个函数&#xff0c;一个…...

智能电子标签——商超版价签

2.1英寸TFT黑白电子价签 ★ 快速变价&#xff0c;高效运营 ★ 市场实用&#xff0c;布局物联网未来 ★ 更好客户体验 ★ 降低系统成本&#xff0c;具备竞争力 ★ 2.1英寸黑白红电子价签 ★ 电池低能耗&#xff0c;常规使用三年 ★ 穿透力强不慣障碍 ★ 2.4G载波&#x…...

深圳企业公司做网站/广州网站推广软件

实验模式&#xff1a; 这张图是我做想要做链路聚合&#xff0c;但是在链路聚合实验中&#xff0c;出现了点儿小小小的问题&#xff0c;介于篇幅太长&#xff0c;所以单独把问题抛出来&#xff1b; &#xff08;在这里我们不讨论关于生成树的问题&#xff0c;因为默认为我都掌握…...

木屋网站建设/域名注册网站查询

Time Limit: 3 second Memory Limit: 2 MB 【问题描述】 “循环数”指那些不包括数字0的没有重复数字的整数(比如81362)&#xff0c;并且同时具有一个有趣的性质, 就像 这个例子: 如果你从最左边的数字开始 (在这个例子中是8) 数从左边这个数字到右边 (如果数到了最右边,回 到最…...

房屋产权地址备案在那个网站做/企业培训公司有哪些

第一次观看我文章的朋友&#xff0c;可以关注、点赞、转发一下&#xff0c;每天分享各种干货技术和程序猿趣事 前言 职场的金三银四跳槽季又来了&#xff0c;不同的是今年比往年「冷」一些&#xff0c;形式更加严峻一些&#xff0c;大家多多少少可能都听到或看到一些信息&…...

关于网站建设的大学/关键词网络推广企业

请简述赋值&#xff0c; 深拷贝和浅拷贝的区别?(python中如何拷贝一个对象?)直接赋值(li1 li): 只传递对象的引用&#xff0c; li1指向对象li的内存地址空间,因此&#xff0c; 原有列表li改变&#xff0c; 被赋值的li1也会做相应的改变.浅拷贝:li和li2的内存地址不同,但是子…...

用vs2012做网站首页/站长工具忘忧草

iOS 10正式版定于9月13日推送&#xff0c;目前GM版已经可以下载。现在&#xff0c;苹果正式关闭了iOS 9.3.4的认证&#xff0c;这意味着iOS 9.3.5将不能再降级。目前iOS 9.3.4并不能越狱&#xff08;需9.3.3以下&#xff09;&#xff0c;而且存在所谓iOS史上最大的一个远程执行…...

如何给自己的网站做seo/深圳网站设计制作

此篇算是对http://www.cnblogs.com/insus/archive/2012/04/17/2454620.html重构升级。因为网友需要不但能禁用还能可以启用DropDownList的Items。为了不想用户写太多代码。Insus.NET写了一个类别&#xff0c;并让它继承了System.Web.UI.WebControls命名空间下的DropDownList. 可…...