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

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

功能简介

Regulator模块用于控制系统中某些设备的电压/电流供应。在嵌入式系统(尤其是手机)中,控制耗电量很重要,直接影响到电池的续航时间。所以,如果系统中某一个模块暂时不需要使用,就可以通过Regulator关闭其电源供应;或者降低提供给该模块的电压、电流大小。

Regulator接口定义了操作Regulator设备的通用方法集合,包括:

  • Regulator设备句柄获取和销毁。

  • Regulator设备电压、电流的设置。

  • Regulator设备使能和关闭。

  • Regulator设备电压、电流和状态的获取。

基本概念

  • 校准器

    当输入电压和输出负载发生变化时可以通过软件调整,使其能够提供稳定的输出电压。

  • Consumer

    由Regulator供电的设备统称为Consumer, 其可分为静态和动态两类:

    • 静态:不需要改变电压电流,只需要开关电源,通常在bootloader、firmware、kernel board阶段被设置。

    • 动态:根据操作需求改变电压电流。

  • PMIC(Power Management IC)

    电源管理芯片,内含多个电源甚至其他子系统。

运作机制

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

Regulator模块各分层的作用为:

  • 接口层:提供打开设备,操作Regulator,关闭设备的能力。

  • 核心层:主要负责服务绑定、初始化以及释放管理器,并提供添加、删除以及获取Regulator设备的能力。

  • 适配层:由驱动适配者实现与硬件相关的具体功能,如设备的初始化等。

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

Regulator统一服务模式结构图

约束与限制

Regulator模块API当前仅支持内核态调用。

使用指导

场景介绍

Regulator主要用于:

  1. 用于控制系统中某些设备的电压/电流供应。

  2. 用于稳压电源的管理。

接口说明

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

表 1 Regulator设备API接口说明

接口名接口描述
DevHandle RegulatorOpen(const char *name)获取Regulator设备驱动句柄
void RegulatorClose(DevHandle handle)销毁Regulator设备驱动句柄
int32_t RegulatorEnable(DevHandle handle)使能Regulator
int32_t RegulatorDisable(DevHandle handle)禁用Regulator
int32_t RegulatorForceDisable(DevHandle handle)强制禁用Regulator
int32_t RegulatorSetVoltage(DevHandle handle, uint32_t minUv, uint32_t maxUv)设置Regulator输出电压
int32_t RegulatorGetVoltage(DevHandle handle, uint32_t *voltage)获取Regulator输出电压
int32_t RegulatorSetCurrent(DevHandle handle, uint32_t minUa, uint32_t maxUa)设置Regulator输出电流
int32_t RegulatorGetCurrent(DevHandle handle, uint32_t *regCurrent)获取Regulator输出电流
int32_t RegulatorGetStatus(DevHandle handle, uint32_t *status)获取Regulator状态

开发步骤

使用Regulator设备的一般流程如图2所示。

图 2 Regulator设备使用流程图

Regulator设备使用流程图

获取Regulator设备句柄

在操作Regulator设备时,首先要调用RegulatorOpen获取Regulator设备句柄,该函数会返回指定设备名称的Regulator设备句柄。

DevHandle RegulatorOpen(const char *name);

表 2 RegulatorOpen参数和返回值描述

参数参数描述
name字符指针,Regulator设备名称
返回值返回值描述
handle获取成功返回Regulator设备句柄
NULL获取失败
// Regulator设备名称
const char *name = "regulator_virtual_1";
DevHandle handle = NULL;// 获取Regulator设备句柄
handle = RegulatorOpen(name);
if (handle == NULL) {// 错误处理HDF_LOGE("RegulatorOpen: open regulator fail.\n");return HDF_FAILURE;
}
销毁Regulator设备句柄

关闭Regulator设备,系统释放对应的资源。

void RegulatorClose(DevHandle handle);

表 3 RegulatorClose参数描述

参数参数描述
handleDevHandle类型,Regulator设备句柄
// 销毁Regulator设备句柄
RegulatorClose(handle);
使能

启用Regulator设备。

int32_t RegulatorEnable(DevHandle handle);

表 4 RegulatorEnable参数描述

参数参数描述
handleDevHandle类型,Regulator设备句柄
返回值返回值描述
HDF_SUCCESS使能Regulator设备成功
负数使能Regulator设备失败
int32_t ret;// 启用Regulator设备
ret = RegulatorEnable(handle);
if (ret != HDF_SUCCESS) {// 错误处理HDF_LOGE("RegulatorEnable: enable regulator fail, ret:%d\n", ret);return ret;
}
禁用

