文章目录

  • 1.1 位图算法-bitmap
    • 1.1.1 bitmap 使用场景示例
    • 1.1.2 bitmap算法实现

1.1 位图算法-bitmap

位图算法,是指使用一个 bit 位来表示数据状态。
位图在 Linux 内核中大量使用。比如,位图可以用来存储系统在线/离线处理器,来支持CPU热插拔;再比如,位图在 Linux 内核等初始化过程中存储已分配的中断请求。

  • lib/bitmap.c
  • include/linux/bitmap.h

1.1.1 bitmap 使用场景示例

假设系统一共只有16个中断,这里以系统的 16 个中断号是否被分配的应用场景为例,假设用 16 个 bit 位,分别表示中断号 0-15bit 位的值 表示该该中断号是否已经分配:

  • 0 表示中断号没有分配;
  • 1 表示中断号已经分配。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1

如上表所示,在该数据集合中,存在的可用的中断号为 8-15,0-7的中断号已经被分配了。

1.1.2 bitmap算法实现

#define LEN 16
#define CHAR_SIZE 8
typedef char BitSet[LEN/CHAR_SIZE];

为了简化问题,LEN 必须定义为 CHAR_SIZE 的倍数。

假设某个时候 中断号8 也需要分配出去使用,那么这个时候就需要对 bit8 进行置为(写1),写入在某个bit位写入数据时:

  • 首先通过整除,计算出该 bit 位在数组的哪个下标;
  • 用取余计算出char元素中的哪个bit上。最后通过或运算将对应位设置为1。
void set(BitSet& bits, int pos) {// 查找对应数组下标,8 / 8 = 1int unit = pos / CHAR_SIZE;// 查找在字节中的bit位int p = pos % CHAR_SIZE; 8 % 8 = 0// 通过与运算实现对应bit位置1bits[unit] = bits[unit] | (0x1 << p);

假如某个时刻,中断号7被释放了,那么需要先查找到对应的位置,然后通过与运算将该位置清空。

void clear(BitSet& bits, int pos) {// 查找对应数组下标int unit = pos / CHAR_SIZE;// 查找在字节中的bit位int p = pos % CHAR_SIZE;// 通过与运算实现对应bit位置1bits[unit] = bits[unit] & (~(0x1 << p));
}

在申请中断号的时候,需要确认某个中断号是否已经被申请了,那么这个时候先计算出bit位置,查找到对应的bit位,然后返回该位置的数值。

int get(BitSet& bits, int pos) {// 查找对应数组下标int unit = pos / CHAR_SIZE;// 查找在字节中的bit位int p = pos % CHAR_SIZE;// 通过与运算实现对应bit位置1return  (bits[unit] & (0x1 << p)) > 0 ? 1 : 0;
}

可以看出位图算法能够节约存储空间,使用 2个字节便可以表示16个中断号的使用状态,同时可以在 O(1) 的时间复杂度下,判断某个中断号的使用情况,大大提高了计算速度。

【ARM 嵌入式 C 入门及渐进 4-- Linux 位图 bitmap】相关推荐

  1. 【ARM 嵌入式 C 入门及渐进 6 -- Linux 内建函数 __builtin_】

    文章目录 1.1 内建函数 1.1.1 内建函数 __builtin_return_address 1.1.2 内建函数 __builtin_frame_address 1.1.3 内建函数 __bu ...

  2. 网络上所谓的《ARM嵌入式系统入门最好的文章》

    一 首先说说ARM的发展 可以用一片大好来形容,翻开各个公司的网站,招聘里面嵌入式占据了大半工程师职位. 广义的嵌入式无非几种:传统的什么51.AVR.PIC称做嵌入式微控制器:ARM是嵌入式微处理器 ...

  3. arm嵌入式linux应用实例开发pdf,零点起步——ARM嵌入式Linux应用开发入门一书的源代码...

    代码片段和文件信息 属性            大小     日期    时间   名称 ----------- ---------  ---------- -----  ---- 文件      2 ...

  4. 收集整理的ARM嵌入式linux开发入门视频教程

    嵌入式Linux作为一个系统学科,具有知识点多,知识难度大,实践操作性强等特点,很多踌躇满志的同学最终倒在了学习嵌入式Linux的道路上,绝大部分也是因为没有掌握嵌入式Linux 的知识规律和学习方法 ...

  5. 嵌入式开发入门之经典 ARM开发板

    嵌入式开发入门之经典 开始进入嵌入式世界,真是一头雾水,不知道如何入手!也不知道该如何学习,学习什么,最近从网上转载这篇文章,对我启发很大,对于初始进入嵌入式的人们很有帮组,好多嵌入式大侠都说这是入门 ...

  6. 嵌入式 Linux 入门(十、Linux 下的 C 编程)

    嵌入式 Linux 入门第十课,聊聊 linux 下的 C 编程...... 矜辰所致 插一句,问题讨论群在文末的推广,以后大家提问可以在群中,即便我不在也能看到历史记录. 目录 前言 一.C 语言编 ...

  7. 基于c语言的linux嵌入式开发入门

    前言 本文主要包含,c语言基本结构与语法.make及makefile的使用.main函数参数与返回值的说明.标准输入.输出.错误流的介绍以及linux管道的应用. 语言数据类型 联合体也有翻译为共用体 ...

  8. 嵌入式linux的运行过程,ARM嵌入式设备Linux系统启动步骤和方式

    > 1). 简介本文引用地址:http://www.eepw.com.cn/article/201607/294237.htm 本文简单介绍ARM嵌入式设备基于嵌入式Linux操作系统时候的启动 ...

  9. 嵌入式跑马灯实验报告linux,ARM嵌入式跑马灯设计实验报告.doc

    ARM嵌入式跑马灯设计实验报告.doc ARM嵌入式设计实验报告 题目: 跑马灯的设计 专 业: 班 级: 姓 名: 学 号: 指导教师: 2014年11 月 目 录 1 题目要求---------- ...

