我是靠谱客的博主 体贴白云,最近开发中收集的这篇文章主要介绍bit操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#define BIT(nr) (1UL << (nr))
#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG))
#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
#define BITS_PER_BYTE 8
#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)]

039/**
040 * Bitmap of enabled clocks, excluding ACPU which is always
041 * enabled
042 */
043 static DECLARE_BITMAP(clock_map_enabled, NR_CLKS);
044 static DEFINE_SPINLOCK(clock_map_lock);

clock_map_enabled[BIT_WORD(clk->id)] &= ~BIT_MASK(clk->id);

clock_map_enabled[BIT_WORD(clk->id)] |= BIT_MASK(clk->id);

int clk_enable(struct clk *clk)
076{
077 unsigned long flags;
078 spin_lock_irqsave(&clocks_lock, flags);
079 clk->count++;
080 if (clk->count == 1) {
081 clk->ops->enable(clk->id);
082 spin_lock(&clock_map_lock);
083 clock_map_enabled[BIT_WORD(clk->id)] |= BIT_MASK(clk->id);
084 spin_unlock(&clock_map_lock);
085 }
086 spin_unlock_irqrestore(&clocks_lock, flags);
087 return 0;
088}
089EXPORT_SYMBOL(clk_enable);
090
091 void clk_disable(struct clk *clk)
092{
093 unsigned long flags;
094 spin_lock_irqsave(&clocks_lock, flags);
095 BUG_ON(clk->count == 0);
096 clk->count--;
097 if (clk->count == 0) {
098 clk->ops->disable(clk->id);
099 spin_lock(&clock_map_lock);
100 clock_map_enabled[BIT_WORD(clk->id)] &= ~BIT_MASK(clk->id);
101 spin_unlock(&clock_map_lock);
102 }
103 spin_unlock_irqrestore(&clocks_lock, flags);
104}
105EXPORT_SYMBOL(clk_disable);
void check_clk_is_enable(int clkid)
{
if(clock_map_enabled[BIT_WORD(clkid)] & BIT_MASK(clkid))
{
printk("clk->id %d is enable/n", clkid);
}
}

最后

以上就是体贴白云为你收集整理的bit操作的全部内容,希望文章能够帮你解决bit操作所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部