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

Linux驱动-单总线-DS18b20-驱动设备树配置-GPIO复用

提示DS18B20驱动配置设备树文章目录前言一、参考资料二、 原理图分析-配置设备树1、字符设备驱动框架-再分析-需求描述2、地板原理图简要分析DS18b20 引脚底板原理图简要分析实物图20pin的原理图pinctrl 引脚复用-可复用的引脚配置图3、配置设备树配置gpio1. ds18b20_gpio: gpio0_b02. compatible ds18b20;3. ds18b20-gpios gpio0 RK_PB0 GPIO_ACTIVE_HIGH;4. pinctrl-names default;5. pinctrl-0 ds18b20_gpio_ctrl;配置pinctrl1. pinctrl2. ds18b20_gpio3. ds18b20_gpio_ctrl: ds18b20-gpio-ctrl4. rockchip,pins 0 RK_PB0 RK_FUNC_GPIO pcfg_pull_none;两段配置的关系核心逻辑三、源码-原理分析-验证1、源码说明-加载驱动2、验证设备树配置的gpio节点是否生成 cd /proc/device-tree/3、检查设备树是否加载进入内核-ls -l /proc/device-tree/gpio0_b04、验证申请的设备号-cat /proc/devices5、验证申请的字符设备类-ls /sys/class/-ls /sys/class/sensors6、验证申请的字符设备 -ls -l /dev/-ls -l /dev/ds18b20总结前言这里还是结合前面的知识点前面文章已经讲解、总结、归纳了驱动框架、字符驱动框架里面还及到平台总线知识点。接下来就是设备树知识点。很早以前我们学习每个知识点都是 加载驱动、按照我们的demo 流程来进行知识点验证前面的温度传感器-DS18B20驱动框架编写 、温度传感器-DS18B20字符设备驱动框架 就是写了框架其实驱动还没有加载成功的比如平台总线驱动还没有识别到没有调用probe函数。一、参考资料这里我们把以前的相关知识点拿到这里规整一下总线设备知识点platform总线注册流程分析在总线下注册设备及设备注册流程分析Linux驱动之platform 总线设备注册流程分析总线驱动相关知识点驱动-在自定义总线上创建驱动-分析驱动注册流程总线、字符设备、相关知识点讯为:第十四期 | 单总线RK3568驱动指南第十四篇 单总线-第158章DS18B20编写字符设备驱动框架涉及到核心知识点alloc_chrdev_region // 动态申请字符设备号驱动-申请字符设备号涉及到核心知识点cdev_init //字符设备初始化 cdev_initcdev_add //字符设备的注册 - cdev_add驱动-注册字符设备涉及到核心知识点class_create() - 创建设备类device_create() - 创建设备节点驱动-创建设备节点gpio-pinctrl知识点GPIO 控制和操作-使用命令通过sysfs文件系统控制GPIO使用C程序通过sysfs文件系统控制gpio操作寄存器来控制GPIO-点亮LED灯将原理图中的一个引脚复用为gpio功能驱动GPIO-获取单个gpio描述符Linux驱动-GPIO基本函数apiLinux驱动-GPIO子系统与pinctrl子系统相结合温度传感器-DS18B20驱动框架编写温度传感器-DS18B20字符设备驱动框架其实我们这里用到的DS18B20外设然后整个链路把知识点串联起来而已之前相关知识点都学过的。 如果忘记 强烈建议自己再去补一补基础的东西忘记了不行的。二、 原理图分析-配置设备树1、字符设备驱动框架-再分析-需求描述在字符驱动设备框架温度传感器-DS18B20字符设备驱动框架中 我们对驱动源码进行了详细的分析的。但是我们没做什么我们只是写了框架平台总线设备并没有加载成功也就是说probe函数这个驱动的灵魂当设备树中compatible ds18b20的设备与驱动匹配成功时内核才会自动调用probe完成字符设备的完整注册流程。所以 我们要做的是什么配置gpio: 驱动层配置一个gpio给DS18b20外设来用配置pinCtrl: 但是系统里面默认的pin点可能是配置了其它的功能、或者 默认情况下不是gpio功能。 那么就需要用pin-ctrl进行引脚复用到GPIO功能这样外设才能正常使用匹配到gpio,实现2、地板原理图简要分析DS18b20 引脚DS18B20引脚如下这里DC 就是信号引脚需要一个GPIO来连接的那么就在主板上面找一个GPIO不就行了嘛。底板原理图简要分析参考资料topeet_rk3568_main_v1_7.pdf底板原理图实物图先看实物图 打算用这个20pin脚里面的GPIO0_B0的拐角作为GPIO控制来做DS18B20的信号连接。20pin的原理图在topeet_rk3568_main_v1_7.pdf底板原理图 里面去找那么就去找J39 的原理图如下我们看到了拐角17 对应的就是GPIO0_B0的拐角全称DVP_PWREN0_H_GPIO0_B0pinctrl 引脚复用-可复用的引脚配置图那么这个引脚DVP_PWREN0_H_GPIO0_B0我想用来做GPIO来用那么就要去配置pinctrl引脚复用继续看 引脚复用继续在topeet_rk3568_main_v1_7.pdf底板原理图 里面去找如下说明引脚DVP_PWREN0_H_GPIO0_B0可以复用的功能有CLK32K_IN 、CLK32K_OUTO、PCIE30X2_BUTTONRSTn、GPIO0_B03、配置设备树文件路径kernel/arch/arm64/boot/dts/rockchip/rk3568/rk3568-evb1-ddr4-v10.dtsi参考文档将原理图中的一个引脚复用为gpio功能-Linux驱动-GPIO子系统与pinctrl子系统相结合要求就是当有GPIO复用功能需求不应该无从下手应该很熟练的去配置。配置gpio在根节点中配置/{.......................ds18b20_gpio:gpio0_b0{compatibleds18b20;ds18b20-gpiosgpio0 RK_PB0 GPIO_ACTIVE_HIGH;pinctrl-namesdefault;pinctrl-0ds18b20_gpio_ctrl;statusokay;};}1. ds18b20_gpio: gpio0_b0ds18b20_gpio节点标签方便其他地方引用gpio0_b0节点名字随便写建议和引脚对应2. compatible “ds18b20”;驱动匹配字符串告诉内核这个设备要去找名字叫 ds18b20 的驱动来匹配、接管内核就是靠这个字段找到对应驱动3. ds18b20-gpios gpio0 RK_PB0 GPIO_ACTIVE_HIGH;这是最重要的一行指定 DS18B20 接在哪个 GPIO但是就是一个gpio描述符gpio0使用 GPIO0 控制器RK_PB0GPIO0_B0 引脚GPIO_ACTIVE_HIGH高电平有效单总线必须这样4. pinctrl-names “default”;定义引脚状态名称default 表示默认工作状态5. pinctrl-0 ds18b20_gpio_ctrl;关联引脚配置意思是去引用 pinctrl 里定义的 ds18b20_gpio_ctrl 引脚配置这是两段配置之间的 “桥梁”配置pinctrl在pinctrl 节点中配置pinctrl 相关信息pinctrl{.............ds18b20_gpio{ds18b20_gpio_ctrl:ds18b20-gpio-ctrl{rockchip,pins0 RK_PB0 RK_FUNC_GPIOpcfg_pull_none;};};}1. pinctrl引用 RK3568 的引脚控制器所有引脚复用、上下拉、驱动能力都在这里配置2. ds18b20_gpio给这组引脚配置起个名字随便写3. ds18b20_gpio_ctrl: ds18b20-gpio-ctrl这是真正被引用的配置节点第一段 pinctrl-0 就是引用它4. rockchip,pins 0 RK_PB0 RK_FUNC_GPIO pcfg_pull_none;参数功能参数 10GPIO 组号GPIO0参数 2RK_PB0引脚编号GPIO0_B0参数 3RK_FUNC_GPIO功能模式普通 GPIO 输入输出模式不是 I2C、UART、PWM 等复用功能参数 4pcfg_pull_none上下拉配置pull_none 无上下拉;DS18B20 必须外部接 4.7k 上拉电阻内部不能开上下拉两段配置的关系核心逻辑第一段设备节点 pinctrl-0ds18b20_gpio_ctrl↓ 引用 第二段pinctrl 引脚配置 ds18b20_gpio_ctrl{...}第一段告诉内核 “这是什么设备、用哪个引脚”第二段告诉内核 “这个引脚要怎么配置GPIO 模式、无上下拉”。核心点小结属性名称作用compatible匹配驱动ds18b20-gpios指定引脚pinctrl-0关联引脚配置rockchip,pins设置引脚为 GPIO 模式 无上下拉三、源码-原理分析-验证1、源码说明-加载驱动这里不演示源码用的是上一节中一摸一样的源码 温度传感器-DS18B20字符设备驱动框架 源码如下#includelinux/init.h#includelinux/module.h#includelinux/platform_device.h#includelinux/of.h#includelinux/fs.h#includelinux/cdev.h#includelinux/kdev_t.h#includelinux/slab.h#includelinux/gpio.h#includelinux/gpio/consumer.h#includelinux/delay.hstruct ds18b20_data{dev_t dev_num;// 什么一个字符设备号就是设备号struct cdev ds18b20_cdev;//声明一个字符设备structclass*ds18b20_class;//声明一个设备类struct device*ds18b20_device;//声明一个设备//device};intds18b20_open(struct inode*inode,struct file*file){return0;}ssize_tds18b20_read(struct file*file,char__user*buf,size_t size,loff_t*offs){return0;}intds18b20_release(struct inode*inode,struct file*file){return0;}struct file_operations ds18b20_fops{.opends18b20_open,.readds18b20_read,.releaseds18b20_release,.ownerTHIS_MODULE,};struct ds18b20_data*ds18b20;intds18b20_probe(struct platform_device*dev){intret;printk(This is probe \n);ds18b20kzalloc(sizeof(*ds18b20),GFP_KERNEL);if(ds18b20NULL){printk(kzalloc error \n);gotoerror_0;}// 第一步骤:申请设备号retalloc_chrdev_region(ds18b20-dev_num,0,1,myds18b20);//通过动态方式进行设备号注册if(ret0){printk(alloc_chrdev_region error \n);ret-EAGAIN;gotoerror_1;}// 第二步字符设备初始化 cdev_initcdev_init(ds18b20-ds18b20_cdev,ds18b20_fops);// 使用 cdev_init()函数初始化 cdev_test 结构体 并链接到cdev_test_ops 结构体ds18b20-ds18b20_cdev.ownerTHIS_MODULE;// 将 owner 字段指向本模块 可以避免在模块的操作正在被使用时卸载该模块// 第三步字符设备的注册 - cdev_addretcdev_add(ds18b20-ds18b20_cdev,ds18b20-dev_num,1);// 使用 cdev_add()函数进行字符设备的添加// 第四步class_create() - 创建设备类ds18b20-ds18b20_classclass_create(THIS_MODULE,sensors);//使用class_create进行类的创建类名称为sensorsif(IS_ERR(ds18b20-ds18b20_class)){printk(class_create error\n);retPTR_ERR(ds18b20-ds18b20_class);gotoerror_2;}// 第五步创建device device_create() - 创建设备节点ds18b20-ds18b20_devicedevice_create(ds18b20-ds18b20_class,NULL,ds18b20-dev_num,NULL,ds18b20);//使用device_create进行设备的创建设备名称为device_testif(IS_ERR(ds18b20-ds18b20_device)){printk(device_create error\n);retPTR_ERR(ds18b20-ds18b20_device);gotoerror_3;}return0;//error_4:// device_destroy(ds18b20-ds18b20_class, ds18b20-dev_num);error_3:class_destroy(ds18b20-ds18b20_class);error_2:cdev_del(ds18b20-ds18b20_cdev);unregister_chrdev_region(ds18b20-dev_num,1);error_1:kfree(ds18b20);error_0:returnret;}conststruct of_device_id ds18b20_match_table[]{{.compatibleds18b20},{},};struct platform_driver ds18b20_driver{.driver{.ownerTHIS_MODULE,.nameds18b20,.of_match_tableds18b20_match_table,},.probeds18b20_probe,};staticint__initds18b20_init(void){intret;retplatform_driver_register(ds18b20_driver);if(ret0){printk(platform_driver_register error\n);return-1;}return0;}staticvoid__exitds18b20_exit(void){device_destroy(ds18b20-ds18b20_class,ds18b20-dev_num);class_destroy(ds18b20-ds18b20_class);cdev_del(ds18b20-ds18b20_cdev);unregister_chrdev_region(ds18b20-dev_num,1);kfree(ds18b20);platform_driver_unregister(ds18b20_driver);}module_init(ds18b20_init);module_exit(ds18b20_exit);MODULE_LICENSE(GPL);编译程序make生成驱动程序ds18b20.ko然后执行驱动[rootRK356X:/mnt/sdcard]# chmod777ds18b20.ko[rootRK356X:/mnt/sdcard]# insmod ds18b20.ko[rootRK356X:/mnt/sdcard]#查看内核日志dmesg看到打印了This is probe这就说明设备树中gpio 配置成功了设备树中的compatible ds18b20;和驱动程序中的.name ds18b20定义驱动名称 name 对应上了。struct platform_driver ds18b20_driver{.driver{.ownerTHIS_MODULE,.nameds18b20,.of_match_tableds18b20_match_table,},.probeds18b20_probe,};[rootRK356X:/]# dmesg2、验证设备树配置的gpio节点是否生成cd /proc/device-tree/gpio配置如下 节点名称是gpio0_b0ds18b20_gpio:gpio0_b0{compatibleds18b20;ds18b20-gpiosgpio0 RK_PB0 GPIO_ACTIVE_HIGH;pinctrl-namesdefault;pinctrl-0ds18b20_gpio_ctrl;statusokay;};执行命令cd /proc/device-tree/如下存在名称为gpio0_b0的设备树节点说明设备树配置成功了的3、检查设备树是否加载进入内核-ls -l /proc/device-tree/gpio0_b0如上只是说明设备树已经配置好了那么相关属性是否配置到内核呢ds18b20_gpio:gpio0_b0{compatibleds18b20;ds18b20-gpiosgpio0 RK_PB0 GPIO_ACTIVE_HIGH;pinctrl-namesdefault;pinctrl-0ds18b20_gpio_ctrl;statusokay;};执行ls -l /proc/device-tree/gpio0_b0命令验证如下实际和自己在设备树中的配置对上了。[rootRK356X:/sys/firmware/devicetree/base]# ls-l/proc/device-tree/gpio0_b0 total0-r--r--r--1root root8Apr2608:06compatible-r--r--r--1root root12Apr2608:06ds18b20-gpios-r--r--r--1root root9Apr2608:06name-r--r--r--1root root4Apr2608:06phandle-r--r--r--1root root4Apr2608:06pinctrl-0-r--r--r--1root root8Apr2608:06pinctrl-names-r--r--r--1root root5Apr2608:06status[rootRK356X:/sys/firmware/devicetree/base]#4、验证申请的设备号-cat /proc/devices在驱动源码中申请设备号参考资料驱动-申请字符设备号// 第一步骤:申请设备号retalloc_chrdev_region(ds18b20-dev_num,0,1,myds18b20);//通过动态方式进行设备号注册查看设备号命令cat /proc/devices我们看到申请的字符设备号了。5、验证申请的字符设备类-ls /sys/class/-ls /sys/class/sensors如上源码创建设备类ds18b20-ds18b20_class class_create(THIS_MODULE,sensors);那就看一下设备类是否生成ls /sys/class/参考资料驱动-创建设备节点继续看一下字符设备类下面对应的软链接到哪一个设备命令ls -l /sys/class/sensors/6、验证申请的字符设备 -ls -l /dev/-ls -l /dev/ds18b20如上源码创建设备类// 第五步创建device device_create() - 创建设备节点ds18b20-ds18b20_devicedevice_create(ds18b20-ds18b20_class,NULL,ds18b20-dev_num,NULL,ds18b20);//使用device_create进行设备的创建设备名称为device_test参考资料驱动-创建设备节点命令ls -l /dev/查看当前设备: 如下结果说明字符设备是创建成功了。总结配置设备树、gpio定义声明、pinctrl配置复用、字符设备、平台总线 这些基本知识点之前都学过这里通过实际案例再次实操务必掌握务必在实际开发中搞清楚开发流程如果遇到问题知道怎么定位问题然后分析问题

