ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(显示输出类外设之LCD)

目录

  • ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(显示输出类外设之LCD)
    • 简介
    • 模块概述
      • 功能定义
      • 架构位置
      • 核心特性
    • LCD外设分析
      • LCD外设概述
        • LCD外设层次架构图
      • LCD外设API和数据结构
        • 外设层API
        • 公共API
        • 内部数据结构
      • LCD外设配置选项
      • LCD外设初始化流程
        • 外设层初始化过程(periph_lcd.c)
        • LCD IO总线设置过程(_setup_lcd函数)
        • LCD面板初始化过程(_lcd_init函数)
        • LCD默认复位函数(_lcd_rest_default函数)
        • LCD外设完整初始化时序图
      • LCD外设销毁流程
        • LCD外设销毁时序图
        • 销毁流程注意事项
      • LCD外设事件处理
        • LCD外设事件处理特点
        • LCD外设与应用程序交互流程
        • 典型应用代码示例

ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(显示输出类外设之LCD)

版本信息: ESP-ADF v2.7-65-gcf908721

简介

本文档详细分析ESP-ADF中的显示/输出类外设实现机制,包括LCD、LED、WS2812、IS31FL3216和AW2013等外设的设计模式、接口规范、初始化流程和事件处理机制。ESP-ADF显示/输出类外设基于统一的外设框架设计,通过事件驱动模型实现显示和指示功能,为音频应用提供了丰富的视觉反馈能力和用户界面支持。

模块概述

功能定义

ESP-ADF显示/输出类外设主要负责提供视觉反馈和用户界面显示功能,将应用程序的状态和数据以可视化方式呈现给用户。主要功能包括:

  • 状态指示(LED指示灯、状态灯等)
  • 用户界面显示(LCD屏幕显示文本、图形等)
  • 视觉效果(WS2812彩色灯带、IS31FL3216和AW2013 LED矩阵等)
  • 音频可视化(音频频谱显示、节奏灯光效果等)

架构位置

显示/输出类外设是ESP-ADF外设子系统的重要组成部分,位于硬件驱动层和应用层之间:

应用程序
ESP外设子系统
显示/输出类外设
LCD外设
LED外设
WS2812外设
IS31FL3216外设
AW2013外设
SPI/I2C驱动
GPIO驱动
RMT驱动
I2C驱动
I2C驱动

核心特性

  • 多种显示设备支持:支持LCD、LED、WS2812、IS31FL3216和AW2013等多种显示和指示设备
  • 统一控制接口:所有显示/输出外设使用统一的初始化和控制接口
  • 丰富的显示效果:支持开关控制、亮度调节、颜色变化、动画效果等多种显示功能
  • 与音频处理集成:可与音频处理模块协同工作,实现音频可视化效果
  • 低功耗设计:支持设备休眠和唤醒管理,优化功耗表现
  • 事件驱动模型:通过事件机制实现显示状态变化的通知和处理

LCD外设分析

LCD外设概述

LCD外设基于ESP-IDF的LCD驱动框架实现,支持多种LCD控制器和接口类型,主要用于显示文本、图形和用户界面。LCD外设通过SPI或I2C接口与LCD控制器通信,提供了显示初始化、显示控制和显示内容更新等功能。

LCD外设实现仅在ESP-IDF 4.4.0及以上版本可用,它主要依赖于ESP-IDF的esp_lcd组件,该组件提供了统一的LCD面板驱动接口。

LCD外设实现主要包含一个层次:

  1. 外设层:负责将LCD集成到ESP-ADF外设系统中,处理初始化、配置和生命周期管理。
    • 头文件:components/esp_peripherals/include/periph_lcd.h
    • 实现文件:components/esp_peripherals/periph_lcd.c
LCD外设层次架构图
ESP-IDF LCD驱动
外设层 periph_lcd.c
调用
调用
设置
设置
设置
调用
调用
调用
调用
调用
调用
调用
调用
调用
调用
调用
LCD面板初始化
esp_lcd_panel_init
颜色反转设置
esp_lcd_panel_invert_color
显示区域设置
esp_lcd_panel_set_gap
XY坐标交换
esp_lcd_panel_swap_xy
镜像设置
esp_lcd_panel_mirror
显示开关控制
esp_lcd_panel_disp_on_off
_lcd_init
periph_lcd_init
_lcd_run
_lcd_destroy
_setup_lcd
ESP-ADF应用
esp_periph_create
new_panel_io
new_lcd_panel
esp_lcd_panel_del
esp_lcd_panel_io_del

