void*传数据,是不是像在黑洞里面拯救世界?

news2024/11/14 19:45:41

内核代码看到这样一个函数

static inline void dev_set_drvdata(struct device *dev, void *data)
{
  dev->driver_data = data;
}

这个函数有什么用?

看里面的代码含义大概就能知道,给 driver_data这个指针赋值,之后在其他地方就可以用这个指针的内容拿到私有结构体成员。

在 include/linux/device.h

里面,可以看到dev这个结构体中关于void*driver_data的定义

void *driver_data; /* Driver data, set and get with
             dev_set_drvdata/dev_get_drvdata */

看注释可以看到还有dev_get_drvdata和dev_set_drvdata函数

dev_get_drvdata的函数原型是这样

static inline void *dev_get_drvdata(const struct device *dev)
{
  return dev->driver_data;
}

要注意的是,这个函数返回是没有做任何判断的,直接就把指针返回了,如果使用这个指针的人不注意的话,那是有可能导致内核挂逼的。

下面这个驱动代码

在注册了input子系统之后,使用dev_set_drvdata把这个指针赋值给device结构体里面的变量。

static int rb532_button_probe(struct platform_device *pdev)
{
  struct input_polled_dev *poll_dev;
  int error;

  poll_dev = input_allocate_polled_device();
  if (!poll_dev)
    return -ENOMEM;

  poll_dev->poll = rb532_button_poll;
  poll_dev->poll_interval = RB532_BTN_RATE;

  poll_dev->input->name = "rb532 button";
  poll_dev->input->phys = "rb532/button0";
  poll_dev->input->id.bustype = BUS_HOST;
  poll_dev->input->dev.parent = &pdev->dev;

  dev_set_drvdata(&pdev->dev, poll_dev);

  input_set_capability(poll_dev->input, EV_KEY, RB532_BTN_KSYM);

之后在使用的地方再使用dev_get_drvdata来获取数据指针

这样就可以不使用全局变量,这也体现了内核高内聚低耦合的特点。

static int rb532_button_remove(struct platform_device *pdev)
{
  struct input_polled_dev *poll_dev 
  = dev_get_drvdata(&pdev->dev);

  input_unregister_polled_device(poll_dev);
  input_free_polled_device(poll_dev);

  return 0;
}

除了在同一个驱动代码里面使用,如果在不同的文件中,也是可以使用到的。

c0f52805cd385fb00b51b699226a8ef6.png

660645d0e32bcefe72c4d21b65f41d31.jpeg

13b1d6c28589183b2d7f163fcb83588d.jpeg

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

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

相关文章

《C语言高级》(二)------ 函数与指针 篇

目录 一、函数 1.1、创建和使用函数 1.2、全局变量与局部变量 1.3、函数的参数和返回 1.4、递归调用 1.5、斐波那契数列解法其三 1.6、汉诺塔 1.7、快速排序算法 二、指针 2.1、初识指针 2.2、指针与数组 2.3、多级指针 2.4、指针数组与数组指针 2.5、指针函数与函数指…

SpringCloud入门实战(五)-集成Ribbon

一、Ribbon简介 Spring Cloud Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单地说,就是在配置文件中列出Load Balancer(简称LB)后面所有…

python爬虫学习笔记-mongodb安装基本介绍pymongo使用

MongoDB数据存储 MongoDB是一个非关系型数据库(NoSQL). 非常适合超大数据集的存储, 由 C 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系…

Spring Cloud_OpenFeign服务接口调用

目录一、概述1.OpenFeign是什么2.能干嘛二、OpenFeign使用步骤1.接口注解2.新建Module3.POM4.YML5.主启动类6.业务类7.测试8.小总结三、OpenFeign超时控制1.超时设置,故意设置超时演示出错情况2.是什么3.YML中需要开启OpenFeign客户端超时控制四、OpenFeign日志打印…

论文投稿指南——中文核心期刊推荐(水路运输)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

Json的语法及使用

Json的语法及使用前言一、Json是什么?二、Json语法三、Json示例前言 在数据传输时用到Json格式,在此稍作记录。 一、Json是什么? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)JSON 是轻量级的文本…

零入门容器云网络实战-4->ip地址分类尝试

本篇文章主要用于收集、整理、总结关于IP地址相关知识点。 1、IP地址分类? IPv4地址是指IPv4协议使用的32位地址。 为了便于对IP地址进行管理, 根据IPv4地址的第一个字节,IPv4地址可以分为以下五类。 A类:0~127 B类&#xff1…

【Linux】Linux自动化构建工具make/makefile

