Harmony鸿蒙南向外设驱动开发-LCD

功能简介

LCD(Liquid Crystal Display)驱动编程,通过对显示器上电、初始化显示器驱动IC(Integrated Circuit)内部寄存器等操作,使其可以正常工作。

基于HDF(Hardware Driver Foundation)驱动框架构建的Display驱动模型作用如下:

  • 为LCD器件驱动开发提供了基础驱动框架,提升驱动开发效率。

  • 便于开发的器件驱动实现跨OS、跨芯片平台迁移。

基于HDF驱动框架的Display驱动模型如下所示:

图1 基于HDF驱动框架的Display驱动模型

image

Display驱动模型主要由平台驱动层、芯片平台适配层、LCD器件驱动层三部分组成。驱动模型基于HDF驱动框架开发,通过Platform层和OSAL层提供的接口,屏蔽内核形态的差异,使得器件驱动可以便利的迁移到不同OS及芯片平台。模型向上对接Display公共HAL层,支撑HDI(Hardware Device Interface)接口的实现,通过Display-HDI对图形服务提供各类驱动能力接口。

  • Display平台驱动层:通过HDF提供的IOService数据通道,与公共HAL层对接,集中接收并处理各类上层调用指令。

  • SoC平台驱动适配层:借助此SoC适配层,实现Display驱动和SoC侧驱动解耦,主要完成芯片平台相关的参数配置,并传递平台驱动层的调用到器件驱动层。

  • LCD器件驱动层:在器件驱动层中,主要实现和器件自身强相关的驱动适配接口,例如发送初始化序列、上下电、背光设置等。

基于Display驱动模型开发LCD驱动,可以借助平台提供的各种能力及接口,较大程度的降低器件驱动的开发周期和难度,提升开发效率。

基本概念

LCD接口通常可分为MIPI DSI接口、TTL接口和LVDS接口,常用的是MIPI DSI接口和TTL接口,下面对常用的MIPI DSI接口和TTL接口作简要介绍。

  • MIPI DSI接口

    图2 MIPI DSI接口

    image

    MIPI DSI接口是MIPI(Mobile Industry Processor Interface)联盟定义的显示接口,主要用于移动终端显示屏接口,接口数据传输遵循MIPI协议,MIPI DSI接口为数据接口,传输图像数据,通常情况下MIPI DSI接口的控制信息以MIPI包形式通过MIPI DSI接口发送到对端IC,不需要额外的外设接口。

  • TTL接口

    图3 TTL接口

    image

    ​TTL(Transistor Transistor Logic)即晶体管-晶体管逻辑,TTL电平信号由TTL器件产生,TTL器件是数字集成电路的一大门类,它采用双极型工艺制造,具有高速度、低功耗和品种多等特点。

    TTL接口是并行方式传输数据的接口,有数据信号、时钟信号和控制信号(行同步、帧同步、数据有效信号等),在控制信号控制下完成数据传输。通常TTL接口的LCD,内部寄存器读写需要额外的外设接口,比如SPI接口、I2C接口等。

约束与限制

开发者在进行LCD驱动编程过程中,除了要关注IC的型号,还要关注LCD外围电路设计、基带芯片的LCD接口单元、背光IC的控制等多个方面,同时包括软件的上层程序。这些都是影响开发者在调试LCD驱动的影响因素。

开发指导

场景介绍

LCD驱动模型属于驱动基础适配模块,第三方需要适配OpenHarmony系统时,需要进行LCD驱动适配。LCD驱动适配基于HDF驱动框架、Platform接口及OSAL接口开发,可以做到不区分OS(LiteOS、Linux)和芯片平台(Hi35xx、Hi38xx、V3S等),为LCD器件提供统一的驱动模型。

接口说明

为了能够调整液晶显示屏的各项参数,与display建立显示通道,实现显示器的显示效果,LCD驱动需要通过display :: host注册PanelInfo结构体、接口信息,添加描述设备;LcdResetOn读取的pin脚信息,由SampleEntryInit初始化入口函数,并注册器件驱动接口,供平台驱动调用。

表1 LCD驱动适配所需接口

接口名描述
static int32_t MipiDsiInit(struct PanelInfo *info)适配对应的芯片平台驱动
static int32_t LcdResetOn(void)设置Reset Pin脚状态
int32_t SampleEntryInit(struct HdfDeviceObject *object)器件驱动入口函数