LCD外设API和数据结构

外设层API

源文件components/esp_peripherals/include/periph_lcd.hcomponents/esp_peripherals/periph_lcd.c

公共API
// LCD外设初始化函数
esp_periph_handle_t periph_lcd_init(periph_lcd_cfg_t *config);// 获取LCD面板句柄
esp_lcd_panel_handle_t periph_lcd_get_panel_handle(esp_periph_handle_t handle);// LCD面板IO总线获取回调函数类型
typedef esp_err_t (*get_lcd_io_bus)(void *bus, esp_lcd_panel_io_spi_config_t *io_config, esp_lcd_panel_io_handle_t *out_panel_io);// LCD面板获取回调函数类型
typedef esp_err_t (*get_lcd_panel)(const esp_lcd_panel_io_handle_t panel_io, const esp_lcd_panel_dev_config_t *panel_dev_config,esp_lcd_panel_handle_t *ret_panel);// LCD供应商初始化回调函数类型
typedef esp_err_t (*lcd_vender_init_func)(const esp_lcd_panel_io_handle_t panel_io);// LCD复位回调函数类型
typedef esp_err_t (*perph_lcd_rest)(esp_periph_handle_t self, void *ctx);// LCD配置结构体
typedef struct {void                                *io_bus;               // IO总线句柄get_lcd_io_bus                      new_panel_io;          // 面板IO创建函数esp_lcd_panel_io_spi_config_t       *lcd_io_cfg;           // LCD IO配置get_lcd_panel                       new_lcd_panel;         // 面板创建函数lcd_vender_init_func                vendor_init;           // 供应商初始化函数esp_lcd_panel_dev_config_t          *lcd_dev_cfg;          // LCD设备配置perph_lcd_rest                      rest_cb;               // 复位回调函数void                                *rest_cb_ctx;          // 复位回调上下文bool                                lcd_swap_xy;           // 是否交换XY坐标bool                                lcd_mirror_x;          // 是否X轴镜像bool                                lcd_mirror_y;          // 是否Y轴镜像bool                                lcd_color_invert;      // 是否颜色反转
} periph_lcd_cfg_t;
内部数据结构
// LCD外设内部结构体 (定义在periph_lcd.c中)
typedef struct periph_lcd {void                                *io_bus;               // IO总线句柄get_lcd_io_bus                      new_panel_io;          // 面板IO创建函数esp_lcd_panel_io_spi_config_t       lcd_io_cfg;            // LCD IO配置get_lcd_panel                       new_lcd_panel;         // 面板创建函数esp_lcd_panel_dev_config_t          lcd_dev_cfg;           // LCD设备配置esp_lcd_panel_io_handle_t           lcd_io_handle;         // LCD IO句柄esp_lcd_panel_handle_t              lcd_panel_handle;      // LCD面板句柄perph_lcd_rest                      rest_cb;               // 复位回调函数lcd_vender_init_func                vendor_init;           // 供应商初始化函数void                                *rest_cb_ctx;          // 复位回调上下文bool                                lcd_swap_xy;           // 是否交换XY坐标bool                                lcd_mirror_x;          // 是否X轴镜像bool                                lcd_mirror_y;          // 是否Y轴镜像bool                                lcd_color_invert;      // 是否颜色反转
} periph_lcd_t;

LCD外设配置选项

  • io_bus: IO总线句柄,可以是SPI或I2C总线
  • new_panel_io: 面板IO创建函数,用于创建LCD IO句柄
  • lcd_io_cfg: LCD IO配置,包括SPI时钟、命令/数据引脚等
  • new_lcd_panel: 面板创建函数,用于创建LCD面板句柄
  • vendor_init: 供应商初始化函数,用于执行特定LCD控制器的初始化序列
  • lcd_dev_cfg: LCD设备配置,包括分辨率、复位引脚等
  • rest_cb: 复位回调函数,用于执行LCD复位操作
  • rest_cb_ctx: 复位回调上下文
  • lcd_swap_xy: 是否交换XY坐标
  • lcd_mirror_x: 是否X轴镜像
  • lcd_mirror_y: 是否Y轴镜像
  • lcd_color_invert: 是否颜色反转

LCD外设初始化流程

