字符设备驱动模版-中断
字符设备驱动模版-中断
思维导图在线高清查看:https://www.helloimg.com/i/2025/01/27/679791b5257c0.png
修改设备树
1添加pinctrl节点
-
1创建对应的节点
- 在 iomuxc 节点的 imx6ul-evk 子节点下
-
2添加“fsl,pins”属性
-
3在“fsl,pins”属性中添加PIN配置信息
- imx6ul-pinfunc.h
2添加设备节点
-
1创建设备节点
-
2描述设备树节点的地址和长度所占大小
-
3指定设备的兼容性
-
4指定设备所使用的引脚控制器的名称,default默认值
-
5添加pinctrl信息
-
6添加GPIO属性信息
-
7指定中断控制器的节点路径
-
8设置中断源
-
9指定设备的状态
3检查PIN是否被其他外设使用
-
检查 pinctrl 设置
-
如果这个 PIN 配置为 GPIO 的话,检查这个 GPIO 有没有被别的外设使用
4查看节点是否创建成功
-
1编译make dtbs
-
2拷贝sudo cp arch/arm/boot/dts/imx6ull-alientek-emmc.dtb /home/alientek/linux/tftp/ -f
-
3启动开发板
-
cd /proc/device-tree/
-
cd 节点/
-
ls
-
驱动程序
1基本宏定义
2中断 IO 描述结构体
-
struct irq_keydesc {
}- 使用 irq_keydesc 结构体即可描述一个按键中断
-
1gpio
- int gpio
-
2中断号
- int iqrnum
-
3按键对应的键值
- unsigned char value
-
4名字
- char name[10]
-
5中断服务函数
- irqreturn_t (*handler)(int, void *)
3设备结构体
-
struct imx6uirq_dev{
} -
1设备号
- dev_t devid
-
2cdev
- struct cdev cdev
-
3类
- struct class *class
-
4设备
- struct device *device
-
5主设备号
- int major
-
6次设备号
- int minor
-
7设备节点
- struct device_node *nd
-
8有效的按键键值
- atomic_t keyvalue
-
9标记是否完成一次完成的按键
- atomic_t releasekey
-
10定义一个定时器
- struct timer_list timer
-
11按键描述数组
- struct irq_keydesc irqkeydesc[KEY_NUM]
-
12当前的按键号
- unsigned char curkeynum
4中断服务函数
-
static irqreturn_t key0_handler(int irq, void *dev_id)
-
@param - irq : 中断号
-
@param - dev_id : 设备结构
-
@return : 中断执行结果
-
-
具体步骤
-
1将 dev_id 转换为 struct imx6uirq_dev 结构体指针,并将其赋值给 dev 变量
- 这样可以通过 dev 变量来访问设备的其他成员
-
2具体服务操作
-
-
用到的其他函数
-
修改定时值
-
int mod_timer(struct timer_list *timer, unsigned long expires)
- 如果定时器还没有激活的话,mod_timer 函数会激活定时器
-
timer:要修改超时时间(定时值)的定时器
-
expires:修改后的超时时间
-
返回值:0,调用 mod_timer 函数前定时器未被激活;1,调用 mod_timer 函数前定时器已
被激活
-
-
5定时器服务函数
-
void timer_function(unsigned long arg)
-
@param – arg : 设备结构变量
-
@return : 无
-
-
具体步骤
-
1将 arg 转换为 struct imx6uirq_dev 结构体指针,并将其赋值给 dev 变量
- 这样可以通过 dev 变量来访问设备的其他成员
-
2具体服务操作
-
-
用到的其他函数
-
1获取某个IO的值
-
#define gpio_get_value __gpio_get_value
int __gpio_get_value(unsigned gpio) -
gpio:要获取的 GPIO 标号
-
返回值:非负值,得到的 GPIO 值;负值,获取失败
-
-
2给原子变量赋值
-
void atomic_set(atomic_t *v, int i)
-
向 v 写入 i 值
-
-
6初始化外设IO
-
static int 设备_init(void)
-
具体步骤
-
1获取设备节点
-
2提取 GPIO
-
3初始化 key 所使用的 IO,并且设置成中断模式
-
1缓冲区清零
-
2组合名字
-
3申请GPIO
-
4设置GPIO为输入
-
5获取中断号
-
-
4申请中断
-
5创建定时器
-
-
用到的其他函数
-
1通过路径来查找指定的节点
-
of_find_node_by_path(const char *path)
-
path:带有全路径的节点名,可以使用节点的别名,比如“/backlight”就是 backlight 这个
节点的全路径。 -
返回值:找到的节点,如果为 NULL 表示查找失败
-
-
2获取 GPIO 编号
-
int of_get_named_gpio
(struct device_node *np,
const char *propname,
int index -
np:设备节点
-
propname:包含要获取 GPIO 信息的属性名
-
index:GPIO 索引,因为一个属性里面可能包含多个 GPIO,此参数指定要获取哪个 GPIO
的编号,如果只有一个 GPIO 信息的话此参数为 0 -
返回值:正值,获取到的 GPIO 编号;负值,失败
-
-
3将一块内存区域的内容设置为指定的值
-
void *memset(void *ptr, int value, size_t num)
-
常见用途是将内存区域清零,即将所有字节设置为0
-
ptr:指向要设置值的内存区域的指针
-
value:要设置的值,以整数形式表示
-
num:要设置的字节数
-
-
4将格式化的数据写入字符串缓冲区
-
str:指向目标字符串缓冲区的指针,用于存储格式化后的数据
-
format:格式化字符串,指定了要写入缓冲区的数据的格式
-
…:可变参数列表,根据 format 字符串中的格式化指示符,指定要写入缓冲区的数据
-
-
5申请一个 GPIO 管脚
-
int gpio_request(unsigned gpio, const char *label)
-
gpio:要申请的 gpio 标号,使用 of_get_named_gpio 函数从设备树获取指定 GPIO 属性信息,此函数会返回这个 GPIO 的标号。
-
label:给 gpio 设置个名字
-
返回值:0,申请成功;其他值,申请失败
-
-
6设置某个 GPIO 为输入
-
int gpio_direction_input(unsigned gpio)
-
gpio:要设置为输出的 GPIO 标号
-
返回值:0,设置成功;负值,设置失败
-
-
7获取中断号
-
unsigned int irq_of_parse_and_map(struct device_node *dev,
int index)- 可以处理未注册的GPIO引脚,并且更加灵活
-
dev:设备节点
-
index:索引号,interrupts 属性可能包含多条中断信息,通过 index 指定要获取的信息
-
返回值:中断号
-
-
8申请中断
-
int request_irq(unsigned int irq,
irq_handler_t handler,
unsigned long flags,
const char *name,
void *dev) -
irq:要申请中断的中断号
-
handler:中断处理函数,当中断发生以后就会执行此中断处理函数
-
flags:中断标志
-
name:中断名字,设置以后可以在/proc/interrupts 文件中看到对应的中断名字
-
dev:如果将 flags 设置为 IRQF_SHARED 的话,dev 用来区分不同的中断,一般情况下将
dev 设置为设备结构体,dev 会传递给中断处理函数 irq_handler_t 的第二个参数 -
返回值:0 中断申请成功,其他负值 中断申请失败,如果返回-EBUSY 的话表示中断已经
被申请了
-
-
9初始化 timer_list 类型变量
-
void init_timer(struct timer_list *timer)
-
timer:要初始化定时器
-
返回值:没有返回值
-
-
7打开设备
-
static 设备_open(struct inode *inode, struct file *filp)
-
@param – inode : 传递给驱动的 inode,文件和目录的元数据结构
-
@param - filp : 文件指针结构体(文件描述)
-
@return : 0成功;其他 失败
-
-
具体步骤
- 1设置私有数据
8从设备读取数据
-
static ssize_t 设备_read(struct file *filp, char __user *buf,
size_t cnt, loff_t *offt)-
@param – filp : 要打开的设备文件(文件描述符)
-
@param – buf : 返回给用户空间的数据缓冲区
-
@param - cnt : 要读取的数据长度
-
@param – offt : 相对于文件首地址的偏移
-
@return : 读取的字节数,如果为负值,表示读取失败
-
-
具体步骤
-
判断是否按下
-
按下
-
判断是否属于松开后按下
-
松开后按下
- 最高位置1
-
未松开后按下
- return -EINVAL
-
按下标志清零
-
-
-
未按下
- return -EINVAL
-
-
-
用到的其他函数
-
1内核空间的数据到用户空间的复制
-
static inline long copy_to_user(void __user *to, const void *from, unsigned long n)
-
to 表示目的
-
from 表示源
-
n 表示要复制的数据长度
-
返回值:如果复制成功,返回值为 0,如果复制失败则返回负数
-
-
2给原子变量赋值
-
void atomic_set(atomic_t *v, int i)
-
向 v 写入 i 值
-
-
9设备操作函数
10驱动入口函数
-
static int __init 设备_init(void)
-
用到的其他函数
-
1初始化自旋锁
-
int spin_lock_init(spinlock_t *lock)
-
lock:指向 spinlock_t 类型的自旋锁变量的指针
-
返回值是一个整数 int,表示初始化是否成功。通常情况下,返回值为 0 表示初始化成功,非零值表示初始化失败
-
-
2将给定的主设备号和次设备号的值组合成 dev_t 类型的设备号
- MKDEV(ma,mi)
-
3注册设备号
-
int register_chrdev_region(dev_t from, unsigned count, const char *name)
- 定了设备的主设备号和次设备号
-
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
- 没有指定设备号
-
from 是要申请的起始设备号,也就是给定的设备号
-
count 是要申请的数量,一 般都是一个
-
name 是设备名字
-
返回值是一个整数 int,表示注册是否成功。通常情况下,返回值为 0 表示注册成功,负数表示注册失败
-
-
4初始化cdev
-
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
-
cdev 就是要初始化的 cdev 结构体变量
-
fops 就是字符设备文件操作函数集合
-
-
5向 Linux 系统添加字符设备(cdev 结构体变量)
-
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
-
p 指向要添加的字符设备(cdev 结构体变量
-
dev 就是设备所使用的设备号
-
count 是要添加的设备数量
-
返回值是一个整数 int,表示添加是否成功。通常情况下,返回值为 0 表示添加成功,负数表示添加失败
-
-
6类创建
-
struct class *class_create (struct module *owner, const char *name)
- 是一个·宏函数
-
owner 一般为 THIS_MODULE
-
name 是类名字
-
返回值是个指向结构体 class 的指针,也就是创建的类
-
-
7创建设备
-
struct device *device_create(struct class *class,
struct device *parent,
dev_t devt,
void *drvdata,
const char *fmt, …) -
class 就是设备要创建哪个类下面
-
参数 parent 是父设备,一般为 NULL,也就是没有父设备
-
devt 是设备号
-
drvdata 是设备可能会使用的一些数据,一般为 NULL
-
fmt 是设备名字,如果设置 fmt=xxx 的话,就会生成/dev/xxx 这个设备文件
-
返回值就是创建好的设备
-
-
8初始化 timer_list 类型变量
-
void init_timer(struct timer_list *timer)
-
timer:要初始化定时器
-
返回值:没有返回值
-
-
-
具体步骤
-
1初始化自旋锁
-
2注册字符设备驱动
-
1注册设备号
-
1.1指定设备号
-
1.1-1主设备号和次设备号合并为一个设备号
-
1.1-2申请设备号
-
-
1.2未指定设备号
-
1.2-1申请设备号
-
1.2-2获取主设备号
-
1.2-3获取次设备号
-
-
1.3输出主次设备号信息
-
-
2初始化cdev
-
3添加cdev
-
4创建类
-
5创建设备
-
6初始化按键
-
1初始化按键有效值为无效
-
2初始化按键是否按下标志位为0
-
3调用按键初始化函数
-
-
-
11驱动出口函数
-
static void __exit 设备_exit(void)
-
用到的其他函数
-
1用于设置某个GPIO的值
-
void __gpio_set_value(unsigned gpio, int value)
-
gpio:要设置的 GPIO 标号
-
value:要设置的值
-
-
2删除定时器
-
int del_timer_sync(struct timer_list *timer)
- 会等待其他处理器使用完定时器再删除
-
int del_timer(struct timer_list * timer)
- 不管定时器有没有被激活,都可以使用此函数删除
-
timer:要删除的定时器
-
返回值:0,定时器还没被激活;1,定时器已经激活
-
-
3从 Linux 内核中删除相应的字符设备
-
void cdev_del(struct cdev *p)
-
p 就是要删除的字符设备
-
-
4设备号释放
-
void unregister_chrdev_region(dev_t from, unsigned count)
-
from:要释放的设备号
-
count:表示从 from 开始,要释放的设备号数量
-
-
5设备删除
-
void device_destroy(struct class *class, dev_t devt)
-
class 是要删除的设备所处的类
-
devt 是要删除的设备号
-
-
6类删除
-
void class_destroy(struct class *cls)
-
cls 就是要删除的类
-
-
7释放中断
-
void free_irq(unsigned int irq,
void *dev) -
irq:要释放的中断
-
dev:如果中断设置为共享(IRQF_SHARED)的话,此参数用来区分具体的中断。共享中断
只有在释放最后中断处理函数的时候才会被禁止掉。
-
-
-
具体步骤
-
1删除定时器
-
2释放中断
-
3注销字符设备驱动
-
1删除cdev
-
2注销设备号
-
3注销设备
-
4注销类
-
-
12指定出入口
-
module_init(xxx_init)
-
module_exit(xxx_exit)
13LICENSE作者信息
-
MODULE_LICENSE(“”)
-
MODULE_AUTHOR(“”)
测试APP
实现的内容如下:
通过不断的读取/dev/imx6uirq 文件来获取按键值,当按键
按下以后就会将获取到的按键值输出在终端上
具体步骤
-
主程序
-
1判断命令参数传输数量是否正确
-
2打开设备驱动
-
3while语句
-
1读取命令
-
2判断命令,执行具体操作
-
-
4关闭文件
-
用到的其他函数
-
1打开设备驱动
-
int open(const char *pathname, int flags)
-
pathname:要打开的设备或者文件名
-
flags:文件打开模式
-
返回值:如果文件打开成功的话返回文件的文件描述符
-
-
2接收键盘数据
-
int scanf(const char *format, …);
-
format 是格式控制字符串,指定了要读取的数据的类型和格式
-
… 表示可变参数,用于指定要读取的变量
-
返回值:返回非1表示参数输入错误
-
-
3读取一行字符串并存储到指定的字符数组中
-
char *gets(char *str)
-
str 存储的数组
-
-
4向驱动发送控制信息
-
对应应用程序的timer_unlocked_ioctl函数
-
ioctl(fd, cmd, arg)
-
filp 是对应的设备文件
-
cmd 是应用程序发送过来的命令信息
-
arg 是应用程序发送过来的参数
-
运行测试
编译
-
修改Makefile
-
make -j32
-
arm-linux-gnueabihf-gcc ledApp.c -o ledApp
将驱动程序和APP移到根文件下
- sudo cp chrdevbase.ko chrdevbaseApp /home/zuozhongkai/linux/nfs/rootfs/lib/modules/4.1.15/ -f
运行
-
1进入到目录 lib/modules/4.1.15 中
-
2depmod //第一次加载驱动的时候需要运行此命令
-
3modprobe gpioled.ko //加载驱动
-
报错
-
modprobe: module ath.ko not found in modules.dep
- 编辑modules.dep
vim /lib/modules/$(shell uname -r)/modules.dep
增加:
kernel/drivers/wifi/ath.ko: //其中kernel/drivers/wifi/为驱动文件路径
- 编辑modules.dep
-
-
-
4输入“lsmod”命令即可查看当前系统中存在的模块
-
5查看中断是否成功注册
- cat /proc/interrupts
-
6用命令测试
-
./ledApp /dev/gpioled 1 //打开 LED 灯
-
./ledApp /dev/gpioled 0 //关闭 LED 灯
-
-
7卸载驱动
- rmmod gpioled.ko
相关文章:
字符设备驱动模版-中断
字符设备驱动模版-中断 思维导图在线高清查看:https://www.helloimg.com/i/2025/01/27/679791b5257c0.png 修改设备树 1添加pinctrl节点 1创建对应的节点 在 iomuxc 节点的 imx6ul-evk 子节点下 2添加“fsl,pins”属性 3在“fsl,pins”属性中添加PIN配置信息 …...
STM32 旋转编码器
旋转编码器简介 旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向 类型:机械触点式/霍尔传…...
java ,springboot 对接支付宝支付,实现生成付款二维码,退款,查询订单状态等接口
查看文档 支付宝文档地址: 小程序文档 - 支付宝文档中心 使用沙箱环境 沙箱登录地址 登录 - 支付宝 点击查看 才能看钥匙截图写错了。。 问号可以看默认加密方式 点击沙箱帐号 这里我们就具备所有条件了 实战开始 pom文件增加依赖 <dependency> <gro…...
OpenCV:形态学梯度
目录 简述 1. 用图像运算和腐蚀实现形态学梯度 1.1 代码示例 1.2 运行结果 2. 形态学梯度接口 2.1 参数解释 2.2 代码示例 2.3 运行结果 3. 形态学梯度与边缘检测 4. 形态学梯度的应用场景 5. 注意事项 相关阅读 OpenCV:图像的腐蚀与膨胀-CSDN博客 简述…...
图漾相机搭配VisionPro使用简易教程
1.下载并安装VisionPro软件 请自行下载VisonPro软件。 VisionPro 9.0/9.5/9.6版本经测试,可正常打开图漾相机,建议使用图漾测试过的版本。 2.下载PercipioCameraForVisionPro软件包 使用浏览器下载:https://gitee.com/percipioxyz/camport3…...
《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》重印P126、P131勘误
勘误:打圈的地方有指数二字。 指数滤波器本身是错误的概念,我在书上打了一个叉,排版人员误删了。 滤波器部分从根本上有问题,本来要改,但是时间不够了。 和廖老师讨论多次后,决定大动。指数滤波器的概念…...
4、PyTorch 第一个神经网络,手写神经网络的基本部分组成
假设有一个二维数据集,目标是根据点的位置将它们分类到两个类别中(例如,红色和蓝色点)。 以下实例展示了如何使用神经网络完成简单的二分类任务,为更复杂的任务奠定了基础,通过 PyTorch 的模块化接口&#…...
Vue实现div滚动,并且支持top动态滚动
如果你知道距离目标 div 顶部的像素值,并希望通过传入 top 参数来实现滚动到对应区域,可以使用 window.scrollTo 方法。 编写滚动方法 const scrollToDiv (targetDiv, top) > {if (targetDiv) {top top * targetDiv.value.scrollHeight / data.he…...
【QT】- QUdpSocket
QUdpSocket 是 Qt 自带的一个类,属于 Qt 网络模块,用于进行 UDP(用户数据报协议) 通信。它提供了简便的接口来发送和接收 UDP 数据报(datagrams)。 UDP 是一种无连接的协议,适用于那些不需要确…...
WGCLOUD运维工具从入门到精通 - 如何设置主题背景
需要升级到WGCLOUD的v3.5.7或者以上版本,才会支持自定义设置主题背景色 WGCLOUD下载:www.wgstart.com 我们登录后,在右上角点击如下的小图标,就可以设置主题背景色了,包括:经典白(默认&#x…...
【Elasticsearch】中数据流需要配置索引模板吗?
是的,数据流需要配置索引模板。在Elasticsearch中,数据流(Data Streams)是一种用于处理时间序列数据的高级结构,它背后由多个隐藏的索引组成,这些索引被称为后备索引(Backing Indices࿰…...
Python 合并 Excel 单元格
合并 Excel 单元格是 Excel 数据处理和表格设计中的一项常用操作。例如,在制作表格标题时,经常会将多个单元格合并,使标题能够跨列显示,更加醒目和美观。此外,当对数据进行分类时,为了使同一类别的数据在视…...
C++中左值和右值的概念
文章目录 一、概要二、左值(Lvalue)二、右值(Rvalue)三、左值引用和右值引用四、左值和右值的使用场景五、总结 一、概要 在 C 中,左值(Lvalue)和右值(Rvalue)是两个非常…...
27.日常算法
1. 最后一个单词的长度 题目来源 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s “Hello Wor…...
动态规划DP 数字三角形模型 传纸条(题目分析+C++完整代码)
传纸条 原题链接 AcWing 275. 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。 一次素质拓展活动中,班上同学安排坐成一个 m行 n 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此&#x…...
Spark入门(Python)
目录 一、安装Spark 二、Spark基本操作 一、安装Spark pip3 install pyspark 二、Spark基本操作 # 导入spark的SparkContext,SparkConf模块 from pyspark import SparkContext, SparkConf # 导入os模块 import os # 设置PYSPARK的python环境 os.environ[PYSPARK_PYTHON] &…...
.NET Core缓存
目录 缓存的概念 客户端响应缓存 cache-control 服务器端响应缓存 内存缓存(In-memory cache) 用法 GetOrCreateAsync 缓存过期时间策略 缓存的过期时间 解决方法: 两种过期时间策略: 绝对过期时间 滑动过期时间 两…...
IoTDB 2025 春节值班与祝福
2025 春节快乐 瑞蛇迎吉庆,祥光映华年,2025 春节已近在眼前。社区祝福 IoTDB 的所有关注者、支持者、使用者 2025 新年快乐,“蛇”来运转! IoTDB 团队的春节放假时间为 2025 年 1 月 27 日至 2 月 4 日,1 月 25 日、26…...
Qt Ribbon使用实例
采用SARibbon创建简单的ribbon界面 实例代码如下所示: 1、头文件: #pragma once #include <SARibbonBar.h> #include "SARibbonMainWindow.h" class QTextEdit; class SAProjectDemo1 : public SARibbonMainWindow { Q_OBJECT pub…...
maven的打包插件如何使用
默认的情况下,当直接执行maven项目的编译命令时,对于结果来说是不打第三方包的,只有一个单独的代码jar,想要打一个包含其他资源的完整包就需要用到maven编译插件,使用时分以下几种情况 第一种:当只是想单纯…...
Linux——rzsz工具
rzsz这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件. 安装完毕之后可以通过拖拽的方式将文件上传过去. 安装rzsz工具 rz:从Windows机器上传到远程Linux机器(或者直接把文件托进Xshell中) sz:将文件从Linux远…...
航空客户价值的数据挖掘与分析(numpy+pandas+matplotlib+scikit-learn)
文章目录 航空客户价值的数据挖掘与分析(numpy+pandas+matplotlib+scikit-learn)写在前面背景与挖掘目标1.1 需求背景1.2 挖掘目标1.3 项目概述项目分析方法规划2.1 RFM模型2.2 LRFMC模型指标2.3 分析总体流程图数据抽取探索及预处理3.1 数据抽取3.2 数据探索分析3.3 数据预处…...
【文星索引】搜索引擎项目测试报告
目录 一、项目背景二、 项目功能2.1 数据收集与索引2.2 API搜索功能2.3 用户体验与界面设计2.4 性能优化与维护 三、测试报告3.1 功能测试3.2 界面测试3.3 性能测试3.4 兼容性测试3.5 自动化测试 四、测试总结4.1 功能测试方面4.2 性能测试方面4.3 用户界面测试方面 一、项目背…...
【C++】特殊类设计、单例模式与类型转换
目录 一、设计一个类不能被拷贝 (一)C98 (二)C11 二、设计一个类只能在堆上创建对象 (一)将构造函数私有化,对外提供接口 (二)将析构函数私有化 三、设计一个类只…...
Nxopen 直齿轮参数化设计
NXUG1953 Visualstudio 2019 参考论文: A Method for Determining the AGMA Tooth Form Factor from Equations for the Generated Tooth Root Fillet //FullGear// Mandatory UF Includes #include <uf.h> #include <uf_object_types.h>// Internal I…...
Vue.js组件开发-实现HTML内容打印
在Vue项目中实现打印功能,可以借助vue-html-to-paper插件来完成。 步骤 创建Vue项目:如果还没有Vue项目,可以使用Vue CLI来创建一个新的项目。 npm install -g vue/cli vue create vue-print-template cd vue-print-template安装vue-html-…...
大模型GUI系列论文阅读 DAY4续:《Large Language Model Agent for Fake News Detection》
摘要 在当前的数字时代,在线平台上虚假信息的迅速传播对社会福祉、公众信任和民主进程构成了重大挑战,并影响着关键决策和公众舆论。为应对这些挑战,自动化假新闻检测机制的需求日益增长。 预训练的大型语言模型(LLMs࿰…...
Day27-【13003】短文,线性表两种基本实现方式空间效率、时间效率比较?兼顾优点的静态链表是什么?如何融入空闲单元链表来解决问题?
文章目录 本次内容总览第四节,两种基本实现方式概览两种基本实现方式的比较元素个数n大于多少时,使用顺序表存储的空间效率才会更高?时间效率比较?*、访问操作,也就是读运算,读操作1、插入,2、删…...
Scrapy如何设置iP,并实现IP重用, IP代理池重用
前置知识 1/3乐观锁 2/3 Scrapy流程(非全部) 3/3 关于付费代理 我用的"快代理", 1000个ip, 每个ip1min的有效期, 你用的时候, 把你的链接, 用户名填上去就行 设置代理IP 🔒 & 帮助文档: ①meta ②meta#proxy$ 语法: ①proxy的设置: Request对象中…...
动手学图神经网络(4):利用图神经网络进行图分类
利用图神经网络进行图分类:从理论到实践 引言 在之前的学习中,大家了解了如何使用图神经网络(GNNs)进行节点分类。本次教程将深入探讨如何运用 GNNs 解决图分类问题。图分类是指在给定一个图数据集的情况下,根据图的一些结构属性对整个图进行分类,而不是对图中的节点进…...
C++游戏开发深度解析
引言 在本篇文章中,我们将深入探讨C在游戏开发中的应用,包括内存管理、面向对象编程(OOP)、模板使用等,并通过实际代码示例来帮助理解。 内存管理与智能指针 cpp 深色版本 #include <iostream> #include <…...
ultralytics 是什么?
ultralytics 是一个用于计算机视觉任务的 Python 库,专注于提供高效、易用的目标检测、实例分割和图像分类工具。它最著名的功能是实现 YOLO(You Only Look Once) 系列模型,特别是最新的 YOLOv8。 1. YOLO 是什么? YO…...
【从零到一,C++项目实战】CineShare++(基于C++的视频点播系统)
🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…...
kaggle-ISIC 2024 - 使用 3D-TBP 检测皮肤癌-学习笔记
问题描述: 通过从 3D 全身照片 (TBP) 中裁剪出单个病变来识别经组织学确诊的皮肤癌病例 数据集描述: 图像临床文本信息 评价指标: pAUC,用于保证敏感性高于指定阈值下的AUC 主流方法分析(文本) 基于CatBoo…...
C语言深入解析 printf的底层源码实现
深入解析 printf 的底层源码实现 printf 是 C 标准库中最常用的函数之一,用于格式化输出字符串。它的底层实现复杂且高效,包含多个模块化的函数和机制。本文结合 GNU C Library(glibc)的源码,详细分析 printf 的实现原…...
IPhone14 Pro 设备详情
目录 产品宣传图内部图——后设备详细信息 产品宣传图 内部图——后 设备详细信息 信息收集于HubWeb.cn...
vim多文件操作如何同屏开多个文件
[rootxxx ~]# vimdiff aa.txt bb.txt cc.txt #带颜色比较的纵向排列打开的同屏多文件操作 示例: [rootxxx ~]# vimdiff -o aa.txt bb.txt cc.txt #带颜色比较的横向排列打开的同屏多文件操作 示例: [rootxxx ~]# vim -O aa.txt bb.txt c…...
18款炫酷烟花合集
系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现18款炫酷烟花的代码。 Python Python烟花① 完整代码:Python动漫烟花(完整代码)-CSDN博客 Python烟…...
服务器虚拟化技术详解与实战:架构、部署与优化
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言 在现代 IT 基础架构中,服务器虚拟化已成为提高资源利用率、降低运维成本、提升系统灵活性的重要手段。通过服务…...
01.双Android容器解决方案
目录 写在前面 一,容器 1.1 容器的原理 1.1.1 Namespace 1.1.2 Cgroups(Control Groups) 1.1.3 联合文件系统(Union File System) 1.2 容器的应用 1.2.1 微服务架构 1.2.2 持续集成和持续部署(CI/C…...
C++封装红黑树实现mymap和myset和模拟实现详解
文章目录 map和set的封装map和set的底层 map和set的模拟实现insertiterator实现的思路operatoroperator- - map和set的封装 介绍map和set的底层实现 map和set的底层 一份模版实例化出key的rb_tree和pair<k,v>的rb_tree rb_tree的Key和Value不是我们之前传统意义上的key/…...
嵌入式知识点总结 Linux驱动 (一)-指令-常用Linux指令 GCC指令 GDB调试指令 驱动开发指令
针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.怎么查看当前进程?怎么执行退出?怎么查看当前路径? 2.ls命令执行有什么功能?可以带哪些参数? 3.创建目录用什么命令…...
数字化创新者如何利用开源2+1链动模式AI智能名片S2B2C商城小程序源码重塑市场地位
摘要:在数字化转型的浪潮中,数字化创新者正通过整合前沿技术,重塑行业格局,引领市场变革。本文深入探讨了开源21链动模式、AI智能名片以及S2B2C商城小程序源码等技术在数字化创新中的应用,旨在揭示这些技术如何助力企业…...
以用户为中心,优化 B 端界面设计
在数字化转型的进程中,B 端产品已成为企业高效运营的关键支撑,而 B 端界面设计则是决定其成败的核心要素。以用户为中心优化 B 端界面,不仅能提升员工操作体验,还能为企业运营注入强大动力。 以用户为中心,意味着深入洞…...
微服务学习-服务调用组件 OpenFeign 实战
1. OpenFeign 接口方法编写规范 1.1. 在编写 OpenFeign 接口方法时,需要遵循以下规范 1.1.1.1. 接口中的方法必须使用 RequestMapping、GetMapping、PostMapping 等注解声明 HTTP 请求的类型。 1.1.1.2. 方法的参数可以使用 RequestParam、RequestHeader、PathVa…...
使用国内镜像加速器解决 Docker Hub 拉取镜像慢或被屏蔽的问题
一、问题背景 Docker Hub 是 Docker 默认的镜像仓库,但由于网络限制,国内用户直接拉取镜像可能面临以下问题: 下载速度极慢(尤其是大镜像)。连接超时或完全被屏蔽(部分网络环境)。依赖国外源的…...
反向代理模块。。
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
《十七》浏览器基础
浏览器:是安装在电脑里面的一个软件,能够将页面内容渲染出来呈现给用户查看,并让用户与网页进行交互。 常见的主流浏览器: 常见的主流浏览器有:Chrome、Safari、Firefox、Opera、Edge 等。 输入 URL,浏览…...
飞致云开源社区月度动态报告(2025年1月)
自2023年6月起,中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》,旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况,以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…...
【PyQt5】数据库连接失败: Driver not loaded Driver not loaded
报错内容如下: 可以看到目前所支持的数据库驱动仅有[‘QSQLITE’, ‘QMARIADB’, ‘QODBC’, ‘QODBC3’, ‘QPSQL’, ‘QPSQL7’] 我在网上查找半天解决方法未果,其中有一篇看评论反馈是可以使用的,但是PyQt5的版本有点低,5.12…...