最新文章

  1. 浅议Windows 2000/XP Pagefile组织管理
  2. 聊城中考计算机试题及答案,初中微机模拟考试试题(word版).doc
  3. jQuery笔记之工具方法extend插件扩展
  4. boost::container模块实现虚拟测试分配器的程序
  5. 讲的真透彻!还有人不知道什么是AndroidX的吗?已拿offer入职
  6. 探索性数据分析(EDA)-不要问如何,不要问什么
  7. 网络工程师职业发展路线规划三步走
  8. Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理)
  9. jQuery之事件绑定到触发全过程及知识点补充
  10. Navicat for Mysql 如何备份数据库
  11. REST Assured 55 - JSON Schema Validation In Rest Assured
  12. nginx系列第一篇:nginx源码下载,编译和安装
  13. oracle数字进一函数,oracle常用函数一:数字函数
  14. php168找回管理员密码,如何找回WordPress后台管理员密码
  15. 夯实Java基础系列21:Java8新特性终极指南
  16. nginx 报错502
  17. 外包一个小程序多少钱(外包小程序开发的价格费用)
  18. 国外著名java论坛
  19. Shi-Tomasi角点检测算法
  20. 报错:array_column函数未定义(原因:php版本问题)

热门文章

  1. [胡说八道]我的时间我做主——读《小强升职记》有感
  2. SMETA验厂辅导,对于已经通过了审核公司的ETI标准验厂,如何将验厂结果上传到SEDEX上
  3. 什么是uuid以及uuid在java中的使用
  4. MapReduce(深入)---案例之用户上行流量 下行流量 总流量倒序 按省份分区
  5. Java API--IO流整理
  6. 云原生和云计算的区别,普通人都能看懂!
  7. 一篇标准的审稿意见回复(Response to reviewer)是什么样的?
  8. 分享Silverlight/Windows8/WPF/WP7/HTML5周学习导读(6月18日-6月24日)
  9. 编译原理及编译程序构造-绪论
  10. SpringBoot3.x原生镜像-Native Image尝鲜