LCD外设的初始化流程主要在外设层完成,涉及到ESP-IDF的LCD驱动接口。下面详细介绍初始化过程。

外设层初始化过程(periph_lcd.c)

外设层初始化主要通过periph_lcd_init函数(位于periph_lcd.c)完成,主要包括以下步骤:

  1. 创建LCD外设结构体:分配periph_lcd_t结构体内存
  2. 复制配置参数:从传入的配置结构体复制参数到内部结构体
  3. 创建外设句柄:调用esp_periph_create函数创建外设句柄
  4. 设置回调函数:设置复位回调函数和外设生命周期函数
  5. 设置LCD IO总线:调用_setup_lcd函数设置LCD IO总线
  6. 初始化LCD面板:调用_lcd_init函数初始化LCD面板
// 文件:components/esp_peripherals/periph_lcd.c
esp_periph_handle_t periph_lcd_init(periph_lcd_cfg_t *config)
{// 1. 创建LCD外设结构体periph_lcd_t *periph_lcd = audio_calloc(1, sizeof(periph_lcd_t));AUDIO_MEM_CHECK(TAG, periph_lcd, return NULL);// 2. 复制配置参数periph_lcd->io_bus = config->io_bus;memcpy(&periph_lcd->lcd_io_cfg, config->lcd_io_cfg, sizeof(esp_lcd_panel_io_spi_config_t));memcpy(&periph_lcd->lcd_dev_cfg, config->lcd_dev_cfg, sizeof(esp_lcd_panel_dev_config_t));periph_lcd->new_panel_io = config->new_panel_io;periph_lcd->new_lcd_panel = config->new_lcd_panel;periph_lcd->lcd_swap_xy = config->lcd_swap_xy;periph_lcd->lcd_mirror_x = config->lcd_mirror_x;periph_lcd->lcd_mirror_y = config->lcd_mirror_y;periph_lcd->lcd_color_invert = config->lcd_color_invert;periph_lcd->rest_cb = config->rest_cb;periph_lcd->vendor_init = config->vendor_init;// 3. 创建外设句柄esp_periph_handle_t periph = esp_periph_create(PERIPH_ID_LCD, "periph_lcd");AUDIO_MEM_CHECK(TAG, periph, {audio_free(periph_lcd);return NULL;});// 4. 设置回调函数if (periph_lcd->rest_cb == NULL) {periph_lcd->rest_cb = _lcd_rest_default;}periph_lcd->rest_cb_ctx = config->rest_cb_ctx;esp_periph_set_data(periph, periph_lcd);esp_periph_set_function(periph, NULL, _lcd_run, _lcd_destroy);// 5. 设置LCD IO总线_setup_lcd(periph);// 6. 初始化LCD面板_lcd_init(periph);return periph;
}
LCD IO总线设置过程(_setup_lcd函数)

_setup_lcd函数负责设置LCD IO总线和创建LCD面板,主要包括以下步骤:

  1. 获取LCD外设数据:从外设句柄获取LCD外设数据
  2. 创建LCD IO句柄:调用new_panel_io回调函数创建LCD IO句柄
  3. 创建LCD面板句柄:调用new_lcd_panel回调函数创建LCD面板句柄
// 文件:components/esp_peripherals/periph_lcd.c
esp_err_t _setup_lcd(esp_periph_handle_t self)
{// 1. 获取LCD外设数据periph_lcd_t *periph_lcd = esp_periph_get_data(self);// 2. 创建LCD IO句柄ESP_ERROR_CHECK(periph_lcd->new_panel_io(periph_lcd->io_bus,&periph_lcd->lcd_io_cfg, &periph_lcd->lcd_io_handle));// 3. 创建LCD面板句柄ESP_ERROR_CHECK(periph_lcd->new_lcd_panel(periph_lcd->lcd_io_handle, &periph_lcd->lcd_dev_cfg, &periph_lcd->lcd_panel_handle));return ESP_OK;
}
LCD面板初始化过程(_lcd_init函数)

_lcd_init函数负责初始化LCD面板和设置显示参数,主要包括以下步骤:

  1. 获取LCD外设数据:从外设句柄获取LCD外设数据
  2. 执行LCD复位:调用复位回调函数执行LCD复位
  3. 初始化LCD面板:调用esp_lcd_panel_init函数初始化LCD面板
  4. 执行供应商特定初始化:如果提供了供应商初始化函数,则调用该函数
  5. 配置LCD显示参数:设置颜色反转、显示区域、坐标交换和镜像等参数
  6. 打开显示:调用esp_lcd_panel_disp_on_off函数打开显示
