Harmony鸿蒙南向驱动开发-GPIO接口使用

功能简介

GPIO(General-purpose input/output)即通用型输入输出。通常,GPIO控制器通过分组的方式管理所有GPIO管脚,每组GPIO有一个或多个寄存器与之关联,通过读写寄存器完成对GPIO管脚的操作。

GPIO接口定义了操作GPIO管脚的标准方法集合,包括:

  • 设置、获取管脚方向:方向可以是输入或者输出(暂不支持高阻态)。

  • 读、写管脚电平值:电平值可以是低电平或高电平。

  • 设置、取消管脚中断服务函数:设置一个管脚的中断响应函数,以及中断触发方式。取消一个管脚的中断服务函数。

  • 使能、禁止管脚中断:禁止或使能管脚中断。

基本概念

GPIO又俗称为I/O口,I指的是输入(in),O指的是输出(out)。可以通过软件来控制其输入和输出,即I/O控制。

  • GPIO输入

    输入是检测各个引脚上的电平状态,高电平或者低电平状态。常见的输入模式有:模拟输入、浮空输入、上拉输入、下拉输入。

  • GPIO输出

    输出是当需要控制引脚电平的高低时需要用到输出功能。常见的输出模式有:开漏输出、推挽输出、复用开漏输出、复用推挽输出。

运作机制

在HDF框架中,同类型设备对象较多时(可能同时存在十几个同类型配置器),若采用独立服务模式,则需要配置更多的设备节点,且相关服务会占据更多的内存资源。相反,采用统一服务模式可以使用一个设备服务作为管理器,统一处理所有同类型对象的外部访问(这会在配置文件中有所体现),实现便捷管理和节约资源的目的。GPIO模块接口适配模式采用统一服务模式(如图1所示)。

在统一模式下,所有的控制器都被核心层统一管理,并由核心层统一发布一个服务供接口层,因此这种模式下驱动无需再为每个控制器发布服务。

GPIO模块各分层作用:

  • 接口层提供操作GPIO管脚的标准方法。

  • 核心层主要提供GPIO管脚资源匹配,GPIO管脚控制器的添加、移除以及管理的能力,通过钩子函数与适配层交互,供芯片厂家快速接入HDF框架。

  • 适配层主要是将钩子函数的功能实例化,实现具体的功能。

图 1 GPIO统一服务模式结构图

GPIO统一服务模式结构图

使用指导

场景介绍

GPIO主要是对GPIO管脚资源进行管理。开发者可以使用提供的GPIO操作接口,实现对管脚控制的具体控制。

接口说明

GPIO模块提供的主要接口如表1所示。具体API详见//drivers/hdf_core/framework/include/platform/gpio_if.h。

表 1 GPIO驱动API接口功能介绍

接口名描述
GpioGetByName(const char *gpioName)获取GPIO管脚ID
int32_t GpioRead(uint16_t gpio, uint16_t *val)读GPIO管脚电平值
int32_t GpioWrite(uint16_t gpio, uint16_t val)写GPIO管脚电平值
int32_t GpioGetDir(uint16_t gpio, uint16_t *dir)获取GPIO管脚方向
int32_t GpioSetDir(uint16_t gpio, uint16_t dir)设置GPIO管脚方向
int32_t GpioUnsetIrq(uint16_t gpio, void *arg)取消GPIO管脚对应的中断服务函数
int32_t GpioSetIrq(uint16_t gpio, uint16_t mode, GpioIrqFunc func, void *arg)设置GPIO管脚对应的中断服务函数
int32_t GpioEnableIrq(uint16_t gpio)使能GPIO管脚中断
int32_t GpioDisableIrq(uint16_t gpio)禁止GPIO管脚中断

说明:
本文涉及GPIO的所有接口,支持内核态及用户态使用。

开发步骤

GPIO标准API通过GPIO管脚号来操作指定管脚,使用GPIO的一般流程如图2所示。

图 2 GPIO使用流程图

GPIO使用流程图

确定GPIO管脚号

两种方式获取管脚号:根据SOC芯片规则进行计算、通过管脚别名获取

  • 根据SOC芯片规则进行计算

    不同SOC芯片由于其GPIO控制器型号、参数、以及控制器驱动的不同,GPIO管脚号的换算方式不一样。

    • Hi3516DV300

      控制器管理12组GPIO管脚,每组8个。

      GPIO号 = GPIO组索引 (0~11) * 每组GPIO管脚数(8) + 组内偏移

      举例:GPIO10_3的GPIO号 = 10 * 8 + 3 = 83

    • Hi3518EV300

      控制器管理10组GPIO管脚,每组10个。

      GPIO号 = GPIO组索引 (0~9) * 每组GPIO管脚数(10) + 组内偏移

      举例:GPIO7_3的GPIO管脚号 = 7 * 10 + 3 = 73

  • 通过管脚别名获取

    调用接口GpioGetByName进行获取,入参是该管脚的别名,接口返回值是管脚的全局ID。

    GpioGetByName(const char *gpioName);
