【ARM 嵌入式 C 入门及渐进 4-- Linux 位图 bitmap】
文章目录
- 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-15
。bit 位的值 表示该该中断号是否已经分配:
- 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】相关推荐
- 【ARM 嵌入式 C 入门及渐进 6 -- Linux 内建函数 __builtin_】
文章目录 1.1 内建函数 1.1.1 内建函数 __builtin_return_address 1.1.2 内建函数 __builtin_frame_address 1.1.3 内建函数 __bu ...
- 网络上所谓的《ARM嵌入式系统入门最好的文章》
一 首先说说ARM的发展 可以用一片大好来形容,翻开各个公司的网站,招聘里面嵌入式占据了大半工程师职位. 广义的嵌入式无非几种:传统的什么51.AVR.PIC称做嵌入式微控制器:ARM是嵌入式微处理器 ...
- arm嵌入式linux应用实例开发pdf,零点起步——ARM嵌入式Linux应用开发入门一书的源代码...
代码片段和文件信息 属性 大小 日期 时间 名称 ----------- --------- ---------- ----- ---- 文件 2 ...
- 收集整理的ARM嵌入式linux开发入门视频教程
嵌入式Linux作为一个系统学科,具有知识点多,知识难度大,实践操作性强等特点,很多踌躇满志的同学最终倒在了学习嵌入式Linux的道路上,绝大部分也是因为没有掌握嵌入式Linux 的知识规律和学习方法 ...
- 嵌入式开发入门之经典 ARM开发板
嵌入式开发入门之经典 开始进入嵌入式世界,真是一头雾水,不知道如何入手!也不知道该如何学习,学习什么,最近从网上转载这篇文章,对我启发很大,对于初始进入嵌入式的人们很有帮组,好多嵌入式大侠都说这是入门 ...
- 嵌入式 Linux 入门(十、Linux 下的 C 编程)
嵌入式 Linux 入门第十课,聊聊 linux 下的 C 编程...... 矜辰所致 插一句,问题讨论群在文末的推广,以后大家提问可以在群中,即便我不在也能看到历史记录. 目录 前言 一.C 语言编 ...
- 基于c语言的linux嵌入式开发入门
前言 本文主要包含,c语言基本结构与语法.make及makefile的使用.main函数参数与返回值的说明.标准输入.输出.错误流的介绍以及linux管道的应用. 语言数据类型 联合体也有翻译为共用体 ...
- 嵌入式linux的运行过程,ARM嵌入式设备Linux系统启动步骤和方式
> 1). 简介本文引用地址:http://www.eepw.com.cn/article/201607/294237.htm 本文简单介绍ARM嵌入式设备基于嵌入式Linux操作系统时候的启动 ...
- 嵌入式跑马灯实验报告linux,ARM嵌入式跑马灯设计实验报告.doc
ARM嵌入式跑马灯设计实验报告.doc ARM嵌入式设计实验报告 题目: 跑马灯的设计 专 业: 班 级: 姓 名: 学 号: 指导教师: 2014年11 月 目 录 1 题目要求---------- ...
最新文章
- 浅议Windows 2000/XP Pagefile组织管理
- 聊城中考计算机试题及答案,初中微机模拟考试试题(word版).doc
- jQuery笔记之工具方法extend插件扩展
- boost::container模块实现虚拟测试分配器的程序
- 讲的真透彻!还有人不知道什么是AndroidX的吗?已拿offer入职
- 探索性数据分析(EDA)-不要问如何,不要问什么
- 网络工程师职业发展路线规划三步走
- Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理)
- jQuery之事件绑定到触发全过程及知识点补充
- Navicat for Mysql 如何备份数据库
- REST Assured 55 - JSON Schema Validation In Rest Assured
- nginx系列第一篇:nginx源码下载,编译和安装
- oracle数字进一函数,oracle常用函数一:数字函数
- php168找回管理员密码,如何找回WordPress后台管理员密码
- 夯实Java基础系列21:Java8新特性终极指南
- nginx 报错502
- 外包一个小程序多少钱(外包小程序开发的价格费用)
- 国外著名java论坛
- Shi-Tomasi角点检测算法
- 报错:array_column函数未定义(原因:php版本问题)
热门文章
- [胡说八道]我的时间我做主——读《小强升职记》有感
- SMETA验厂辅导,对于已经通过了审核公司的ETI标准验厂,如何将验厂结果上传到SEDEX上
- 什么是uuid以及uuid在java中的使用
- MapReduce(深入)---案例之用户上行流量 下行流量 总流量倒序 按省份分区
- Java API--IO流整理
- 云原生和云计算的区别,普通人都能看懂!
- 一篇标准的审稿意见回复(Response to reviewer)是什么样的?
- 分享Silverlight/Windows8/WPF/WP7/HTML5周学习导读(6月18日-6月24日)
- 编译原理及编译程序构造-绪论
- SpringBoot3.x原生镜像-Native Image尝鲜