// 文件:components/esp_peripherals/periph_lcd.c
static esp_err_t _lcd_init(esp_periph_handle_t self)
{// 1. 获取LCD外设数据periph_lcd_t *periph_lcd = esp_periph_get_data(self);// 2. 执行LCD复位if (periph_lcd->rest_cb) {periph_lcd->rest_cb(self, periph_lcd->rest_cb_ctx);}// 3. 初始化LCD面板ESP_ERROR_CHECK(esp_lcd_panel_init(periph_lcd->lcd_panel_handle));// 4. 执行供应商特定初始化if (periph_lcd->vendor_init) {ESP_ERROR_CHECK(periph_lcd->vendor_init(periph_lcd->lcd_io_handle));}// 5. 配置LCD显示参数ESP_ERROR_CHECK(esp_lcd_panel_invert_color(periph_lcd->lcd_panel_handle, periph_lcd->lcd_color_invert));ESP_ERROR_CHECK(esp_lcd_panel_set_gap(periph_lcd->lcd_panel_handle, 0, 0));ESP_ERROR_CHECK(esp_lcd_panel_swap_xy(periph_lcd->lcd_panel_handle, periph_lcd->lcd_swap_xy));ESP_ERROR_CHECK(esp_lcd_panel_mirror(periph_lcd->lcd_panel_handle, periph_lcd->lcd_mirror_x, periph_lcd->lcd_mirror_y));// 6. 打开显示ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(periph_lcd->lcd_panel_handle, true));return ESP_OK;
}
LCD默认复位函数(_lcd_rest_default函数)

如果用户没有提供复位回调函数,则使用默认的复位函数:

// 文件:components/esp_peripherals/periph_lcd.c
esp_err_t _lcd_rest_default(esp_periph_handle_t self, void *ctx)
{periph_lcd_t *periph_lcd = esp_periph_get_data(self);ESP_ERROR_CHECK(esp_lcd_panel_reset(periph_lcd->lcd_panel_handle));return ESP_OK;
}
LCD外设完整初始化时序图

下图展示了LCD外设从应用程序调用到ESP-IDF LCD驱动完成初始化的完整流程:

应用程序 periph_lcd_init (periph_lcd.c) esp_periph库 _setup_lcd (periph_lcd.c) _lcd_init (periph_lcd.c) ESP-IDF LCD API periph_lcd_init(config) 分配 periph_lcd_t 结构体 复制配置参数 esp_periph_create(PERIPH_ID_LCD, "periph_lcd") periph 设置复位回调函数 esp_periph_set_data(periph, periph_lcd) esp_periph_set_function(periph, NULL, _lcd_run, _lcd_destroy) _setup_lcd(periph) esp_periph_get_data(periph) periph_lcd new_panel_io(io_bus, lcd_io_cfg, &lcd_io_handle) ESP_OK new_lcd_panel(lcd_io_handle, lcd_dev_cfg, &lcd_panel_handle) ESP_OK ESP_OK _lcd_init(periph) esp_periph_get_data(periph) periph_lcd rest_cb(self, rest_cb_ctx) esp_lcd_panel_reset(lcd_panel_handle) ESP_OK esp_lcd_panel_init(lcd_panel_handle) ESP_OK vendor_init(lcd_io_handle) ESP_OK opt [如果提供了供应商初始化函数] esp_lcd_panel_invert_color(lcd_panel_handle, lcd_color_invert) ESP_OK esp_lcd_panel_set_gap(lcd_panel_handle, 0, 0) ESP_OK esp_lcd_panel_swap_xy(lcd_panel_handle, lcd_swap_xy) ESP_OK esp_lcd_panel_mirror(lcd_panel_handle, lcd_mirror_x, lcd_mirror_y) ESP_OK esp_lcd_panel_disp_on_off(lcd_panel_handle, true) ESP_OK ESP_OK periph 应用程序 periph_lcd_init (periph_lcd.c) esp_periph库 _setup_lcd (periph_lcd.c) _lcd_init (periph_lcd.c) ESP-IDF LCD API

通过上述初始化流程,LCD外设完成了从创建外设句柄到初始化LCD面板的全过程,使应用程序能够通过获取LCD面板句柄来控制LCD显示。

