我是靠谱客的博主 开放金鱼,最近开发中收集的这篇文章主要介绍内核中的位图介绍(DECLARE_BITMAP宏)1、DECLARE_BITMAP宏定义2、宏展开分析3、find_first_zero_bit宏 和 set_bit宏,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、DECLARE_BITMAP宏定义

#define	DIV_ROUND_UP(x,y)	(((x) + ((y) - 1)) / (y))	//向上取整
#define BITS_TO_LONGS(nr)	DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
#define DECLARE_BITMAP(name,bits) unsigned long name[BITS_TO_LONGS(bits)]

(1)位图:用每一个bit来表示一个含义。比如你需要标记32个资源的占用情况,可以用一个int型变量(刚好32bit)来标记,bit位为0代表资源空闲,bit为1表示资源被占用,你通过位运算检查每个bit的值就知道对应资源的占用情况。
(2)宏的定义是用来定义一个位图变量,本质就是一个unsigned long类型的数组。比如你要标记38个资源,但是一个unsigned long类型变量只有32bit,所以就要定义2个unsigned long类型变量(总共有64bit),但是实际只用到38bit;
(3)宏的参数:name是变量名,bits是位图有多少个位,就是需要多少个bit;

2、宏展开分析

#宏定义
#define DYNAMIC_MINORS 64 
DECLARE_BITMAP(misc_minors, DYNAMIC_MINORS);
#宏展开分析
unsigned long misc_minors[BITS_TO_LONGS(64)]
unsigned long misc_minors[BITS_TO_LONGS(64)]
unsigned long misc_minors[DIV_ROUND_UP(64, 8 * sizeof(long))]
unsigned long misc_minors[(((64) + ((32) - 1)) / (32))]
unsigned long misc_minors[2]
#宏展开最终
unsigned long misc_minors[2];

(1)定义了unsigned long类型的数组,数组名是misc_minors,有2个成员变量;
(2)DECLARE_BITMAP宏会向上取整。这里位图大小是64,两个unsigned long变量刚好是64bit,如果位图大小是65,则数组会定义3个unsigned long类型成员,3个unsigned long类型变量总共96bit,但是实际只用到65bit。

3、find_first_zero_bit宏 和 set_bit宏

#ifndef __ARMEB__
//小端
#define set_bit(nr,p)
ATOMIC_BITOP_LE(set_bit,nr,p)
#define find_first_zero_bit(p,sz)	_find_first_zero_bit_le(p,sz)
#else
//大端
#define set_bit(nr,p)
ATOMIC_BITOP_BE(set_bit,nr,p)
#define find_first_zero_bit(p,sz)	_find_first_zero_bit_be(p,sz)
#endif

(1)find_first_zero_bit宏:返回位图中第一个值为0的bit的下标,也就是没有被占用的;
(2)set_bit宏:将位图中的某个位置为1,表示被占用;
(3)具体应用:参考博客:《内核的misc驱动框架详解:内核源码分析、蜂鸣器驱动分析》;

最后

以上就是开放金鱼为你收集整理的内核中的位图介绍(DECLARE_BITMAP宏)1、DECLARE_BITMAP宏定义2、宏展开分析3、find_first_zero_bit宏 和 set_bit宏的全部内容,希望文章能够帮你解决内核中的位图介绍(DECLARE_BITMAP宏)1、DECLARE_BITMAP宏定义2、宏展开分析3、find_first_zero_bit宏 和 set_bit宏所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部