设置GPIO管脚方向

在进行GPIO管脚读写前,需要先通过如下函数设置GPIO管脚方向:

int32_t GpioSetDir(uint16_t gpio, uint16_t dir);

表 2 GpioSetDir参数和返回值描述

参数参数描述
gpiouint16_t类型,GPIO管脚号
diruint16_t类型,待设置的方向值
返回值返回值描述
HDF_SUCCESS设置GPIO管脚方向成功
负数设置GPIO管脚方向失败

假设需要将GPIO管脚3的方向配置为输出,其使用示例如下:

int32_t ret;ret = GpioSetDir(3, GPIO_DIR_OUT);    // 将3号GPIO管脚配置为输出
if (ret != HDF_SUCCESS) {HDF_LOGE("GpioSetDir: gpio set dir fail, ret:%d\n", ret);return ret;
}
获取GPIO管脚方向

可以通过如下函数获取GPIO管脚方向:

int32_t GpioGetDir(uint16_t gpio, uint16_t *dir);

表 3 GpioGetDir参数和返回值描述

参数参数描述
gpiouint16_t类型,GPIO管脚号
diruint16_t类型指针,获取到的方向值
返回值返回值描述
HDF_SUCCESS获取GPIO管脚方向成功
负数获取GPIO管脚方向失败

假设需要获取GPIO管脚3的方向,其使用示例如下:

int32_t ret;
uin16_t dir;ret = GpioGetDir(3, &dir);    // 获取3号GPIO管脚方向
if (ret != HDF_SUCCESS) {HDF_LOGE("GpioGetDir: gpio get dir fail, ret:%d\n", ret);return ret;
}
读取GPIO管脚电平值

如果要读取一个GPIO管脚电平,通过以下函数完成:

int32_t GpioRead(uint16_t gpio, uint16_t *val);

表 4 GpioRead参数和返回值描述

参数参数描述
gpiouint16_t类型,GPIO管脚号
valuint16_t类型指针,接收读取电平值
返回值返回值描述
HDF_SUCCESS读取GPIO管脚电平值成功
负数读取GPIO管脚电平值失败

假设需要读取GPIO管脚3的电平值,其使用示例如下:

int32_t ret;
uint16_t val;ret = GpioRead(3, &val);    // 读取3号GPIO管脚电平值
if (ret != HDF_SUCCESS) {HDF_LOGE("GpioRead: gpio read fail, ret:%d\n", ret);return ret;
}
写入GPIO管脚电平值

如果要向GPIO管脚写入电平值,通过以下函数完成:

int32_t GpioWrite(uint16_t gpio, uint16_t val);

表 5 GpioWrite参数和返回值描述

参数参数描述
gpiouint16_t类型,GPIO管脚号
valuint16_t类型,待写入的电平值
返回值返回值描述
HDF_SUCCESS写入GPIO管脚电平值成功
负数写入GPIO管脚电平值失败

假设需要给GPIO管脚3写入低电平值,其使用示例如下:

int32_t ret;ret = GpioWrite(3, GPIO_VAL_LOW);    // 给3号GPIO管脚写入低电平值
if (ret != HDF_SUCCESS) {HDF_LOGE("GpioWrite: gpio write fail, ret:%d\n", ret);return ret;
}
设置GPIO管脚中断

如果要为一个GPIO管脚设置中断响应程序,使用如下函数:

int32_t GpioSetIrq(uint16_t gpio, uint16_t mode, GpioIrqFunc func, void *arg);

表 6 GpioSetIrq参数和返回值描述

参数参数描述
gpiouint16_t类型,GPIO管脚号
modeuint16_t类型,中断触发模式
func函数指针,中断服务程序
arg无类型指针,传递给中断服务程序的入参
返回值返回值描述
HDF_SUCCESS设置GPIO管脚中断成功
负数设置GPIO管脚中断失败

注意:
同一时间,只能为某个GPIO管脚设置一个中断服务函数,如果重复调用GpioSetIrq函数,则之前设置的中断服务函数会被取代。

取消GPIO管脚中断

当不再需要响应中断服务函数时,使用如下函数取消中断设置:

int32_t GpioUnsetIrq(uint16_t gpio, void *arg);