LCD外设销毁流程

LCD外设的销毁流程相对简单,主要通过_lcd_destroy函数(位于periph_lcd.c)完成,主要包括以下步骤:

  1. 获取LCD外设数据:从外设句柄获取LCD外设数据
  2. 删除LCD面板:调用esp_lcd_panel_del函数删除LCD面板
  3. 删除LCD IO:调用esp_lcd_panel_io_del函数删除LCD IO
// 文件:components/esp_peripherals/periph_lcd.c
static esp_err_t _lcd_destroy(esp_periph_handle_t self)
{// 1. 获取LCD外设数据periph_lcd_t *periph_lcd = esp_periph_get_data(self);// 2. 删除LCD面板esp_lcd_panel_del(periph_lcd->lcd_panel_handle);// 3. 删除LCD IOesp_lcd_panel_io_del(periph_lcd->lcd_io_handle);// 注意:这里没有释放periph_lcd结构体内存,因为这个操作由esp_periph库负责return ESP_OK;
}
LCD外设销毁时序图

下图展示了LCD外设销毁的完整流程:

应用程序 esp_periph库 _lcd_destroy ESP-IDF LCD API esp_periph_destroy(periph) _lcd_destroy(self) esp_periph_get_data(self) periph_lcd esp_lcd_panel_del(lcd_panel_handle) ESP_OK esp_lcd_panel_io_del(lcd_io_handle) ESP_OK ESP_OK 释放periph_lcd结构体内存 ESP_OK 应用程序 esp_periph库 _lcd_destroy ESP-IDF LCD API
销毁流程注意事项
  1. 内存管理_lcd_destroy函数不负责释放periph_lcd结构体内存,这个操作由esp_periph库负责。这是因为该结构体是通过esp_periph_set_data函数设置给外设句柄的,由外设框架统一管理。

  2. 资源释放顺序:先删除LCD面板,再删除LCD IO,这个顺序确保了资源的正确释放,避免了悬挂指针和内存泄漏问题。

  3. 错误处理:销毁函数没有进行错误检查,这是因为销毁操作通常是在应用程序退出或者资源清理阶段执行的,即使出现错误也不会影响程序的正常退出。

通过上述销毁流程,LCD外设能够正确释放所有分配的资源,确保应用程序不会出现资源泄漏问题。

LCD外设事件处理

LCD外设的事件处理机制相对简单,主要通过_lcd_run函数(位于periph_lcd.c)实现,该函数在外设框架接收到事件时被调用。

// 文件:components/esp_peripherals/periph_lcd.c
static esp_err_t _lcd_run(esp_periph_handle_t self, audio_event_iface_msg_t *msg)
{return ESP_OK;
}

与按键外设不同,LCD外设的_lcd_run函数实现非常简单,仅返回ESP_OK,不处理任何事件。这是因为LCD外设主要是一个输出设备,不会主动产生事件,而是被动接收应用程序的控制命令进行显示更新。

LCD外设事件处理特点
  1. 被动设备:LCD外设是一个典型的被动设备,不会主动产生事件,而是由应用程序控制其显示内容和状态。

  2. 无事件类型定义:与按键外设不同,LCD外设没有定义特定的事件类型,因为它不需要向应用程序报告状态变化。

  3. 控制方式:应用程序通过以下方式控制LCD显示:

    • 初始化LCD外设:periph_lcd_init
    • 获取LCD面板句柄:periph_lcd_get_panel_handle
    • 使用ESP-IDF的LCD面板API进行显示控制:esp_lcd_panel_draw_bitmap
LCD外设与应用程序交互流程
典型应用代码示例
#include "esp_peripherals.h"
#include "periph_lcd.h"
#include "esp_lcd_panel_ops.h"void app_lcd_demo(void)
{// 1. 初始化esp_periph库esp_periph_config_t periph_cfg = DEFAULT_ESP_PERIPH_SET_CONFIG();esp_periph_set_handle_t set = esp_periph_set_init(&periph_cfg);// 2. 初始化LCD外设periph_lcd_cfg_t lcd_cfg = {// 填写LCD配置参数};esp_periph_handle_t lcd_periph = periph_lcd_init(&lcd_cfg);esp_periph_start(set, lcd_periph);// 3. 获取LCD面板句柄esp_lcd_panel_handle_t panel = periph_lcd_get_panel_handle(lcd_periph);// 4. 使用ESP-IDF LCD API绘制内容uint16_t color_data[320 * 240] = {0}; // 示例:320x240分辨率esp_lcd_panel_draw_bitmap(panel, 0, 0, 320, 240, color_data);// ... 其他应用逻辑// 5. 销毁LCD外设esp_periph_stop(set, lcd_periph);esp_periph_destroy(set);
}

