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];

};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

transformer.js(四): 模型接口介绍

前面的文章底层架构及性能优化指南介绍了transformer.js的架构和优化策略&#xff0c;在本文中&#xff0c;将详细介绍 transformer.js 的模型接口&#xff0c;帮助你了解如何在 JavaScript 环境中使用这些强大的工具。 推荐阅读 ansformer.js&#xff08;二&#xff09;&…

使用 Elasticsearch 构建食谱搜索(二)

这篇文章是之前的文章 “使用 Elasticsearch 构建食谱搜索&#xff08;一&#xff09;” 的续篇。在这篇文章中&#xff0c;我将详述如何使用本地 Elasticsearch 部署来完成对示例代码的运行。该项目演示了如何使用 Elastic 的 ELSER 实现语义搜索并将其结果与传统的词汇搜索进…

1、HCIP之RSTP协议与STP相关安全配置

目录 RSTP—快速生成树协议 STP STP的缺点&#xff1a; STP的选举&#xff08;Listening状态中&#xff09;&#xff1a; RSTP P/A&#xff08;提议/同意&#xff09;机制 同步机制&#xff1a; 边缘端口的配置&#xff1a; RSTP的端口角色划分&#xff1a; ensp模拟…

hhdb数据库介绍(9-21)

计算节点参数说明 checkClusterBeforeDnSwitch 参数说明&#xff1a; PropertyValue参数值checkClusterBeforeDnSwitch是否可见否参数说明集群模式下触发数据节点高可用切换时&#xff0c;是否先判断集群所有成员正常再进行数据节点切换默认值falseReload是否生效是 参数设…

java基础概念38:正则表达式3-捕获分组

一、定义 分组就是一个小括号。 分组的特点&#xff1a; 二、捕获分组 捕获分组就是把这一组的数据捕获出来&#xff0c;再用一次。 后续还要继续使用本组的数据。 正则内部使用&#xff1a;\\组号正则外部使用&#xff1a;$组号 2-1、正则内部使用&#xff1a;\\组号 示…

使用Mac下载MySQL修改密码

Mac下载MySQL MySQL官网链接MySQL​​​​​​ 当进入到官网后下滑到community社区&#xff0c;进行下载 然后选择community sever下载 这里就是要下载的界面&#xff0c;如果需要下载之前版本的话可以点击archives&#xff0c; 可能会因为这是外网原因&#xff0c;有时候下…

【初阶数据结构篇】队列的实现(赋源码)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

【云计算】腾讯云架构高级工程师认证TCP--考纲例题,知识点总结

【云计算】腾讯云架构高级工程师认证TCCP–知识点总结&#xff0c;排版整理 文章目录 1、云计算架构概论1.1 五大版块知识点&#xff08;架构设计&#xff0c;基础服务&#xff0c;高阶技术&#xff0c;安全&#xff0c;上云&#xff09;1.2 课程详细目录1.3 云基础架构设计1.4…

AR智能眼镜|AR眼镜定制开发|工业AR眼镜方案

AR眼镜的设计与制造成本主要受到芯片、显示屏和光学方案的影响&#xff0c;因此选择合适的芯片至关重要。一款优秀的芯片平台能够有效提升设备性能&#xff0c;并解决多种技术挑战。例如&#xff0c;采用联发科八核2.0GHz处理器&#xff0c;结合12nm制程工艺&#xff0c;这种低…

大数据新视界 -- 大数据大厂之 Impala 性能优化:集群资源动态分配的智慧(上)(23 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

代理池搭建优化-(书接上回,优化改进)

炮台有效炮弹实现 声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者…

光伏业务管理系统能解决光伏企业什么问题?

随着技术进步和市场规模的扩大&#xff0c;光伏企业面临着日益复杂的管理挑战&#xff0c;包括但不限于项目监管、运维管理、供应链优化、客户管理以及数据分析决策等方面。为了解决这些挑战&#xff0c;光伏业务管理系统应运而生&#xff0c;成为提升光伏企业运营效率、降低成…

【UE5】在材质中计算模型在屏幕上的比例

ViewProperty节点有很多有意思的变量 例如用 ViewProperty 的 tan ⁡ ( FOV / 2 ) \tan(\text{FOV} / 2) tan(FOV/2) 输出&#xff0c;用它计算模型占屏幕的比例。 &#xff08;常用于for运算的次数优化&#xff0c;也可以用于各种美术效果&#xff09; ScaleOnScreen Obje…

2024年人工智能技术赋能网络安全应用测试:广东盈世在钓鱼邮件识别场景荣获第三名!

近期&#xff0c;2024年国家网络安全宣传周“网络安全技术高峰论坛主论坛暨粤港澳大湾区网络安全大会”在广州成功举办。会上&#xff0c;国家计算机网络应急技术处理协调中心公布了“2024年人工智能技术赋能网络安全应用测试结果”。结果显示&#xff0c;广东盈世计算机科技有…

spring @Async

讨论一下 spring boot 下 使用 spring 异步执行的注解 先看下这个类&#xff1a; 这个类是 spring boot auto configure 下完成 TaskExecutor的自动配置。 1. 需要在类路径存在 ThreadPoolTaskExecutor&#xff0c;这个类是 是spring context模块下的类&#xff0c;也就是 需…

搜维尔科技:多画面显示3D系统解决方案,数据孪生可视化大屏3D展示技术

集成多画面系统 集成多画面系统解决方案 1.适合多个用户的紧凑型入门级解决方案 2.会议室功能、审批功能、3D模型讨论等多种使用可能性 3.配有组合设备&#xff0c;方便整合 CAVE 多画面显示系统 1.专业的大屏幕多画面解决方案 2.墙壁、天花板和地板三面CAVE 3.专为沉浸…

linux从0到1——shell编程7

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

数据科学与SQL:组距分组分析 | 区间分布问题

目录 0 问题描述 1 数据准备 2 问题分析 3 小结 0 问题描述 绝对值分布分析也可以理解为组距分组分析。对于某个指标而言&#xff0c;一个记录对应的指标值的绝对值&#xff0c;肯定落在所有指标值的绝对值的最小值和最大值构成的区间内&#xff0c;根据一定的算法&#x…

大数据调度组件之Apache DolphinScheduler

Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。 主要特性 易于部署&#xff0c;提供四种部署方式&#xff0c;包括Standalone、Cluster、Docker和…

使用 前端技术 创建 QR 码生成器 API1

前言 QR码&#xff08;Quick Response Code&#xff09;是一种二维码&#xff0c;于1994年开发。它能快速存储和识别数据&#xff0c;包含黑白方块图案&#xff0c;常用于扫描获取信息。QR码具有高容错性和快速读取的优点&#xff0c;广泛应用于广告、支付、物流等领域。通过扫…