开发步骤

  1. 添加LCD驱动相关的设备描述配置。

  2. 在SoC平台驱动适配层中适配对应的芯片平台驱动。

  3. 添加器件驱动,并在驱动入口函数Init中注册Panel驱动数据,驱动数据接口主要实现下述特性:

    • LCD上下电

      根据LCD硬件连接,使用Platform接口层提供的GPIO操作接口操作对应LCD管脚,例如复位管脚、IOVCC管脚,上电时序参考LCD供应商提供的SPEC。

    • 发送初始化序列

      根据LCD硬件接口,使用Platform接口层提供的I2C、SPI、MIPI等接口,下载LCD初始化序列,初始化参数序列可以参考LCD供应商提供的SPEC。

  4. (可选)根据需求实现HDF框架其他接口。

  5. (可选)根据需求使用HDF框架可创建其他设备节点,用于业务逻辑或者调试功能。

开发实例

以Hi35xx系列芯片为例,根据开发步骤所述,介绍LCD驱动的详细适配过程。

  1. 添加设备描述配置(vendor/bearpi/bearpi_hm_micro/hdf_config/device_info/device_info.hcs)

    /* Display驱动相关的设备描述配置 */
    display :: host {
        hostName = "display_host";
        /* Display平台驱动设备描述 */
        device_hdf_disp :: device {
            device0 :: deviceNode {
                policy = 2;
                priority = 200;
                permission = 0660;
                moduleName = "HDF_DISP";
                serviceName = "hdf_disp";
            }
        }
        /* SoC适配层驱动设备描述 */
        device_hi35xx_disp :: device {
            device0 :: deviceNode {
                policy = 0;
                priority = 199;
                moduleName = "HI351XX_DISP";
            }
        }
        /* LCD器件驱动设备描述 */
        device_lcd :: device {
            device0 :: deviceNode {
                policy = 0;
                priority = 100;
                preload = 0;
                moduleName = "LCD_Sample";
            }
            device1 :: deviceNode {
                policy = 0;
                priority = 100;
                preload = 2;
                moduleName = "LCD_SampleXX";
            }
        }
    }
  2. SoC平台驱动适配层中适配对应的芯片平台驱动(drivers/hdf_core/framework/model/display/driver/adapter_soc/hi35xx_disp.c)

    /* Display驱动适配MIPI等和芯片平台相关的配置 */
    static int32_t MipiDsiInit(struct PanelInfo *info)
    {
        int32_t ret;
        struct DevHandle *mipiHandle = NULL;
        struct MipiCfg cfg;
    
        mipiHandle = MipiDsiOpen(0);
        if (mipiHandle == NULL) {
            HDF_LOGE("%s: MipiDsiOpen failure", __func__);
            return HDF_FAILURE;
        }
        cfg.lane = info->mipi.lane;
        cfg.mode = info->mipi.mode;
        cfg.format = info->mipi.format;
        cfg.burstMode = info->mipi.burstMode;
        cfg.timing.xPixels = info->width;
        cfg.timing.hsaPixels = info->hsw;
        cfg.timing.hbpPixels = info->hbp;
        cfg.timing.hlinePixels = info->width + info->hbp + info->hfp + info->hsw;
        cfg.timing.vsaLines = info->vsw;
        cfg.timing.vbpLines = info->vbp;
        cfg.timing.vfpLines = info->vfp;
        cfg.timing.ylines = info->height;
        /* 0 : no care */
        cfg.timing.edpiCmdSize = 0;
        cfg.pixelClk = CalcPixelClk(info);
        cfg.phyDataRate = CalcDataRate(info);
        /* config mipi device */
        ret = MipiDsiSetCfg(mipiHandle, &cfg);
        if (ret != HDF_SUCCESS) {
            HDF_LOGE("%s:MipiDsiSetCfg failure", __func__);
        }
        MipiDsiClose(mipiHandle);
        HDF_LOGI("%s:pixelClk = %d, phyDataRate = %d\n", __func__,
            cfg.pixelClk, cfg.phyDataRate);
        return ret;
    }
  3. 添加器件

    • 驱动定义相关接口信息(drivers/hdf_core/framework/model/display/driver/panel/mipi_icn9700.c)

      #define RESET_GPIO                5
      #define MIPI_DSI0                 0
      #define BLK_PWM1                  1
      #define PWM_MAX_PERIOD            100000
      /* backlight setting */
      #define MIN_LEVEL                 0
      #define MAX_LEVEL                 255
      #define DEFAULT_LEVEL             100
      #define WIDTH                     480
      #define HEIGHT                    960
      #define HORIZONTAL_BACK_PORCH     20
      #define HORIZONTAL_FRONT_PORCH    20
      #define HORIZONTAL_SYNC_WIDTH     10
      #define VERTICAL_BACK_PORCH       14
      #define VERTICAL_FRONT_PORCH      16
      #define VERTICAL_SYNC_WIDTH       2
      #define FRAME_RATE                60
    • 定义PanelInfo结构体(drivers/hdf_core/framework/model/display/driver/hdf_disp.h)

      struct PanelInfo {
          uint32_t width;	     // 水平尺寸
          uint32_t height;	     // 垂直尺寸
          uint32_t hbp;		     // 水平同步信号的后肩
          uint32_t hfp;		     // 水平同步信号的前肩
          uint32_t hsw;		     // 水平同步信号的脉宽
          uint32_t vbp;		     // 垂直同步信号的后肩
          uint32_t vfp;		     // 垂直同步信号的前肩
          uint32_t vsw;		     // 垂直同步信号的脉宽
          uint32_t frameRate;	     // 帧率
          enum LcdIntfType intfType;  // LCD接口类型
          enum IntfSync intfSync;     // 用户时序参数
          struct MipiDsiDesc mipi;
          struct BlkDesc blk;
          struct PwmCfg pwm;
      };
    • 初始化LCD屏(drivers/hdf_core/framework/model/display/driver/panel/mipi_icn9700.c)

      static uint8_t g_payLoad0[] = { 0xF0, 0x5A, 0x5A };
      static uint8_t g_payLoad1[] = { 0xF1, 0xA5, 0xA5 };
      static uint8_t g_payLoad2[] = { 0xB3, 0x03, 0x03, 0x03, 0x07, 0x05, 0x0D, 0x0F, 0x11, 0x13, 0x09, 0x0B };
      static uint8_t g_payLoad3[] = { 0xB4, 0x03, 0x03, 0x03, 0x06, 0x04, 0x0C, 0x0E, 0x10, 0x12, 0x08, 0x0A };
      static uint8_t g_payLoad4[] = { 0xB0, 0x54, 0x32, 0x23, 0x45, 0x44, 0x44, 0x44, 0x44, 0x60, 0x00, 0x60, 0x1C };
      static uint8_t g_payLoad5[] = { 0xB1, 0x32, 0x84, 0x02, 0x87, 0x12, 0x00, 0x50, 0x1C };
      static uint8_t g_payLoad6[] = { 0xB2, 0x73, 0x09, 0x08 };
      static uint8_t g_payLoad7[] = { 0xB6, 0x5C, 0x5C, 0x05 };
      static uint8_t g_payLoad8[] = { 0xB8, 0x23, 0x41, 0x32, 0x30, 0x03 };
      static uint8_t g_payLoad9[] = { 0xBC, 0xD2, 0x0E, 0x63, 0x63, 0x5A, 0x32, 0x22, 0x14, 0x22, 0x03 };
      static uint8_t g_payLoad10[] = { 0xb7, 0x41 };
      static uint8_t g_payLoad11[] = { 0xC1, 0x0c, 0x10, 0x04, 0x0c, 0x10, 0x04 };
      static uint8_t g_payLoad12[] = { 0xC2, 0x10, 0xE0 };
      static uint8_t g_payLoad13[] = { 0xC3, 0x22, 0x11 };
      static uint8_t g_payLoad14[] = { 0xD0, 0x07, 0xFF };
      static uint8_t g_payLoad15[] = { 0xD2, 0x63, 0x0B, 0x08, 0x88 };
      static uint8_t g_payLoad16[] = { 0xC6, 0x08, 0x15, 0xFF, 0x10, 0x16, 0x80, 0x60 };
      static uint8_t g_payLoad17[] = { 0xc7, 0x04 };
      static uint8_t g_payLoad18[] = {
          0xC8, 0x7C, 0x50, 0x3B, 0x2C, 0x25, 0x16, 0x1C, 0x08, 0x27, 0x2B, 0x2F, 0x52, 0x43, 0x4C, 0x40,
          0x3D, 0x30, 0x1E, 0x06, 0x7C, 0x50, 0x3B, 0x2C, 0x25, 0x16, 0x1C, 0x08, 0x27, 0x2B, 0x2F, 0x52,
          0x43, 0x4C, 0x40, 0x3D, 0x30, 0x1E, 0x06
      };
      static uint8_t g_payLoad19[] = { 0x11 };
      static uint8_t g_payLoad20[] = { 0x29 };
      static DevHandle g_mipiHandle = NULL;
      static DevHandle g_pwmHandle = NULL;
    • 设置Reset Pin脚状态(/drivers_hdf_core/framework/model/display/driver/panel/mipi_icn9700.c)

      static int32_t LcdResetOn(void)
      {
          int32_t ret;
      /*设置管脚方向*/
          ret = GpioSetDir(RESET_GPIO, GPIO_DIR_OUT);
          if (ret != HDF_SUCCESS) {
              HDF_LOGE("GpioSetDir failure, ret:%d", ret);
              return HDF_FAILURE;
          }
      /*写入管脚*/
          ret = GpioWrite(RESET_GPIO, GPIO_VAL_HIGH);
          if (ret != HDF_SUCCESS) {
              HDF_LOGE("GpioWrite failure, ret:%d", ret);
              return HDF_FAILURE;
          }
          /* delay 20ms */
          OsalMSleep(20);
          return HDF_SUCCESS;
      }
    • 器件驱动入口函数(/drivers_hdf_core/framework/model/display/driver/panel/mipi_icn9700.c)

      /*初始化入口函数*/
      int32_t SampleEntryInit(struct HdfDeviceObject *object)
      {
          HDF_LOGI("%s: enter", __func__);
          if (object == NULL) {
              HDF_LOGE("%s: param is null!", __func__);
              return HDF_FAILURE;
          }
          /* 器件驱动接口注册,ops提供给平台驱动调用 */
          if (PanelDataRegister(&g_panelData) != HDF_SUCCESS) {
              HDF_LOGE("%s: PanelDataRegister error!", __func__);
              return HDF_FAILURE;
          }
          return HDF_SUCCESS;
      }
      
      /*实现驱动*/
      struct HdfDriverEntry g_sampleDevEntry = {
          .moduleVersion = 1,
          .moduleName = "LCD_SAMPLE",
          .Init = SampleEntryInit,
      };
      
      HDF_INIT(g_sampleDevEntry);

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