相关文章:

Linux驱动-单总线-DS18b20-驱动设备树配置-GPIO复用

提示:DS18B20驱动配置设备树 文章目录前言一、参考资料二、 原理图分析-配置设备树1、字符设备驱动框架-再分析-需求描述2、地板原理图简要分析DS18b20 引脚底板原理图简要分析实物图20pin的原理图pinctrl 引脚复用-可复用的引脚配置图3、配置设备树配置gpio1. ds18…...

嵌入式Day4

复合赋值运算符-*/%int main() {int a 20;a 10;printf("a is %d\n",a);a 20;a - 5;printf("a - is %d\n",a);a 20;a * 5 3 ;// 由于运算符 优先级 一定是计算 53 在赋值printf("a * is %d\n",a);a 20;a / 3 ;// printf("a /…...

UML分析与设计 - 软考备战(五十四)

UML分析与设计 参考资料: 九种常见UML图(分类图解) - HZX↑ - 博客园 UML科普文,一篇文章掌握14种UML图 - 知乎 『这就是UML!』系列内容第8讲:协作图 - ProcessOn知识社区 『这就是UML!』系…...

Rust 异步编程实战:构建高效的并发应用

Rust 异步编程实战:构建高效的并发应用 异步编程的重要性 在现代软件开发中,异步编程变得越来越重要。它允许程序在等待IO操作(如网络请求、文件读写)时继续执行其他任务,从而提高程序的响应速度和吞吐量。Rust作为一种…...

ChanlunX:终极缠论自动化分析插件,让技术分析变得简单高效

ChanlunX:终极缠论自动化分析插件,让技术分析变得简单高效 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX ChanlunX是一个基于C开发的通达信缠论分析插件,通过算法自动…...

别再只做AISMM打分!SITS2026验证:将成熟度等级转化为变革路线图的唯一可复用公式(附动态测算Excel)

更多请点击: https://intelliparadigm.com 第一章:SITS2026案例:AISMM驱动的组织变革 在SITS2026国际航天信息系统技术峰会中,欧洲航天局(ESA)与德国航空航天中心(DLR)联合实施的AI…...

通过Hermes Agent框架对接Taotoken自定义模型提供方

通过Hermes Agent框架对接Taotoken自定义模型提供方 基础教程类,指导使用Hermes Agent框架的用户,如何根据Taotoken提供的接入文档,在Hermes的配置中正确指定custom提供方类型与base_url后缀,并将API密钥写入约定的环境变量文件&…...

如何快速掌握猫抓Cat-Catch:浏览器资源嗅探工具终极指南

如何快速掌握猫抓Cat-Catch:浏览器资源嗅探工具终极指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为无法保存网页上的精彩视…...

【Android 组件】使用 XML 传统方式实现 Navigation 导航功能

一、概述 导航是指允许用户跨越、进入和退出应用中不同内容片段的交互。Android Jetpack 的 Navigation 组件是官方推荐的页面导航和转场解决方案,能帮你轻松处理 Fragment 之间的切换、返回栈管理,支持底部导航栏和动画。 1、主要概念 NavHostFragment(导航宿主):包含当…...

CC26XX低功耗实战:手把手教你配置TI-RTOS自动睡眠策略,让设备续航翻倍

CC26XX低功耗实战:TI-RTOS自动睡眠策略配置与深度优化指南 在物联网设备开发中,电池续航能力往往是决定产品成败的关键因素。德州仪器(TI)的CC26XX系列无线微控制器凭借其出色的低功耗特性,成为众多智能家居、可穿戴设备和工业传感器节点的首…...

天准星智携手BlackBerry QNX,共筑智能驾驶与泛机器人产业新未来

近日,智能驾驶及泛机器人领域的创新企业天准星智(天准科技控股子公司)与全球汽车及嵌入式软件领导者BlackBerry QNX共同宣布建立战略合作。双方将依托BlackBerry QNX领先的软件技术体系,携手打造面向汽车工业、泛机器人及AIoT领域…...

3分钟免费绕过iPhone激活锁:applera1n工具终极使用指南

3分钟免费绕过iPhone激活锁:applera1n工具终极使用指南 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 当您遇到二手iPhone无法激活、忘记Apple ID密码或继承设备时,applera1n这…...

ISCC-pwn(2026)

复现一下 文章目录校赛练武pwn1pwn2pwn3pwn4总结校赛练武 pwn1 32位泄露canary后,栈溢出到后门即可。 from pwn import * context.terminal ["tmux","splitw","-h"] context.log_level debugpprocess(./attachment-5) #premote(3…...

TVA与CNN的历史性对决(18)

重磅预告:本专栏将独家连载新书《AI视觉技术:从入门到进阶》精华内容。本书是《AI视觉技术:从进阶到专家》的权威前导篇,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“AI教…...

agentsrc-py:为AI编程助手注入精准源代码上下文,消除代码幻觉

1. 项目概述:为AI编程助手注入“源代码级”的上下文如果你和我一样,深度依赖像 Cursor、Claude Code 这类 AI 编程助手来提升开发效率,那你一定也踩过同样的坑:当你让助手帮你写一个基于 Pydantic 的数据验证,或者调用…...

事件驱动架构中的状态机模式:ralph-loop实现异步工作流管理

1. 项目概述:一个“自循环”的Ralph最近在折腾数据管道和API集成时,我遇到了一个挺有意思的项目:Endogen/ralph-loop。乍一看名字,你可能会有点懵,ralph?这不是个名字吗?怎么还“loop”上了&…...

System V 进程间通信:共享内存、消息队列与信号量

文章目录1、共享内存简介与原理2、共享内存API接口2.1、shmget(创建/获取)2.2、shmat(映射)和shmdt(解除挂接)2.3、shmctl(控制)3、共享内存应用4、消息队列(了解&#x…...

5个步骤彻底解决MelonLoader加载问题:从安装到调试的完整指南

5个步骤彻底解决MelonLoader加载问题:从安装到调试的完整指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 你是否…...

终极指南:5分钟搭建免费网盘直链解析服务,告别限速烦恼

终极指南:5分钟搭建免费网盘直链解析服务,告别限速烦恼 【免费下载链接】netdisk-fast-download 聚合多种主流网盘的直链解析下载服务, 一键解析下载,已支持夸克网盘/uc网盘/蓝奏云/蓝奏优享/小飞机盘/123云盘等. 支持文件夹分享解析. 体验地…...

计算机毕业设计 | SpringBoot+vue编程训练系统设计与实现 在线考试系统(附源码+论文)

1,绪论 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理编程训练系统的相关信息成为必然…...

割草机器人行业市场分析报告【5】- 政策、标准与合规环境

第5章:政策、标准与合规环境 5.1 各国环保政策、燃油设备禁令时间表 环保政策与燃油禁令是驱动割草机器人需求的结构性力量,其影响力正在加速显现。...

如何快速配置FF14智能钓鱼计时器:渔人的直感完全指南

如何快速配置FF14智能钓鱼计时器:渔人的直感完全指南 【免费下载链接】Fishers-Intuition 渔人的直感,最终幻想14钓鱼计时器 项目地址: https://gitcode.com/gh_mirrors/fi/Fishers-Intuition 想要在《最终幻想14》中成为钓鱼大师吗?渔…...

安全认证与访问控制

文章目录One Time Password一次性密码平台认证Basic Authentication 基本认证Digest Auth 摘要认证NTLM认证协议Kerberos 网络身份验证协议Token Authentication 令牌认证OAuth Authentication 第三方授权登录API Key AuthenticationSession-Cookie 会话认证ip白名单/白名单认证…...

如何通过SQL改写避免走全表扫描_添加过滤条件与强制索引提示

索引不会自动生效,需WHERE匹配最左前缀且无函数/类型转换;JOIN驱动表选择、OR/IS NULL处理、数据分布变化均影响索引使用,优化需综合评估数据分布、查询频率与写入压力。WHERE 条件没写对,索引根本不会用MySQL 和 PostgreSQL 都不…...

多语言下拉选择器的统一状态管理与 sessionStorage 持久化实践

本文详解如何通过 jQuery 统一控制多个语言切换下拉框&#xff08;<select>&#xff09;的状态同步、初始渲染与持久化&#xff0c;避免因事件绑定混乱或 sessionStorage 未初始化导致的显示错乱问题。 本文详解如何通过 jquery 统一控制多个语言切换下拉框&#xf…...

操作系统 | 处理机调度全解析

&#x1f355; 操作系统的“外卖派单员”&#xff1a;CPU 调度与死锁全攻略 &#x1f69a;&#x1f4a8;大家好&#xff01;&#xff01;&#xff01;☕️想象一下&#xff0c;你是一个拥有无限披萨&#xff08;CPU时间&#xff09;的披萨店老板&#xff0c;而你的店里只有一个…...

HarmonyOS应用开发全流程深度解析:从入门到精通的20000字指南

第一章 鸿蒙生态架构与开发理念1.1 鸿蒙操作系统双版本体系 HarmonyOS与OpenHarmony构成华为"18N"全场景战略的技术底座。商业版HarmonyOS由华为维护&#xff0c;集成消费级设备专有功能&#xff1b;开源版OpenHarmony由开放原子基金会管理&#xff0c;适配工业、电网…...

不只是骷髅海:从《亡灵》设定看游戏设计中“死亡”主题的5种高级玩法与平衡性设计

超越骷髅海&#xff1a;游戏设计中死亡主题的五大高阶玩法与平衡艺术 当《魔兽争霸3》中死亡骑士高举霜之哀伤召唤食尸鬼大军时&#xff0c;玩家第一次体验到亡灵军团"越打越多"的独特快感。但二十年后的今天&#xff0c;单纯的数量压制早已无法满足硬核玩家对策略深…...

达梦数据库修改参数方法

一般用sp_set_para_value()修改新版本达梦支持alter system修改&#xff0c;很类似oracle的命令具体语法树尝试一下 19:42:34 SYSDBALOCALHOST:5236> alter system set dmsql_et_cnt50000 spfile; DMSQL 过程已成功完成 已用时间: 11.967(毫秒). 执行号:13217. 19:42:48 SY…...

如何用3步快速掌握ChanlunX缠论自动化分析终极方法

如何用3步快速掌握ChanlunX缠论自动化分析终极方法 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否在股票技术分析中感到困惑&#xff1f;面对复杂的缠论理论&#xff0c;手动绘制笔、段、中枢结构…...