下图展示了LCD外设与应用程序的交互流程:

应用程序 esp_periph库 LCD外设 ESP-IDF LCD API esp_periph_init() periph_lcd_init(config) periph句柄 esp_periph_start(periph) periph_lcd_get_panel_handle(periph) panel句柄 esp_lcd_panel_draw_bitmap(panel, ...) 更新显示内容 esp_periph_destroy(periph) _lcd_destroy(self) 释放资源 应用程序 esp_periph库 LCD外设 ESP-IDF LCD API

通过上述交互流程,应用程序可以控制LCD显示内容,而无需关心事件处理机制。这种设计简化了LCD外设的使用,使开发者可以专注于显示内容的设计和实现。

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

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

相关文章

面试题:循环引用两个节点相互引用,如何判断哪个用 shared_ptr?哪个用 weak_ptr?

目录 1.引言 2.原理 3.所有权模型与指针选择 4.复杂场景的决策策略 5.注意事项 6.总结 1.引言 当两个对象通过 shared_ptr 相互引用时,会产生循环引用问题,导致内存泄漏。因为这两个对象的引用计数永远不会变为 0,即使它们在程序的其他…

QT聊天项目DAY06

1.从git上同步项目 编译测试,编译通过 Post请求测试 测试成功 2. email is 打印有问题,检查 解析结果是存储在jsonResult中的,修改 3. 客户端实现Post验证码请求 3.1 同步Qt客户端项目 检查QT版本,由于我在公司用的还是QT5.12.9…

PHP腾讯云人脸核身获取FaceId

