Linux第96步_Linux中的宏DIV_ROUND_UP和BITS_TO_LONGS

Linux中的宏DIV_ROUND_UP和BITS_TO_LONGS,搜索网络,发现很多人在理解上有问题。说DIV_ROUND_UP这个宏是向上取整数,按照定义,不能自圆其说。答案是对的,凑答案,导致结果正确

现分析如下:

1、下面是是从Linux摘取的宏定义:

打开“/home/zgq/linux/atk-mp1/linux/my_linux/linux-5.4.31/include/linux/bitops.h”

#define DIV_ROUND_UP(n,d) ( ((n) + (d) - 1) / (d) )

#define BITS_PER_TYPE(type) (sizeof(type) * BITS_PER_BYTE)

//BITS_PER_BYTE表示每个字节8位

#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_TYPE(long))

//BITS_PER_TYPE(long)的值为8*8=64,即long型数据为64位,注意:这里的nr>0

//当1<nr<=64,返回值为1,表示占用1个long型数据

//当64<nr<=128,返回值为2,表示占用2个long型数据

//当128<nr<=192,返回值为3,表示占用3个long型数据

 

2、应用举例

打开

/home/zgq/linux/atk-mp1/linux/my_linux/linux-5.4.31/include/uapi/linux/input-event-codes.h

#define INPUT_PROP_MAX 0x1f

#define INPUT_PROP_CNT (INPUT_PROP_MAX + 1) //INPUT_PROP_CNT=32

#define EV_MAX 0x1f

#define EV_CNT (EV_MAX+1) //定义EV_CNT为32

#define KEY_MAX 0x2ff

#define KEY_CNT (KEY_MAX+1) //KEY_CNT=768

#define REL_MAX 0x0f

#define REL_CNT (REL_MAX+1) //REL_CNT=16

打开

/home/zgq/linux/atk-mp1/linux/my_linux/linux-5.4.31/include/uapi/linux/input-event-codes.h

#define ABS_MAX 0x3f

#define ABS_CNT (ABS_MAX+1) //ABS_CNT=64

#define MSC_MAX 0x07

#define MSC_CNT (MSC_MAX+1) //MSC_CNT=8

#define LED_MAX 0x0f

#define LED_CNT (LED_MAX+1) //LED_MAX=16

#define SND_MAX 0x07

#define SND_CNT (SND_MAX+1) //SND_CNT=8

/home/zgq/linux/atk-mp1/linux/my_linux/linux-5.4.31/include/uapi/linux/input.h

#define FF_MAX 0x7f

#define FF_CNT (FF_MAX+1) //FF_CNT=128

#define SW_MAX 0x0f

#define SW_CNT (SW_MAX+1) //SW_CNT=16

struct input_dev {

const char *name;

const char *phys;

const char *uniq;

struct input_id id;

unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];

    /*INPUT_PROP_CNT=32,(32+63)/64取整数为1占用1个long型空间*/

unsigned long evbit[BITS_TO_LONGS(EV_CNT)];

/*表示输入事件类型*/

/*EV_CNT=32,(32+63)/64取整数为1占用1个long型空间*/

unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];

   /*KEY_CNT=768,(768+63)/64取整数为12占用12个long型空间*/

unsigned long relbit[BITS_TO_LONGS(REL_CNT)];

/*REL_CNT=16,(16+63)/64取整数为1占用1个long型空间*/

unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];

/*ABS_CNT=64,(64+63)/64取整数为1占用1个long型空间*/

unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];

/*MSC_CNT=8,(8+63)/64取整数为1占用1个long型空间*/

unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];

/*LED_CNT=16,(16+63)/64取整数为1占用1个long型空间*/

unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];

/*SND_CNT=8,(8+63)/64取整数为1占用1个long型空间*/

unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];

/*FF_CNT=128,(128+63)/64取整数为2占用2个long型空间*/

unsigned long swbit[BITS_TO_LONGS(SW_CNT)];

/*SW_CNT=16,(16+63)/64取整数为1占用1个long型空间*/

unsigned int hint_events_per_packet;

unsigned int keycodemax;

unsigned int keycodesize;

void *keycode;

int (*setkeycode)(struct input_dev *dev,

  const struct input_keymap_entry *ke,

  unsigned int *old_keycode);