禁用Regulator设备。如果Regulator设备状态为常开,或存在Regulator设备子节点未禁用,则禁用失败。

int32_t RegulatorDisable(DevHandle handle);

表 5 RegulatorDisable参数描述

参数参数描述
handleDevHandle类型,Regulator设备句柄
返回值返回值描述
HDF_SUCCESS禁用Regulator设备成功
负数禁用Regulator设备失败
int32_t ret;// 禁用Regulator设备
ret = RegulatorDisable(handle);
if (ret != HDF_SUCCESS) {// 错误处理HDF_LOGE("RegulatorDisable: disable regulator fail, ret:%d\n", ret);return ret;
}
强制禁用

强制禁用Regulator设备。无论Regulator设备的状态是常开还是子节点已使能,Regulator设备都会被禁用。

int32_t RegulatorForceDisable(DevHandle handle);

表 6 RegulatorForceDisable参数描述

参数参数描述
handleDevHandle类型,Regulator设备句柄
返回值返回值描述
HDF_SUCCESS强制禁用Regulator设备成功
负数强制禁用Regulator设备失败
int32_t ret;// 强制禁用Regulator设备
ret = RegulatorForceDisable(handle);
if (ret != HDF_SUCCESS) {// 错误处理HDF_LOGE("RegulatorForceDisable: force disable regulator fail, ret:%d\n", ret);return ret;
}
设置Regulator输出电压范围
int32_t RegulatorSetVoltage(DevHandle handle, uint32_t minUv, uint32_t maxUv);

表 7 RegulatorSetVoltage参数描述

参数参数描述
handleDevHandle类型,Regulator设备句柄
minUvuint32_t类型,最小电压
maxUvuint32_t类型,最大电压
返回值返回值描述
HDF_SUCCESS设置Regulator输出电压范围成功
负数设置Regulator输出电压范围失败
int32_t ret;
int32_t minUv = 0;        // 最小电压为0µV
int32_t maxUv = 20000;    // 最大电压为20000µV// 设置Regulator电压输出电压范围
ret = RegulatorSetVoltage(handle, minUv, maxUv);
if (ret != HDF_SUCCESS) {// 错误处理HDF_LOGE("RegulatorSetVoltage: regulator set Voltage fail, ret:%d\n", ret);return ret;
}
获取Regulator电压
int32_t RegulatorGetVoltage(DevHandle handle, uint32_t *voltage);

表 8 RegulatorGetVoltage参数描述

参数参数描述
handleDevHandle类型,Regulator设备句柄
voltageuint32_t类型指针,待获取的Regulator电压
返回值返回值描述
HDF_SUCCESS获取Regulator电压成功
负数获取Regulator电压失败
int32_t ret;
uint32_t voltage;// 获取Regulator电压
ret = RegulatorGetVoltage(handle, &voltage);
if (ret != HDF_SUCCESS) {// 错误处理HDF_LOGE("RegulatorGetVoltage: regulator get Voltage fail, ret:%d\n", ret);return ret;
}
设置Regulator输出电流范围
int32_t RegulatorSetCurrent(DevHandle handle, uint32_t minUa, uint32_t maxUa);

表 9 RegulatorSetCurrent参数描述

参数参数描述
handleDevHandle类型,Regulator设备句柄
minUauint32_t类型,最小电流
maxUauint32_t类型,最大电流
返回值返回值描述
HDF_SUCCESS设置Regulator输出电流范围成功
负数设置Regulator输出电流范围失败
int32_t ret;
int32_t minUa = 0;	    // 最小电流为0μA
int32_t maxUa = 200;    // 最大电流为200μA// 设置Regulator输出电流范围
ret = RegulatorSetCurrent(handle, minUa, maxUa);
if (ret != HDF_SUCCESS) {// 错误处理HDF_LOGE("RegulatorSetCurrent: regulator set current fail, ret:%d\n", ret);return ret;
}
获取Regulator电流
int32_t RegulatorGetCurrent(DevHandle handle, uint32_t *regCurrent);

表 10 RegulatorGetCurrent参数描述

参数参数描述
handleDevHandle类型,Regulator设备句柄
regCurrentuint32_t类型指针,待获取的Regulator电流
返回值返回值描述
HDF_SUCCESS获取成功
负数获取失败
int32_t ret;
uint32_t regCurrent;// 获取Regulator电流
ret = RegulatorGetCurrent(handle, &regCurrent);
if (ret != HDF_SUCCESS) {// 错误处理HDF_LOGE("RegulatorGetCurrent: regulator get current fail, ret:%d\n", ret);return ret;
}
获取Regulator状态
int32_t RegulatorGetStatus(DevHandle handle, uint32_t *status);