文章目录🎪 Linux自动化构建工具make/makefile🚀 1.Makefile文件格式⭐1.1 简单makefile例子⭐1.2 概述⭐1.3 目标(target)⭐1.4 前置条件(prerequisites)⭐1.5 命令(commands)🚀 2.Makefile文件语法⭐2.1 注释⭐2.2 回声⭐2.3 通配符⭐2.4 变…

4-异步:非阻塞IO

4-异步:非阻塞I_O 简介 什么是Node.js的非阻塞I/O I/O 即 Input/Output. 也就是一个系统的输入和输出阻塞I/O和非阻塞I/O的却别就在于系统接收输入再到输出期间,能不能接收其他输入 对于这两句话的理解,可以把系统比作服务员,…

React 实现自动上报 PV/Click 的埋点 Hooks

自定义 hooks 是基于 React Hooks 的一个拓展,我们可以根据业务需求制定满足业务需要的组合 hooks,更注重的是逻辑单元。怎样把一段逻辑封装起来,做到复用,这才是自定义 hooks 的初衷。 自定义 hooks 也可以说是 React Hooks 的聚…

【并发编程十三】c++原子操作

【并发编程十三】c原子操作一、改动序列1、改动序列2、预测执行二、原子操作及其类别1、原子操作2、非原子操作3、原子类型三、标准原子类型1、标准原子类型的两种实现方式2、原子操作的用途3、原子操作的宏四、操作std:atomic_flag1、简介2、使用说明3、使用std:atomic_flag实…

Kettle(16):Kitchen作业执行引擎

在Linux中对Kettle做Linux配置(和Windows相同,添加驱动jar包) 上传以后需要重启。 1 在Windows中开发作业 2 配置Start组件 3 配置转换组件 修改Kettle&

【HBase——陌陌海量存储案例】1.案例介绍与HBase表结构设计(上)

前言 本系列接【HBase入门】系列文章后实战案例的学习。 学习目标 能够掌握HBase表结构设计(表设计、ROWKEY设计、预分区) 能够安装部署Apache Phoenix 能够掌握Phoenix的基本操作 能够掌握使用Phoenix建立二级索引提升性能 能够基于Phoenix JDBC API编…

Ubuntu安装ROS(每个步骤图文详细)

Ubuntu安装ROS(每个步骤图文详细)前言(推荐安装)ROS对应的Ubuntu的版本换源安装ROS一、添加ROS软件源二、添加密钥三、安装ROS-melodic四、初始化rosdep可能出现的问题:一 、 **sudo: rosdep:找不到命令**二…

算法_位运算x(-x)和x(x-1)

最近在跟着y总学算法。 今天学到了两个很经典的位运算,x&(-x)和x&(x-1): x&(-x):保留二进制下最后出现的1的位置,其余位置置0(即一个数中最大的2的n次幂的因数 x&(x-1):消除二进制下最后…

SpringCloud整合Zookeeper代替Eureka

目录 一、注册中心Zookeeper 二、服务提供者 三、服务消费者 一、注册中心Zookeeper zookeeper是一个分布式协调工具,可以实现注册中心功能 关闭Linux服务器防火墙后启动zookeeper服务器 zookeeper服务器取代Eureka服务器,zk作为服务注册中心 Lin…

ORA-600 kcbzpbuf_1故障恢复----惜分飞

数据库启动报错ORA-03113SQL> startup;ORACLE instance started. Total System GlobalArea 5.1310E10 bytesFixed Size 2265224 bytesVariable Size 1.8119E10 bytesDatabaseBuffers 3.3152E10 bytesRedo Buffers 36069376 bytesDatabasemounted. ORA-03113: end-of-file on…

二叉树的层序遍历

二叉树的层序遍历 层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。 需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。 而这种层序遍历方式就是…

Java:基于XML的Spring使用

基于XML的Spring使用一、Spring IOC 底层实现1.1 BeanFactory与ApplicationContexet1.2 图解IOC类的结构二、 Spring依赖注入数值问题【重点】2.1 字面量数值2.2 CDATA区2.3 外部已声明bean及级联属性赋值2.4 内部bean2.5 集合三、 Spring依赖注入方式【基于XML】3.1 set注入3.…

白炽灯护眼还是LED护眼?盘点专业护眼的LED护眼灯

目前大多数家庭都会购买台灯使用,选择白炽灯还是LED灯呢?建议是LED灯更护眼。白炽灯缺点:耗电、发光效率低、温度过高不安全。白炽灯优点:体积小、显色能力好。LED灯缺点:价格较高、显色能力比白炽灯弱一些。LED灯优点&#xff1a…