鸿蒙(HarmonyOS NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Axure学习:网站后台导航菜单的制作及对应内容的显示

​不少产品经理主要做的产品是后台系统,在做后台原型的时候对于有些部分的内容存在一些疑惑。 我们的学员也是一样,在做后台的时候遇到了一些问题,请教了老师,得到了解答。这里和大家分享一下,同学们的问题以及解决方…

找到冠军 II

题目: 一场比赛中共有 n 支队伍,按从 0 到 n - 1 编号。每支队伍也是 有向无环图(DAG) 上的一个节点。 给你一个整数 n 和一个下标从 0 开始、长度为 m 的二维整数数组 edges 表示这个有向无环图,其中 edges[i] [u…

SpringBoot碎片化知识

参考资料: java官方词典:https://docs.oracle.com/javase/tutorial/information/glossary.html#F苍穹外卖:https://www.bilibili.com/video/BV1TP411v7v6 JavaBean规范 JavaBean规范是一种类的规范,其要求符合下列条件&#xf…

跟着教程使用腾讯云服务器一步步搭建网站教程,收藏级

使用腾讯云服务器搭建网站全流程,包括轻量应用服务器和云服务器CVM建站教程,轻量可以使用应用镜像一键建站,云服务器CVM可以通过安装宝塔面板的方式来搭建网站,腾讯云服务器网txyfwq.com整理使用腾讯云服务器建站教程,…

【vue】v-model.lazy等(非实时渲染)

v-model&#xff1a;实时渲染v-model.lazy&#xff1a;失去焦点/按回车后&#xff0c;才渲染v-model.number&#xff1a;值转换为数字v-model.trim&#xff1a;去除首尾空格 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…

「JavaEE」初识进程

初识进程 &#x1f349;进程&#x1f34c;操作系统的进程管理 &#x1f349;PCB 重要属性&#x1f34c;进程的身份标识&#x1f34c;内存指针&#x1f34c;文件描述符表&#x1f34c;进程的状态&#x1f34c;优先级&#x1f34c;记账信息&#x1f34c;上下文 &#x1f349;内存…

LongAdder和AtomicLong的对比实验

LongAdder 的核心思想是热点分离&#xff0c;与 ConcurrentHashMap 的设计思想类似&#xff1a;将value值分离成一个数组&#xff0c;当多线程访问时&#xff0c;通过Hash算法将线程映射到数组的一个元素进行操作&#xff1b;而获取最终的value结果时&#xff0c;则将数组的元素…

C++ 之 【类与对象】 从入门到精通一条龙服务 进阶篇(类的6个默认成员函数,构造,析构。。。)

以后把闹钟换成唢呐&#xff0c;醒了就起床&#xff0c;不醒就上天堂 一、类的6个默认成员函数 二、构造函数 1.概念 2.特性 三、析构函数 1.概念 2.特性 四、拷贝构造函数 1.概念 2.特征 五、赋值运算符重载 1.运算符重载 2.赋值运算符重载 3.前置和后置重载 六…

[大模型]Qwen1.5-7B-Chat FastApi 部署调用

Qwen1.5-7B-Chat FastApi 部署调用 环境准备 在 Autodl 平台中租赁一个 3090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8&#xff08;11.3 版本以上的都可以&#xff09;。 接下来打开刚刚租用服务器的 Jupyt…

pom.xml显示灰色并被划线

在使用 IDEA 进行开发的过程中&#xff0c;有时候会遇到 pom.xml 显示灰色并被划线的情况&#xff0c;如下图&#xff1a; 这一般是因为该文件被 Maven 忽略导致的&#xff0c;可以进行如下操作恢复&#xff1a; 设置保存后&#xff0c;可以看到 pom.xml 恢复了正常&#xff1a…

使用 Java 原生或 Hutool 工具包编写非对称加解密的工具类

1、什么是非对称加密 使用一对&#xff08;2个&#xff09;密钥&#xff1a;一个用于加密信息&#xff0c;另一个则用于解密信息。有“公钥&#xff08;Public Key&#xff09;”和“私钥&#xff08;Private Key&#xff09;”之分。 非对称加密的“公钥”和“私钥”是成对出现…

Java 中文官方教程 2022 版(四十九)

原文&#xff1a;docs.oracle.com/javase/tutorial/reallybigindex.html JAXB 示例 原文&#xff1a;docs.oracle.com/javase/tutorial/jaxb/intro/examples.html 以下部分描述如何使用包含在 JAXB RI 捆绑包中的示例应用程序。JAXB RI 捆绑包可从jaxb.java.net获取。下载并安装…

基于OptiTrack跟踪系统和Turtlebot机器人的视觉SLAM定位评估

本文旨在介绍使用OptiTrack光学跟踪系统和Turtlebot机器人进行视觉SLAM定位实验的详细流程&#xff0c;包括实验平台搭建过程、数据处理过程以及SLAM估计评估方法。由于涉及知识较多&#xff0c;部分内容只给出了相关参考博文链接。 1 实验平台搭建 实验平台包括OptiTrack光学…

使用 Meltano 将数据从 Snowflake 导入到 Elasticsearch:开发者之旅

作者&#xff1a;来自 Elastic Dmitrii Burlutskii 在 Elastic 的搜索团队中&#xff0c;我们一直在探索不同的 ETL 工具以及如何利用它们将数据传输到 Elasticsearch&#xff0c;并在传输的数据上实现 AI 助力搜索。今天&#xff0c;我想与大家分享我们与 Meltano 生态系统以及…

Python项目1 外星人入侵_记分

在本章中&#xff0c;我们将结束游戏《外星人入侵》的开发。我们将添加一个Play按钮&#xff0c;用于根据需要启动游戏以及在游戏结束后重启游戏。我们还将修改这个游戏&#xff0c;使其在玩 家的等级提高时加快节奏&#xff0c;并实现一个记分系统。阅读本章后&#xff0c;你将…

2024年【山东省安全员C证】考试资料及山东省安全员C证考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员C证考试资料考前必练&#xff01;安全生产模拟考试一点通每个月更新山东省安全员C证考试试题题目及答案&#xff01;多做几遍&#xff0c;其实通过山东省安全员C证作业模拟考试很简单。 1、【多选题】.设…

【计算机毕业设计】人事管理系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

二叉搜索树--搜索二维矩阵 II

题目描述 编写一个高效的算法来搜索 m * n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,…

Python之旅(一)——常量、变量、动态类型

文章目录 Python背景知识Python用途Python的优缺点Python前景&#xff08;钱景&#xff09; 常量和表达式变量与类型变量的定义变量命名的规则变量的使用变量的类型整数 int浮点数 float字符串布尔其他(暂不介绍&#xff09; 动态类型 标黄部分是和C语言不同的部分Python背景知…

在mysql中如何更新数据呢?

如何更新一条数据&#xff1f; 在 MySQL 中&#xff0c;更新一条数据可以使用 UPDATE 语句。以下是更新一条数据的基本语法&#xff1a; UPDATE table_name SET column1 value1, column2 value2,... WHERE condition;其中&#xff1a; table_name&#xff1a;要更新的表的…
最新文章