表 11 RegulatorGetStatus参数描述

参数参数描述
handleDevHandle类型,Regulator设备句柄
statusuint32_t类型指针,待获取Regulator状态
返回值返回值描述
HDF_SUCCESS获取成功
负数获取失败
int32_t ret;
uint32_t status;// 获取Regulator状态
ret = RegulatorGetStatus(handle, &status);
if (ret != HDF_SUCCESS) {// 错误处理HDF_LOGE("RegulatorGetStatus: regulator get status fail, ret:%d\n", ret);return ret;
}

使用实例

本例拟对Hi3516DV300开发板上Regulator设备进行简单的读取操作。

Regulator设备完整的使用示例如下所示,首先获取Regulator设备句柄,然后使能,设置电压,获取电压、状态,禁用,最后销毁Regulator设备句柄。

void RegulatorTestSample(void)
{int32_t ret;/* Regulator设备名称 */const char *name = "regulator_virtual_1";DevHandle handle = NULL;/* 获取Regulator设备句柄 */handle = RegulatorOpen(name);if (handle  == NULL) {HDF_LOGE("RegulatorOpen: failed!\n");return;}/* 启用Regulator设备 */ret = RegulatorEnable(handle);if (ret != 0) {HDF_LOGE("RegulatorEnable: failed, ret %d\n", ret);goto _ERR;}int32_t minUv = 0;		// 最小电压为0µVint32_t maxUv = 20000;  // 最大电压为20000µV/* 设置Regulator输出电压范围 */ret = RegulatorSetVoltage(handle, minUv, maxUv);if (ret != 0) {HDF_LOGE("RegulatorSetVoltage: failed, ret %d\n", ret);goto _ERR;}uint32_t voltage;/* 获取Regulator电压 */ret = RegulatorGetVoltage(handle, &voltage);if (ret != 0) {HDF_LOGE("RegulatorGetVoltage: failed, ret %d\n", ret);goto _ERR;}uint32_t status;/* 获取Regulator状态 */ret = RegulatorGetStatus(handle, &status);if (ret != 0) {HDF_LOGE("RegulatorGetStatus: failed, ret %d\n", ret);goto _ERR;}/* 禁用Regulator设备 */ret = RegulatorDisable(handle);if (ret != 0) {HDF_LOGE("RegulatorDisable: failed, ret %d\n", ret);goto _ERR;}_ERR:/* 销毁Regulator设备句柄 */RegulatorClose(handle); 
}

最后

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

总结

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

相关文章:

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

功能简介 Regulator模块用于控制系统中某些设备的电压/电流供应。在嵌入式系统(尤其是手机)中,控制耗电量很重要,直接影响到电池的续航时间。所以,如果系统中某一个模块暂时不需要使用,就可以通过Regulato…...

【opencv】示例-grabcut.cpp 使用OpenCV库的GrabCut算法进行图像分割

left mouse button - set rectangle SHIFTleft mouse button - set GC_FGD pixels CTRLleft mouse button - set GC_BGD pixels 这段代码是一个使用OpenCV库的GrabCut算法进行图像分割的C程序。它允许用户通过交互式方式选择图像中的一个区域,并利用GrabCut算法尝试…...

GEE数据集——巴基斯坦国家级土壤侵蚀数据集(2005 年和 2015 年)

简介 巴基斯坦国家级土壤侵蚀数据集(2005 年和 2015 年) 该数据集采用修订的通用土壤流失方程 (RUSLE),并考虑了六个关键影响因素:降雨侵蚀率 (R)、土壤可侵蚀性 (K)、坡长 (L)、坡陡 (S)、覆盖管理 (C) 和保护措施 (P)&#xff…...

服务器代理

服务器代理 配置:64G内存1 3090(24g)1P4000(8g) SSH连接 工作路径:/home/ubuntu/workspace/python Anaconda路径:/home/Ubuntu 1.在工作路径下创建自己的文件夹作为workspace 2.以用户ubunbtu登…...

【SGDR】《SGDR:Stochastic Gradient Descent with Warm Restarts》

arXiv-2016 code: https://github.com/loshchil/SGDR/blob/master/SGDR_WRNs.py 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metric5.2 Single-Model Results5.3 Ensemble Results5.4 Experiment…...

如何将arping以及所有依赖打包安装到另外一台离线ubuntu机器

ubuntu系统下可以使用arping命令检测局域网内一些ip是否冲突,使用方式为: arping xx.xx.xx.xx 在线情况下,可以使用下面命令下载arping,然后使用即可 apt install arping 但是有些情况下机器可能不能上网,这时就需要将…...

