hqyj—驱动—day3

ioctl控制马达,LED灯,风扇,蜂鸣器运行

LED

LED驱动程序:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/io.h>
#include "stm32mp1xx_gpio.h"
#include <linux/device.h>#define PHY_LED_RCC 0x50000A28//物理地址对应的虚拟地址
gpio_t * vir_GPIOE;
gpio_t * vir_GPIOF;unsigned int *vir_rcc;//定义两个结构体存放信息
struct class *cls;
struct device *dev;char kbuf[128] = {0};//定义一个变量保存主设备号
unsigned int major;
//封装操作方法
int mycdev_open(struct inode *inode, struct file *file)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}ssize_t mycdev_read(struct file *file, char *ubuf, size_t size, loff_t *lof)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}ssize_t mycdev_write(struct file *file, const char *ubuf, size_t size, loff_t *lof)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}int mycdev_close(struct inode *inode, struct file *file)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}long mycdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{switch (cmd){case LED_ON:switch (arg){case 1:vir_GPIOE->ODR |=(0x1 << 10);break;case 2:vir_GPIOF->ODR |=(0x1 << 10);break;case 3:vir_GPIOE->ODR |=(0x1 << 8);break;}break;case LED_OFF:switch (arg){case 1:vir_GPIOE->ODR &=(~(0x1 << 10));break;case 2:vir_GPIOF->ODR &=(~(0x1 << 10));break;case 3:vir_GPIOE->ODR &=(~(0x1 << 8));break;}break;}return 0;
}struct file_operations fops={.open = mycdev_open,.release = mycdev_close,.read = mycdev_read,.write = mycdev_write,.unlocked_ioctl = mycdev_ioctl,
};static int __init mycdev_init(void)
{int i;//注册字符设备驱动major = register_chrdev(0,"mychrdev",&fops);if(major < 0){printk("注册字符设备驱动失败\n");return major;}printk("注册字符设备驱动成功 major=%d\n",major);//向上提交目录cls = class_create(THIS_MODULE,"myled");if(IS_ERR(cls)){printk("向上提交目录失败\n");return -PTR_ERR(cls);}printk("向上提交目录成功\n");//向上提交设备节点信息for(i = 0;i < 3; i++){dev = device_create(cls,NULL,MKDEV(major,i),NULL,"myled%d",i);}if(IS_ERR(dev)){printk("向上提交设备节点信息失败\n");return -PTR_ERR(dev);}printk("向上提交设备节点信息成功\n");//物理地址映射虚拟地址vir_GPIOE = ioremap(GPIOE,0x30);if(vir_GPIOE == NULL){printk("物理地址映射虚拟地址失败%d\n",__LINE__);return -EFAULT;}vir_GPIOF = ioremap(GPIOF,0x30);if(vir_GPIOF == NULL){printk("物理地址映射虚拟地址失败%d\n",__LINE__);return -EFAULT;}vir_rcc = ioremap(PHY_LED_RCC,4);if(vir_rcc == NULL){printk("物理地址映射虚拟地址失败%d\n",__LINE__);return -EFAULT;}//硬件初始化(*vir_rcc) |= (0x3 << 4);  //rcc第4,5位置1//PE10 led1vir_GPIOE->MODER &= (~(0x3 << 20));vir_GPIOE->MODER |= (0x1 << 20);vir_GPIOE->ODR &=(~(0x1 << 10));//PF10 led2vir_GPIOF->MODER &= (~(0x3 << 20));vir_GPIOF->MODER |= (0x1 << 20);vir_GPIOF->ODR &=(~(0x1 << 10));//PE8 led3vir_GPIOE->MODER &= (~(0x3 << 16));vir_GPIOE->MODER |= (0x1 << 16);vir_GPIOE->ODR &=(~(0x1 << 8));return 0;
}
static void __exit mycdev_exit(void)
{//取消地址映射iounmap(vir_GPIOE);iounmap(vir_GPIOF);iounmap(vir_rcc);//销毁节点信息int i;for(i = 0;i < 3;i++){device_destroy(cls,MKDEV(major,i));}//销毁目录信息class_destroy(cls);//注销字符设备驱动unregister_chrdev(major,"mychadev");}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

LED应用程序:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>//功能码
#define LED_ON _IOW('l',1,int)
#define LED_OFF _IOW('l',0,int)
int main(int argc, char const *argv[])
{int a,b;char buf[128] = {0};int fd = open("/dev/myled0", O_RDWR);if (fd < 0){printf("打开设备文件失败\n");exit(-1);}while (1){printf("请输入控制命令\n");printf("0(关灯),1(开灯)\n");printf("请输入>");scanf("%d",&a);printf("请输入要控制的灯 1(LED1),2(LED2),3(LED3)>");scanf("%d",&b);switch (a){case 1:ioctl(fd,LED_ON,b); //开灯break;case 0:ioctl(fd,LED_OFF,b);//关灯break;}}close(fd);return 0;
}

蜂鸣器

蜂鸣器驱动:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/io.h>
#include "stm32mp1xx_gpio.h"
#include <linux/device.h>//mybee PB6
#define PHY_LED_RCC 0x50000A28//物理地址对应的虚拟地址
gpio_t * vir_GPIOB;unsigned int *vir_rcc;//定义两个结构体存放信息
struct class *cls;
struct device *dev;char kbuf[128] = {0};//定义一个变量保存主设备号
unsigned int major;
//封装操作方法
int mycdev_open(struct inode *inode, struct file *file)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}ssize_t mycdev_read(struct file *file, char *ubuf, size_t size, loff_t *lof)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}ssize_t mycdev_write(struct file *file, const char *ubuf, size_t size, loff_t *lof)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}int mycdev_close(struct inode *inode, struct file *file)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}long mycdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{switch (cmd){case BEE_ON:vir_GPIOB->ODR |=(0x1 << 6);break;case BEE_OFF:vir_GPIOB->ODR &=(~(0x1 << 6));break;}return 0;
}struct file_operations fops={.open = mycdev_open,.release = mycdev_close,.read = mycdev_read,.write = mycdev_write,.unlocked_ioctl = mycdev_ioctl,
};static int __init mycdev_init(void)
{int i;//注册字符设备驱动major = register_chrdev(0,"mychrdev",&fops);if(major < 0){printk("注册字符设备驱动失败\n");return major;}printk("注册字符设备驱动成功 major=%d\n",major);//向上提交目录cls = class_create(THIS_MODULE,"mybee");if(IS_ERR(cls)){printk("向上提交目录失败\n");return -PTR_ERR(cls);}printk("向上提交目录成功\n");//向上提交设备节点信息dev = device_create(cls,NULL,MKDEV(major,0),NULL,"mybee");if(IS_ERR(dev)){printk("向上提交设备节点信息失败\n");return -PTR_ERR(dev);}printk("向上提交设备节点信息成功\n");//物理地址映射虚拟地址vir_GPIOB = ioremap(GPIOB,0x30);if(vir_GPIOB == NULL){printk("物理地址映射虚拟地址失败%d\n",__LINE__);return -EFAULT;}vir_rcc = ioremap(PHY_LED_RCC,4);if(vir_rcc == NULL){printk("物理地址映射虚拟地址失败%d\n",__LINE__);return -EFAULT;}//硬件初始化(*vir_rcc) |= (0x1 << 1);  //rcc第4,5位置1//PB6 beevir_GPIOB->MODER &= (~(0x3 << 12));vir_GPIOB->MODER |= (0x1 << 12);vir_GPIOB->ODR &=(~(0x1 << 6));return 0;
}
static void __exit mycdev_exit(void)
{//取消地址映射iounmap(vir_GPIOB);iounmap(vir_rcc);//销毁节点信息device_destroy(cls,MKDEV(major,0));//销毁目录信息class_destroy(cls);//注销字符设备驱动unregister_chrdev(major,"mychadev");}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

蜂鸣器应用程序:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>//功能码
#define BEE_ON _IO('b',1)
#define BEE_OFF _IO('b',0)int main(int argc, char const *argv[])
{int a;int fd = open("/dev/mybee", O_RDWR);if (fd < 0){printf("打开设备文件失败\n");exit(-1);}while (1){printf("请输入控制命令\n");printf("0(蜂鸣器不响),1(蜂鸣器响)\n");printf("请输入>");scanf("%d",&a);switch (a){case 1:ioctl(fd,BEE_ON); //break;case 0:ioctl(fd,BEE_OFF);//break;}}close(fd);return 0;
}

风扇

风扇驱动:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/io.h>
#include "stm32mp1xx_gpio.h"
#include <linux/device.h>//myfan PE9
#define PHY_LED_RCC 0x50000A28//物理地址对应的虚拟地址
gpio_t * vir_GPIOE;unsigned int *vir_rcc;//定义两个结构体存放信息
struct class *cls;
struct device *dev;char kbuf[128] = {0};//定义一个变量保存主设备号
unsigned int major;
//封装操作方法
int mycdev_open(struct inode *inode, struct file *file)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}ssize_t mycdev_read(struct file *file, char *ubuf, size_t size, loff_t *lof)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}ssize_t mycdev_write(struct file *file, const char *ubuf, size_t size, loff_t *lof)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}int mycdev_close(struct inode *inode, struct file *file)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}long mycdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{switch (cmd){case FAN_ON:vir_GPIOE->ODR |= (0x1 << 9);break;case FAN_OFF:vir_GPIOE->ODR &= (~(0x1 << 9));break;}return 0;
}struct file_operations fops={.open = mycdev_open,.release = mycdev_close,.read = mycdev_read,.write = mycdev_write,.unlocked_ioctl = mycdev_ioctl,
};static int __init mycdev_init(void)
{int i;//注册字符设备驱动major = register_chrdev(0,"mychrdev",&fops);if(major < 0){printk("注册字符设备驱动失败\n");return major;}printk("注册字符设备驱动成功 major=%d\n",major);//向上提交目录cls = class_create(THIS_MODULE,"myfan");if(IS_ERR(cls)){printk("向上提交目录失败\n");return -PTR_ERR(cls);}printk("向上提交目录成功\n");//向上提交设备节点信息dev = device_create(cls,NULL,MKDEV(major,0),NULL,"myfan");if(IS_ERR(dev)){printk("向上提交设备节点信息失败\n");return -PTR_ERR(dev);}printk("向上提交设备节点信息成功\n");//物理地址映射虚拟地址vir_GPIOE = ioremap(GPIOE,0x30);if(vir_GPIOE == NULL){printk("物理地址映射虚拟地址失败%d\n",__LINE__);return -EFAULT;}vir_rcc = ioremap(PHY_LED_RCC,4);if(vir_rcc == NULL){printk("物理地址映射虚拟地址失败%d\n",__LINE__);return -EFAULT;}//硬件初始化(*vir_rcc) |= (0x1 << 4);  //rcc第4位置1//PE9 fanvir_GPIOE->MODER &= (~(0x3 << 18));vir_GPIOE->MODER |= (0x1 << 18);vir_GPIOE->ODR &=(~(0x1 << 9));return 0;
}
static void __exit mycdev_exit(void)
{//取消地址映射iounmap(vir_GPIOE);iounmap(vir_rcc);//销毁节点信息device_destroy(cls,MKDEV(major,0));//销毁目录信息class_destroy(cls);//注销字符设备驱动unregister_chrdev(major,"mychadev");}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

风扇应用程序:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>//功能码
#define FAN_ON _IO('f',1)
#define FAN_OFF _IO('f',0)int main(int argc, char const *argv[])
{int a;int fd = open("/dev/myfan", O_RDWR);if (fd < 0){printf("打开设备文件失败\n");exit(-1);}while (1){printf("请输入控制命令\n");printf("0(风扇不转),1(风扇转)\n");printf("请输入>");scanf("%d",&a);switch (a){case 1:ioctl(fd,FAN_ON); //break;case 0:ioctl(fd,FAN_OFF);//break;}}close(fd);return 0;
}

马达

马达驱动:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/io.h>
#include "stm32mp1xx_gpio.h"
#include <linux/device.h>//mybee PF6
#define PHY_LED_RCC 0x50000A28//物理地址对应的虚拟地址
gpio_t * vir_GPIOF;unsigned int *vir_rcc;//定义两个结构体存放信息
struct class *cls;
struct device *dev;char kbuf[128] = {0};//定义一个变量保存主设备号
unsigned int major;
//封装操作方法
int mycdev_open(struct inode *inode, struct file *file)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}ssize_t mycdev_read(struct file *file, char *ubuf, size_t size, loff_t *lof)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}ssize_t mycdev_write(struct file *file, const char *ubuf, size_t size, loff_t *lof)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}int mycdev_close(struct inode *inode, struct file *file)
{//printk("%s;%s;%d",__FILE__,__func__,__LINE__);return 0;
}long mycdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{switch (cmd){case MADA_ON:vir_GPIOF->ODR |=(0x1 << 6);break;case MADA_OFF:vir_GPIOF->ODR &=(~(0x1 << 6));break;}return 0;
}struct file_operations fops={.open = mycdev_open,.release = mycdev_close,.read = mycdev_read,.write = mycdev_write,.unlocked_ioctl = mycdev_ioctl,
};static int __init mycdev_init(void)
{int i;//注册字符设备驱动major = register_chrdev(0,"mychrdev",&fops);if(major < 0){printk("注册字符设备驱动失败\n");return major;}printk("注册字符设备驱动成功 major=%d\n",major);//向上提交目录cls = class_create(THIS_MODULE,"mymada");if(IS_ERR(cls)){printk("向上提交目录失败\n");return -PTR_ERR(cls);}printk("向上提交目录成功\n");//向上提交设备节点信息dev = device_create(cls,NULL,MKDEV(major,0),NULL,"mymada");if(IS_ERR(dev)){printk("向上提交设备节点信息失败\n");return -PTR_ERR(dev);}printk("向上提交设备节点信息成功\n");//物理地址映射虚拟地址vir_GPIOF = ioremap(GPIOF,0x30);if(vir_GPIOF == NULL){printk("物理地址映射虚拟地址失败%d\n",__LINE__);return -EFAULT;}vir_rcc = ioremap(PHY_LED_RCC,4);if(vir_rcc == NULL){printk("物理地址映射虚拟地址失败%d\n",__LINE__);return -EFAULT;}//硬件初始化(*vir_rcc) |= (0x1 << 5);  //rcc第4,5位置1//PB6 beevir_GPIOF->MODER &= (~(0x3 << 12));vir_GPIOF->MODER |= (0x1 << 12);vir_GPIOF->ODR &=(~(0x1 << 6));return 0;
}
static void __exit mycdev_exit(void)
{//取消地址映射iounmap(vir_GPIOF);iounmap(vir_rcc);//销毁节点信息device_destroy(cls,MKDEV(major,0));//销毁目录信息class_destroy(cls);//注销字符设备驱动unregister_chrdev(major,"mychadev");}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

 马达应用程序:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>//功能码
#define MADA_ON _IO('m',1)
#define MADA_OFF _IO('m',0)int main(int argc, char const *argv[])
{int a;int fd = open("/dev/mymada", O_RDWR);if (fd < 0){printf("打开设备文件失败\n");exit(-1);}while (1){printf("请输入控制命令\n");printf("0(马达不转),1(马达转)\n");printf("请输入>");scanf("%d",&a);switch (a){case 1:ioctl(fd,MADA_ON); //break;case 0:ioctl(fd,MADA_OFF);//break;}}close(fd);return 0;
}

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

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

相关文章

深度学习初探

1.深度学习模型训练过程 1&#xff09;数据&#xff08;数据清洗标注&#xff09; 2&#xff09;模型&#xff08;模型的构建和初始化&#xff09; 3&#xff09;损失&#xff08;前向传播的过程&#xff0c;得到模型的输出和真实标签的差异值&#xff0c;称之为损失&#x…

深度学习常用优化器总结,具详细(SGD,Momentum,AdaGrad,Rmsprop,Adam,Adamw)

学习需要&#xff0c;总结一些常用优化器。 目录 前言SGD&#xff1a;随机梯度下降BGD&#xff1a;批量梯度下降MBGD&#xff1a;小批量梯度下降MomentumAdaGradRMSpropAdam: Adaptive Moment EstimationAdamW参考文章 前言 优化器的本质是使用不同的策略进行参数更新。常用的…

springboot jar分离部署

springboot jar分离部署 注意&#xff1a;spring boot web项目别使用jsp页面&#xff0c;可以使用模板代替&#xff0c;jsp打包时访问页面会报404错误。 1.具体配置如下&#xff1a; <build><plugins><!--更换maven的jar打包插件先前使用的是spring-boot-mav…

【C++】多态

一、多态的概念 多态&#xff0c;顾名思义就是多种状态。 多态概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个例子:比如买票这个行为&#xff0c;当普通人买票时&#xff…

【CSS】 vh、rem 和 px 的区别

vh、rem 和 px 都是 CSS 中常见的长度单位&#xff0c;它们有以下区别&#xff1a; px&#xff08;像素&#xff09;是一个绝对单位&#xff0c;表示屏幕上的实际像素点。它的大小不会根据设备或浏览器的设置进行调整&#xff0c;是一个固定值。 rem&#xff08;根元素字体大小…

【PostgreSQL内核学习(八)—— 查询执行(查询执行策略)】

查询执行 查询执行概述查询执行策略可优化语句和数据定义语句四种执行策略策略选择实现Portal执行的过程 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在适用的…

Mysql——》缓存池大小innodb_buffer_pool_size

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

基于LoRA微调部署Stable Diffusion【免费试用阿里云】

文章目录 Stable Diffusion介绍环境及资源准备过程注交互式建模&#xff08;PAI-DSW&#xff09;的试用在创建的工作空间中创建实例安装 Diffusers Stable Diffusion介绍 Stable Diffusion 是一种文本到图像的潜在扩散模型&#xff0c;由 Runway 和慕尼黑大学合作构建&#xf…

vue开发环境搭建指南

nodejs下载和安装 从nodejs官网下载nodejs安装版本(愿配置环境变量的可以下载zip版本,解压,添加path环境变量) 在命令行里运行 node -v显示如下版本,则安装成功 10.15.3 #vue-cli3安装 在命令行里运行 npm i -g @vue/cli查看版本号 vue -V显示如下版本,则安装成功 3…

Centos7.9_瀚高数据库企业版6.0.4_为瀚高PG安装PostGis插件_支持geometry类型_矢量地理信息数据---国产瀚高数据库工作笔记004

在给瀚高PG安装PostGis之前需要安装: proj,geos,gdal 1.首先安装依赖,可以一次性安装 yum install -y python-devel perl-ExtUtils-Embed python-devel gcc-c++ openssl-devel readline readline-devel zlib zlib-devel openssl openssl-devel pam pam-devel libxml2 libxml…

微信小程序反编译

PC--微信小程序反编译 小程序反编译工具&#xff1a; 免责声明&#xff1a;不得将小程序反编译源码程序和反编译图片素材挪作商业或盈利用 使用教程地&#xff1a;https://www.kancloud.cn/ludeqi/xcxzs/2607637 最新版下载地址&#xff1a;https://xcx.siqingw.top/xcx.zip 小…

Python Flask构建微信小程序订餐系统 (十二)

🔥 创建切换商品分类状态的JS文件 🔥 ; var food_act_ops={init:function(){this.eventBind();},eventBind:function(){//表示作用域var that = this;$(".wrap_search select[name=status]").change(function(){$(".wrap_search").submit();});$(&qu…

海外网红营销合作指南:详解海外合同与协议要点

随着互联网的发展和社交媒体的普及&#xff0c;海外网红营销成为了品牌推广和营销的重要力量。然而&#xff0c;这种跨国合作需要谨慎考虑&#xff0c;签订合适的合同与协议显得尤为重要&#xff0c;以确保各方权益得到保障并促进合作的顺利进行。本文Nox聚星将详细介绍与海外网…

web前端设计师的主要职责说明(合集)

web前端设计师的主要职责说明1 职责&#xff1a; 1. 根据UI设计师提供的设计图&#xff0c;实现一流的Web界面&#xff0c;优化代码并保持在各浏览器下良好的兼容性; 2. Web前端表现层及与后端交互的架构设计和开发; 3. JavaScript程序模块开发&#xff0c;通用类库、框架编…

STM32 互补PWM 带死区 HAL

1、设置PWM波频率100KHz&#xff0c;占空比50%&#xff0c;死区时间1us 2、 while 循环之前启动PWM HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); //启动TIM1_CH1 PWM输出 HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);//启动TIM1_CH1N PWM输出 3、死区计算 DT_time…

每日一题——判断链表中是否有环

题目 判断给定的链表中是否有环。如果有环则返回true&#xff0c;否则返回false。 数据范围&#xff1a;链表长度 0≤n≤10000&#xff0c;链表中任意节点的值满足 ∣val∣<100000 要求&#xff1a;空间复杂度 O(1)&#xff0c;时间复杂度 O(n) 输入分为两部分&#xff0c…

优维低代码实践:添加构件

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

平面设计师怎么找素材优漫动游

1平面设计师怎么找素材 平面设计师找素材可以有这几个方法&#xff1a;1.百度关键词;2.图片收集类的网站或者设计师聚集网站;3.在微博上关注一些设计方面的官博;4.多加些同行设计群等。 平面设计师怎么找素材 平面设计师怎么找素材 1.最简单粗暴的方法&#xff0c;百度…

HCIA静态路由综合实验(eNSP)

实验题目及要求&#xff1a; 1、分析IP地址分配。 主干IP掩码均为30&#xff1b; 环回IP掩码为28&#xff0c;方便汇总掩码27&#xff1b; 然后预留部分IP地址。 如下图&#xff1a; 2、按如上图片要求连接设备&#xff0c;并标记好IP分配信息&#xff0c;便于命令配置时一…

Jenkins环境配置篇-邮件发送

作为持续集成的利器Jenkins已经得到了广泛地应用&#xff0c;仅仅作为一个工具&#xff0c;Jenkins已然有了自己的生态圈&#xff0c;支持其的plugin更是超过1300。在实际中如何使用以及如何更好地使用jenkins&#xff0c;一直是大家在实践并讨论的。本系列文章将会从如何使用j…