表 7 GpioUnsetIrq参数和返回值描述

参数参数描述
gpiouint16_t类型,GPIO管脚号
arg无类型指针,GPIO中断数据
返回值返回值描述
HDF_SUCCESS取消GPIO管脚中断成功
负数取消GPIO管脚中断失败
使能GPIO管脚中断

在中断服务程序设置完成后,还需要先通过如下函数使能GPIO管脚的中断:

int32_t GpioEnableIrq(uint16_t gpio);

表 8 GpioEnableIrq参数和返回值描述

参数参数描述
gpiouint16_t类型,GPIO管脚号
返回值返回值描述
HDF_SUCCESS使能GPIO管脚中断成功
负数使能GPIO管脚中断失败

注意:
必须通过此函数使能管脚中断,之前设置的中断服务函数才能被正确响应。

禁止GPIO管脚中断

如果要临时屏蔽此中断,可以通过如下函数禁止GPIO管脚中断:

int32_t GpioDisableIrq(uint16_t gpio);

表 9 GpioDisableIrq参数和返回值描述

参数参数描述
gpiouint16_t类型,GPIO管脚号
返回值返回值描述
HDF_SUCCESS禁止GPIO管脚中断成功
负数禁止GPIO管脚中断失败

中断相关操作示例:

// 中断服务函数
int32_t MyCallBackFunc(uint16_t gpio, void *data)
{HDF_LOGI("MyCallBackFunc: gpio:%u interrupt service in data.\n", gpio);return HDF_SUCCESS;
}int32_t ret;
// 设置中断服务程序为MyCallBackFunc,入参为NULL,中断触发模式为上升沿触发
ret = GpioSetIrq(3, OSAL_IRQF_TRIGGER_RISING, MyCallBackFunc, NULL);
if (ret != HDF_SUCCESS) {HDF_LOGE("GpioSetIrq: gpio set irq fail, ret:%d\n", ret);return ret;
}// 使能3号GPIO管脚中断
ret = GpioEnableIrq(3);
if (ret != HDF_SUCCESS) {HDF_LOGE("GpioEnableIrq: gpio enable irq fail, ret:%d\n", ret);return ret;
}// 禁止3号GPIO管脚中断
ret = GpioDisableIrq(3);
if (ret != HDF_SUCCESS) {HDF_LOGE("GpioDisableIrq: gpio disable irqfail, ret:%d\n", ret);return ret;
}// 取消3号GPIO管脚中断服务程序
ret = GpioUnsetIrq(3, NULL);
if (ret != HDF_SUCCESS) {HDF_LOGE("GpioUnSetIrq: gpio unset irq fail, ret:%d\n", ret);return ret;
}

使用实例

本实例程序中,我们将测试一个GPIO管脚的中断触发:为管脚设置中断服务函数,触发方式为边沿触发,然后通过交替写高低电平到管脚,产生电平波动,制造触发条件,观察中断服务函数的执行。

首先需要选取一个空闲的GPIO管脚,本例程基于Hi3516DV300开发板,GPIO管脚选择GPIO10_3,换算成GPIO号为83。

读者可以根据自己使用的开发板,参考其原理图,选择一个空闲的GPIO管脚即可。