mac上如何安装python3

mac上如何安装python3? 安装homebrew 在终端执行命令 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 执行完成后,homebrew和pip等工具就自动安装好了。 接下来安装python3.在终端…...

Java 那些诗一般的 数据类型 (下篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接…...

WEB3.0:互联网的下一阶段

随着互联网的发展,WEB3.0时代正在逐步到来。本文将深入探讨WEB3.0的定义、特点、技术应用以及未来展望,为读者带来全新的思考。 一、什么是WEB3.0? WEB3.0可以被理解为互联网发展的下一阶段,是当前WEB2.0的升级版。相较于2.0时代…...

Fastgpt配合chatglm+m3e或ollama+m3e搭建个人知识库

概述: 人工智能大语言模型是近年来人工智能领域的一项重要技术,它的出现标志着自然语言处理领域的重大突破。这些模型利用深度学习和大规模数据训练,能够理解和生成人类语言,为各种应用场景提供了强大的文本处理能力。AI大语言模…...

如何使用选择器精确地控制网页中每一个元素的样式?

1. 基础知识 什么是 CSS 元素选择器 CSS 元素选择器是一种在网页中通过元素类型来应用样式的方法。 简单来说,它就像是一个指挥棒,告诉浏览器哪些 HTML 元素需要应用我们定义的 CSS 样式规则。 为何要使用 CSS 元素选择器 使用元素选择器可以让我们…...

各个微前端框架的优劣浅谈

各个微前端框架都有其独特的优势和劣势,下面我将针对几个主流的微前端框架进行简要的优劣分析: single-spa 优势: 轻量级:single-spa是一个非常轻量级的微前端框架,它主要提供了一个加载和管理微应用的机制&#xff0c…...

自动化运维(二十二)Ansible实战 之Jenkins模块

Ansible提供了一些模块,可以用来与Jenkins进行交互,执行各种操作,如创建任务、触发构建、获取构建结果等。通过使用这些模块,我们可以将Jenkins的配置和管理集成到Ansible的自动化流程中。 以下是一些常用的Ansible Jenkins模块: 1、jenkins_job模块 jenkins_job模块用于创建…...

Python数据分析与应用 |第4章 使用pandas进行数据预处理 (实训)

表1-1healthcare-dataset-stroke.xlsx 部分中风患者的基础信息和体检数据 编号性别高血压是否结婚工作类型居住类型体重指数吸烟史中风9046男否是私人城市36.6以前吸烟是51676女否是私营企业农村N/A从不吸烟是31112男否是私人农村32.5从不吸烟...

基于双向长短期神经网络BILSTM的线损率预测,基于gru的线损率预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 基于双向长短期神经网络BILSTM的线损率预测,基于gru的线损率预测 完整代码:基于双向长短期神经网络BILSTM的线损率预测,基于gru的线损率预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/d…...

智能售货机:引领便捷生活

智能售货机:引领便捷生活 在这个科技迅速进步的时代,便捷已成为生活的必需。智能售货机作为技术与便利完美结合的产物,正逐渐改变我们的购物方式,为都市生活增添新的活力。 智能售货机的主要优势是它的极致便利性。不论是在地铁…...

正向代理和反向代理

正向代理和反向代理是网络中常见的两种代理方式,它们在网络通信中扮演着不同的角色。 正向代理: 正向代理是代理服务器位于客户端和目标服务器之间的一种代理方式。 客户端向代理服务器发送请求,然后代理服务器将请求转发给目标服务器&…...

kimichat使用技巧:用语音对话聊天

kimichat之前是只能用文字聊天的,不过最近推出了语音新功能,也可以用语音畅快的对话聊天了。 这个功能目前支持手机app版本,所以首先要在手机上下载安装kimi智能助手。已经安装的,要点击检查更新,更新到最新的版本。 …...

机器学习-09-图像处理02-PIL+numpy+OpenCV实践

总结 本系列是机器学习课程的系列课程,主要介绍机器学习中图像处理技术。 参考 【人工智能】PythonOpenCV图像处理(一篇全) 一文讲解方向梯度直方图(hog) 【杂谈】计算机视觉在人脸图像领域的十几个大的应用方向&…...

应急响应-战前反制主机HIDSElkeid蜜罐系统HFish

知识点 战前-反制-平台部署其他更多项目: https://github.com/birdhan/SecurityProduct HIDS:主机入侵检测系统,通常会有一个服务器承担服务端角色,其他主机就是客户端角色,客户端加入到服务端的检测范围里&#xff…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...