int (*getkeycode)(struct input_dev *dev,

  struct input_keymap_entry *ke);

struct ff_device *ff;

struct input_dev_poller *poller;

unsigned int repeat_key;

struct timer_list timer;

int rep[REP_CNT];

struct input_mt *mt;

struct input_absinfo *absinfo;

unsigned long key[BITS_TO_LONGS(KEY_CNT)];

unsigned long led[BITS_TO_LONGS(LED_CNT)];

unsigned long snd[BITS_TO_LONGS(SND_CNT)];

unsigned long sw[BITS_TO_LONGS(SW_CNT)];

int (*open)(struct input_dev *dev);

void (*close)(struct input_dev *dev);

int (*flush)(struct input_dev *dev, struct file *file);

int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);

struct input_handle __rcu *grab;

spinlock_t event_lock;

struct mutex mutex;

unsigned int users;

bool going_away;

struct device dev;

struct list_head h_list;

struct list_head node;

unsigned int num_vals;

unsigned int max_vals;

struct input_value *vals;

bool devres_managed;

ktime_t timestamp[INPUT_CLK_MAX];

};

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

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

相关文章

JavaWeb-表格标签-06

表格标签 table code: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>表格标签</title><…

【Stable Diffusion】 超大尺寸绘制、分区控制,详解Tiled Diffusion VAE插件功能

今天&#xff0c;我们将向您介绍一款令人兴奋的AI工具——Tiled Diffusion & VAE插件。这是一款基于Stable Diffusion技术的创新应用&#xff0c;旨在为您提供超大尺寸绘制和分区控制的便捷体验。无论您是AI绘画的新手还是专业人士&#xff0c;这个工具都能为您带来极大的便…

【大数据分析机器学习】分布式机器学习

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…

染色质重塑与心衰中的细胞间通讯机制:解读一篇Nature力作

染色质重塑与心衰中的细胞间通讯机制&#xff1a;解读一篇Nature力作 一、文献的主要行文思路与观点 在这篇发表在 Nature 的文章中&#xff0c;作者聚焦于心脏衰竭中的慢性炎症与纤维化问题&#xff0c;试图揭示免疫细胞与成纤维细胞之间的通讯机制。研究围绕以下几个核心问题…

WordPress添加类似说说、微博的时间轴微语页面

这个版本的WordPress可以直接使用&#xff0c;CSS样式可以完美兼容。效果如图 使用方法&#xff1a; 一、后台配置 新建微语功能 将下面的代码复制粘贴到主题的functions.php函数文件中&#xff0c;为WordPress添加微语功能。添加完成后&#xff0c;可以在WordPress后台菜单…

解决IDEA报包不存在,但实际存在的问题

前言 最近在把一个亿老项目交割给同事&#xff0c;同事在导入项目运行时遇到IDEA报包不存在&#xff0c;但实际存在的问题&#xff0c;最终通过以下方式解决 现象 在IDEA里启动运行项目&#xff0c;报某个类有问题&#xff0c;引入的包不存在。 点击这个引入的包&#xff0c;可…

云原生之k8s服务管理

文章目录 服务管理Service服务原理ClusterIP服务 对外发布应用服务类型NodePort服务Ingress安装配置Ingress规则 Dashboard概述 认证和授权ServiceAccount用户概述创建ServiceAccount 权限管理角色与授权 服务管理 Service 服务原理 容器化带来的问题 自动调度&#xff1a;…

RocketMQ: 集群部署注意事项

概述 RocketMQ 是一款分布式、队列模型的消息中间件&#xff0c;具有以下特点&#xff1a; 能够保证严格的消息顺序提供丰富的消息拉取模式高效的订阅者水平扩展能力实时的消息订阅机制亿级消息堆积能力 选用理由&#xff1a; 强调集群无单点&#xff0c;可扩展&#xff0c;任…

【Unity How】Unity中如何实现物体的匀速往返移动