#include "gpio_if.h"
#include "hdf_log.h"
#include "osal_irq.h"
#include "osal_time.h"static uint32_t g_irqCnt;// 中断服务函数
static int32_t TestCaseGpioIrqHandler(uint16_t gpio, void *data)
{HDF_LOGE("TestCaseGpioIrqHandler: irq triggered! on gpio:%u, in data", gpio);g_irqCnt++;          // 如果中断服务函数触发执行,则将全局中断计数加1return GpioDisableIrq(gpio);
}// 测试用例函数
static int32_t TestCaseGpioIrqEdge(void)
{int32_t ret;uint16_t valRead;uint16_t mode;uint16_t gpio = 84;  // 待测试的GPIO管脚号uint32_t timeout;// 将管脚方向设置为输出ret = GpioSetDir(gpio, GPIO_DIR_OUT);if (ret != HDF_SUCCESS) {HDF_LOGE("TestCaseGpioIrqEdge: set dir fail! ret:%d\n", ret);return ret;}// 先禁止该管脚中断ret = GpioDisableIrq(gpio);if (ret != HDF_SUCCESS) {HDF_LOGE("TestCaseGpioIrqEdge: disable irq fail! ret:%d\n", ret);return ret;}// 为管脚设置中断服务函数,触发模式为上升沿和下降沿共同触发mode = OSAL_IRQF_TRIGGER_RISING | OSAL_IRQF_TRIGGER_FALLING;HDF_LOGE("TestCaseGpioIrqEdge: mode:%0x\n", mode);ret = GpioSetIrq(gpio, mode, TestCaseGpioIrqHandler, NULL);if (ret != HDF_SUCCESS) {HDF_LOGE("TestCaseGpioIrqEdge: set irq fail! ret:%d\n", ret);return ret;}// 使能此管脚中断ret = GpioEnableIrq(gpio);if (ret != HDF_SUCCESS) {HDF_LOGE("TestCaseGpioIrqEdge: enable irq fail! ret:%d\n", ret);(void)GpioUnsetIrq(gpio, NULL);return ret;}g_irqCnt = 0;        // 清除全局计数器timeout = 0;         // 等待时间清零// 等待此管脚中断服务函数触发,等待超时时间为1000毫秒while (g_irqCnt <= 0 && timeout < 1000) {(void)GpioRead(gpio, &valRead);(void)GpioWrite(gpio, (valRead == GPIO_VAL_LOW) ? GPIO_VAL_HIGH : GPIO_VAL_LOW);HDF_LOGE("TestCaseGpioIrqEdge: wait irq timeout:%u\n", timeout);OsalMDelay(200); // 等待中断触发timeout += 200;}(void)GpioUnsetIrq(gpio, NULL);HDF_LOGI("TestCaseGpioIrqEdge: function tests end, g_irqCnt:%u", g_irqCnt);return (g_irqCnt > 0) ? HDF_SUCCESS : HDF_FAILURE;
}

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(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.rhkb.cn/news/304923.html

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

相关文章

Day80:服务攻防-中间件安全HW2023-WPS分析WeblogicJettyJenkinsCVE

目录 中间件-Jetty-CVE&信息泄漏 CVE-2021-34429(信息泄露) CVE-2021-28169(信息泄露) 中间件-Jenkins-CVE&RCE执行 cve_2017_1000353 CVE-2018-1000861 cve_2019_1003000 中间件-Weblogic-CVE&反序列化&RCE 应用金山WPS-HW2023-RCE&复现&上线…

windows ffmpeg7 通过rtsp拉取h265裸流

点击下边那个链接会转到github 下载完成后&#xff0c;添加include、lib到工程。 添加头文件&#xff1a; extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavformat/avio.h" #inclu…

Acrobat Pro DC 2021---PDF编辑与管理,打造高效PDF工作流程 含Mac+win

Acrobat Pro DC 2021包括全面的PDF编辑、OCR识别、多种输出格式转换以及强大的文件安全性保护。用户可轻松编辑、合并、转换PDF文件&#xff0c;同时支持将扫描文档转换为可编辑的PDF。可将PDF转换为Word、Excel、PowerPoint等格式&#xff0c;提高工作效率。 Mac电脑&#xf…

使用Docker部署开源项目FreeGPT35来免费调用ChatGPT3.5 API

Vercel部署FreeGPT35有严重限制&#xff0c;玩玩就好&#xff0c;真用还是得docker。 限制原因: Vercel的流式响应并不是一开始写流&#xff0c;客户端就能立刻收到响应流&#xff0c;而是先写到一个缓冲区&#xff0c;当流关闭才一股脑的流式响应回来(不是实时流) 因此导致: …

wireshark数据流分析学习日记day3-从 Pcap 导出对象

从 HTTP 流量导出文件 过滤http请求 发现get请求上传了两个文件 保存即可 也可以保存网页 点击保存 改文件名为html结尾以便于访问 请谨慎使用此方法。如果从 pcap 中提取恶意 HTML 代码并在 Web 浏览器中查看它&#xff0c;则 HTML 可能会调用恶意域&#xff0c;这就是为什么…

android-自定义TextView在文字内容末尾添加图片icon、可以添加间距

样式示意图 自定义属性 style.xml <declare-styleable name"IconLabelTextView"><attr name"iconSrc" format"reference"/><attr name"iconPaddingStart" format"dimension"/><attr name"iconPad…

【YOLOv8】Yolov5和Yolov8网络结构的分析与对比

目录 一 YOLOv5 二 YOLOv8 yolo通常采用backbone-neck-head的网络结构。 Backbone 主要负责从输入图像中提取高层次的语义特征,常包含多个卷积层和池化层&#xff0c;构建了一个深层次的特征提取器。Neck通常用来进一步整合与调整backbone提取的特征&#xff0c;有利于将不同…

odoo10 创建第一个应用

当odoo10环境创建好之后&#xff0c;需要设置一个用户 我这里设置的叫做odoo_user&#xff0c;并给他设置全部的权限&#xff0c;用于创建数据库。 当我们在odoo的web主页创建一个数据库&#xff0c;我这里叫做my_odoo&#xff0c;然后我们创建一个名为myapp的模块 python .…

Linux云计算之Linux基础3——Linux系统基础part-2

1、终端、shell、文件理论 1、终端 终端(terminal)&#xff1a;人和系统交互的必要设备&#xff0c;人机交互最后一个界面&#xff08;包含独立的输入输出设备&#xff09; 物理终端(console)&#xff1a;直接接入本机器的键盘设备和显示器虚拟终端(tty)&#xff1a;通过软件…

知了汇智鸿蒙系列讲座进校园,赋能产业数字化升级,助力创新人才培养

随着信创国产化战略的深入推进&#xff0c;以及万物互联时代的加速到来&#xff0c;信息技术产业正迎来前所未有的发展机遇。在这一背景下&#xff0c;成都知了汇智科技有限公司作为产教融合领域的先行者&#xff0c;积极响应国家号召&#xff0c;通过举办鸿蒙系列讲座进校园活…

对OceanBase中的配置项与系统变量,合法性检查实践

在“OceanBase 配置项&系统变量实现及应用详解”的系列文章中&#xff0c;我们已经对配置项和系统变量的源码进行了解析。当涉及到新增配置项或系统变量时&#xff0c;通常会为其指定一个明确的取值范围或定义一个专门的合法性检查函数。本文将详细阐述在不同情境下&#x…

【TB作品】MSP430单片机读取大气压强传感器BMP180

文章目录 实物main所有代码 实物 main #include <msp430.h> #include "stdio.h" #include "OLED.h"#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>// P2.2 oled scl // P2.3 oled sda// p…

【vue/uniapp】使用 smooth-signature 实现 h5 的横屏电子签名

通过github链接进行下载&#xff0c;然后代码参考如下&#xff0c;功能包含了清空、判断签名内容是否为空、生成png/jpg图片等。 签名效果&#xff1a; 预览效果&#xff1a; 下载 smooth-signature 链接&#xff1a;https://github.com/linjc/smooth-signature 代码参考&a…

数据结构OJ题——栈和队列

1. 用栈实现队列&#xff08;OJ链接&#xff09; 题目描述&#xff1a;请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09; void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回…

SpringBoot快速入门笔记(5)

文章目录 一、elemetnUI1、main.js2、App.vue3、fontAwesome 一、elemetnUI 开源前端框架&#xff0c;安装 npm i element-ui -S 建议查看官方文档 Element组件&#xff0c;这里是Vue2搭配elementUI&#xff0c;如果是vue3就搭配elementPlus&#xff0c;这里初学就以Vue2为例子…

【软考---系统架构设计师】计算机网络章节

目录 一、TCP/IP协议族 &#xff08;1&#xff09;基本介绍 &#xff08;2&#xff09;TCP和UDP的区别 &#xff08;3&#xff09;DNS协议 &#xff08;4&#xff09;DHCP协议 二、网络规划与设计 &#xff08;1&#xff09;需求分析 &#xff08;2&#xff09;通信规范…

Vue3(一):win7使用vue-cli创建vue3工程

一、资料分享 网课地址&#xff1a;尚硅谷Vue3入门到实战&#xff0c;最新版vue3TypeScript前端开发教程_哔哩哔哩_bilibili vuecli创建vue3项目官网&#xff1a;创建一个项目 | Vue CLI vite创建vue3官网&#xff1a;快速上手 | Vue.js 尚硅谷笔记&#xff1a;https://pan.ba…

【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美(含源码仅此一份,先到先得)

【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美&#xff08;含源码仅此一份&#xff0c;先到先得&#xff09; 目录 【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美&#xff08;含源码仅此一份&#xff0c;先到先得&#xff09;1.面向对象的引用1.1简介1…

day55 最长递增子序列 最长连续递增子序列 最长重复子数组

题目1 300 最长递增子序列 题目链接 300 最长递增子序列 题意 找到整数数组nums的最长严格递增子序列的长度&#xff08;子序列并不改变原始的顺序&#xff0c;但是可以删除元素&#xff09; 动态规划 动规五部曲 1&#xff09;dp数组及下标i的含义 dp[i] 表示以nums[i…

SpringMVC数据接收(全面/详细注释)

SpringMVC涉及组件&#xff1a; DispatcherServlet : SpringMVC提供&#xff0c;我们需要使用web.xml配置使其生效&#xff0c;它是整个流程处理的核心&#xff0c;所有请求都经过它的处理和分发&#xff01;[ CEO ]HandlerMapping : SpringMVC提供&#xff0c;我们需要进行…