参考腾讯云官方文档: 人脸核身 合作方后台上传身份信息_腾讯云 前提:已经获取了SIGN Ticket。获取参考文档: PHP腾讯云人脸核身获取SIGN Ticket-CSDN博客 public function getTxFaceId($uid,$name,$idNo){$appId ;$userId $uid;$nonce …

用 Deepseek 写的uniapp油耗计算器

下面是一个基于 Uniapp 的油耗计算器实现&#xff0c;包含 Vue 组件和页面代码。 1. 创建页面文件 在 pages 目录下创建 fuel-calculator 页面&#xff1a; <!-- pages/fuel-calculator/fuel-calculator.vue --> <template><view class"container"…

Redis ④-通用命令

Redis 是一个 客户端-服务器 结构的程序&#xff0c;这与 MySQL 是类似的&#xff0c;这点需要牢记&#xff01;&#xff01;&#xff01; Redis 固然好&#xff0c;但也不是任何场景都适合使用 Redis&#xff0c;一定要根据当前的业务需求来选择是否使用 Redis Redis 通用命令…

HarmonyOs学习 环境配置后 实验1:创建项目Hello World

HarmonyOS开发入门&#xff1a;环境配置与Hello World实验 实验目标 掌握HarmonyOS开发环境配置&#xff0c;创建首个HarmonyOS应用并实现"Hello World"界面展示 实验准备 已安装DevEco Studio开发环境已配置HarmonyOS开发依赖项熟悉基本TypeScript/ArkTS语法&am…

HTTP:十.cookie机制

Cookie概念及类型 HTTP cookie,简称cookie,又称数码存根、“网站/浏览+魔饼/魔片”等,是浏览网站时由网络服务器创建并由网页浏览器存放在用户计算机或其他设备的小文本文件。Cookie使Web服务器能在用户的设备存储状态信息(如添加到在线商店购物车中的商品)或跟踪用户…

记录小程序第一次调用Api,基于腾讯云Serverless函数,实现小程序的成功接入api,以及数据调用

目录 创建腾讯云个人账户新建severless应用建立函数URL小程序中调用api示例 创建腾讯云个人账户 百度搜索即可&#xff0c;并注册 新建severless应用 作者以github下载的某Api为例&#xff0c;这里不展示具体Api&#xff0c;只关注操作即可&#xff0c;相信都是互通的 在腾…

ES6 第一讲 变量定义 堆与栈 字符串的扩展和数值型的扩展

文章目录 1.ES6变量定义2.ES6堆和栈3.字符串的扩展3.1 模板字符串3.2 判断是否以指定的字符串开头或结尾3.3 字符串重复输出3.4 填充方法3.5 去除前后字符串空格3.6 返回参数指定位置的字符 4. 数值型的扩展4.1 二进制0B 八进制0O4.2 判断是否是一个无穷大的数字 &#xff08;判…

LeetCode第158题_用Read4读取N个字符 II

LeetCode 第158题&#xff1a;用Read4读取N个字符 II 题目描述 给你一个文件&#xff0c;并且该文件只能通过给定的 read4 方法来读取&#xff0c;请实现一个方法来读取 n 个字符。 read4 方法&#xff1a; API read4 可以从文件中读取 4 个连续的字符&#xff0c;并且将它…

算法篇之单调栈

单调栈算法入门 单调栈是一种特殊的数据结构应用&#xff0c;它的核心在于维护一个栈&#xff0c;使得栈内元素保持单调递增或者单调递减的顺序。这种数据结构在解决很多算法问题时非常有效&#xff0c;例如求数组中每个元素的下一个更大元素、每日温度问题等。 一、单调栈的…

Kubernetes控制平面组件:调度器Scheduler(二)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…

【网络】数据链路层知识梳理

全是通俗易懂的讲解&#xff0c;如果你本节之前的知识都掌握清楚&#xff0c;那就速速来看我的笔记吧~ 自己写自己的八股&#xff01;让未来的自己看懂&#xff01; &#xff08;全文手敲&#xff0c;受益良多&#xff09; 数据链路层 我们来重新理解一下这个图&#xff1a;…

机器学习(神经网络基础篇)——个人理解篇6(概念+代码)

1 在声明一个类中&#xff0c;构建一个属于类的函数&#xff0c;前面为什要加上“self”&#xff1f; 就像下面这一串代码&#xff1a; class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size,weight_init_std0.01):# 初始化权重self.params {}self.p…

Cribl 对Windows-xml log 进行 -Removing filed-06

Removing Fields Description​ The Eval Function can be used to add or remove fields. In this example we will remove the extracted fields while preserving _raw, _time,index,source, sourcetype. Steps - Adding an Eval Function

chili3d调试6 添加左侧面板

注释前 一个一个注释看对应哪个窗口 无事发生 子方法不是显示的窗口 注释掉看看 没了 注释这个看看 零件页面没了 这个浏览器居然完全不用关的&#xff0c;刷新就重载了 注释看看 无工具栏版本 sidebar&#xff1a; 往框框里面加入 div({ className: style.input }, user_…

Linux学习——了解和熟悉Linux系统的远程终端登录

Linux学习——了解和熟悉Linux系统的远程终端登录 一.配置Ubuntu系统的网络和用户 1、设置虚拟机网络为桥接模式 打开VMWare&#xff0c;选择编辑虚拟机设置&#xff0c;在网络适配器设置中&#xff0c;选择“桥接模式”&#xff0c;保存设置并启动Ubuntu。 2、配置Ubuntu的…

【JAVA EE初阶】多线程(1)

这样的代码&#xff0c;虽然也能打印hello thread&#xff0c;但是没有创建新的线程&#xff0c;而是直接在main方法所在的主线程中执行了run的逻辑 start方法&#xff0c;是调用系统api&#xff0c;真正在操作系统内部创建一个线程。这个新的线程会以run作为入口方法&#xff…

javase 学习

一、Java 三大版本 javaSE 标准版 &#xff08;桌面程序&#xff1b; 控制台开发&#xff09; javaME 嵌入式开发&#xff08;手机、小家电&#xff09;基本不用&#xff0c;已经淘汰了 javaEE E业级发开&#xff08;web端、 服务器开发&#xff09; 二、Jdk ,jre jvm 三…

【Linux】Linux 操作系统 - 05 , 软件包管理器和 vim 编辑器的使用 !

文章目录 前言一、软件包管理器1 . 软件安装2 . 包管理器3 . Linux 生态 二、软件安装 、卸载三、vim 的使用1 . 什么是 vim ?2 . vim 多模式3 . 命令模式 - 命令4 . 底行模式 - 命令5. 插入模式6 . 替换模式7 . V-BLOCK 模式8 . 技巧补充 总结 前言 本篇笔者将会对软件包管理…