直接上代码 using UnityEngine;public class CubeBouncePingPong : MonoBehaviour {[Header("移动参数")][Tooltip("移动速度")]public float moveSpeed 2f; // 控制移动的速度[Tooltip("最大移动距离")]public float maxDistance 5f; // 最大…

ECharts柱状图-带圆角的堆积柱状图,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

element-plus的组件数据配置化封装 - table

目录 一、封装的table、table-column组件以及相关ts类型的定义 1、ATable组件的封装 - index.ts 2、ATableColumn组件的封装 - ATableColumn.ts 3、ATable、ATableColumn类型 - interface.ts 二、ATable、ATableColumn组件的使用 三、相关属性、方法的使用以及相关说明 1. C…

《数字图像处理基础》学习06-图像几何变换之最邻近插值法缩小图像

目录 一&#xff0c;概念 二&#xff0c;题目 三&#xff0c;matlab实现 对图像进行几何变换时&#xff0c;都是对数字图像进行处理。由于在matlab中使用imread函数读取的图像通常已经是数字图像&#xff0c;因此不需要进行额外的采样和量化等操作&#xff0c;就可以将图像…

TabNet 模型示例

代码功能 加载数据&#xff1a;从 UCI Adult Census 数据集中读取样本&#xff0c;进行清洗和编码。 特征处理&#xff1a;对分类特征进行标签编码&#xff0c;对数值特征进行标准化。 模型训练&#xff1a;使用 TabNet 模型对数据进行分类训练&#xff0c;采用早停机制提高效…

一次封装,解放双手:Requests如何实现0入侵请求与响应的智能加解密

引言 之前写了 Requests 自动重试的文章&#xff0c;突然想到&#xff0c;之前还用到过 Requests 自动加解密请求的逻辑&#xff0c;分享一下。之前在做逆向的时候&#xff0c;发现一般医院的小程序请求会这么玩&#xff0c;请求数据可能加密也可能不加密&#xff0c;但是返回…

锂电池学习笔记(一) 初识锂电池

前言 锂电池近几年一直都是很热门的产品&#xff0c;充放电管理更是学问蛮多&#xff0c;工作生活中难免会碰到&#xff0c;所以说学习锂电池是工程师的必备知识储备&#xff0c;今天学习锂电池的基本知识&#xff0c;分类&#xff0c;优缺点&#xff0c;循序渐进 学习参考 【…

《Vue零基础入门教程》第四课: 应用实例

往期内容 《Vue零基础入门教程》第一课&#xff1a;Vue简介 《Vue零基础入门教程》第二课&#xff1a;搭建开发环境 《Vue零基础入门教程》第三课&#xff1a;起步案例 参考官方文档 https://cn.vuejs.org/api/application#create-app 示例 const {createApp} Vue// 通…

介绍一下strncmp(c基础)

strncmp是strcmp的进阶版 链接介绍一下strcmp(c基础)-CSDN博客 作用 比较两个字符串的前n位 格式 #include <string.h> strncmp (arr1,arr2,n); 工作原理&#xff1a;strcmp函数按照ACII&#xff08;字符编码顺序&#xff09;比较两个字符串。它从两个字符串的第一…

Lucene(2):Springboot整合全文检索引擎TermInSetQuery应用实例附源码

前言 本章代码已分享至Gitee: https://gitee.com/lengcz/springbootlucene01 接上文。Lucene(1):Springboot整合全文检索引擎Lucene常规入门附源码 如何在指定范围内查询。从lucene 7 开始&#xff0c;filter 被弃用&#xff0c;导致无法进行调节过滤。 TermInSetQuery 指定…

【电路笔记 TMS320F28335DSP】时钟+看门狗+相关寄存器(功能模块使能、时钟频率配置、看门狗配置)

时钟源和主时钟&#xff08;SYSCLKOUT&#xff09; 外部晶振&#xff1a;通常使用外部晶振&#xff08;如 20 MHz&#xff09;作为主要时钟源。内部振荡器&#xff1a;还可以选择内部振荡器&#xff08;INTOSC1 和 INTOSC2&#xff09;&#xff0c;适合无需高精度外部时钟的应…

java 并发编程 (1)java中如何实现并发编程

目录 1. 继承 Thread 类 2. 实现 Runnable 接口 3. 使用 FutureTask 4. 使用 Executor 框架 5. 具体案例 1. 继承 Thread 类 概述&#xff1a;通过继承 Thread 类并重写其 run() 方法来创建一个新的线程。 步骤&#xff1a; 创建一个继承 Thread 类的子类。重…