LiteOS内核源码分析:位操作模块
摘要:本文带领大家一起剖析了LiteOS位操作模块的源代码,代码非常简单,参考官方示例程序代码,实际编译运行一下,加深理解。
本文分享自华为云社区《LiteOS内核源码分析系列五 LiteOS内核源码分析--位操作模块》,原文作者:zhushy 。
在进一步分析之前,本文我们先来熟悉下LiteOS提供的辅助功能模块–位操作,在互斥锁等模块对位操作有使用。位操作是指对二进制数的bit位进行操作。程序可以设置某一变量为状态字,状态字中的每一bit位(标志位)可以具有自定义的含义。文中所涉及的源代码,均可以在LiteOS
开源站点https://gitee.com/LiteOS/LiteOS 获取。位操作模块源代码、开发文档如下:
- LiteOS内核位操作源代码
位操作模块功能比较简单,包括位操作的头文件kernel\include\los_bitmap.h、C源代码文件kernel\base\los_bitmap.c。
- 开发指南位操作文档
在线文档https://gitee.com/LiteOS/LiteOS/blob/master/doc/LiteOS_Kernel_Developer_Guide.md#%E4%BD%8D%E6%93%8D%E4%BD%9C。
我们先看看位操作的概念核使用场景,详细的介绍及相关的示例,请参考LiteOS开发指南位操作文档。
LiteOS位操作模块提供对32位无符号整数数值的bit位操作,bit位取值为0-31,以0开始计算,从左向右,第0位,第1位。。。第31位等。定义的宏OS_BITMAP_MASK如下,也就是十进制31。如果传入的bit为大于31,会通过逻辑与运算截断(pos & OS_BITMAP_MASK),只取低5位,确保不会大于31,避免溢出。
#define OS_BITMAP_MASK 0x1FU
Huawei LiteOS的位操作模块提供标志位的置1和清0操作,可以改变标志位的内容,同时还提供获取状态字中标志位为1的最高位和最低位的功能。用户也可以对系统的寄存器进行位操作。
下面,我们剖析下位操作的源代码。
位操作常用功能
位操作提供了4个API,进行置1、清0、获取为1的最高、最低位等操作,如下:
LOS_BitmapSet()对状态字的某一标志位进行置1操作
对状态字的某一标志位进行置1操作。我们先看看传入的参数,需要的2个参数分别是:需要改变bit位内容的状态字UINT32 *bitmap,需要改变的bit位位数UINT16 pos。
代码很简单,首先进行基础的校验,如果状态字为空,则返回。然后计算pos & OS_BITMAP_MASK,只取二进制的低5位,最大位值为31,避免左移的时候发生溢出。1U << (pos & OS_BITMAP_MASK)就是需要改变内容的状态字的bit位,通过按位或运算设置状态字UINT32 *bitmap的指定bit位的内容为1。
VOID LOS_BitmapSet(UINT32 *bitmap, UINT16 pos)
{if (bitmap == NULL) {return;}*bitmap |= 1U << (pos & OS_BITMAP_MASK);
}
LOS_BitmapClr()对状态字的某一标志位进行清0操作
对状态字的某一标志位进行清0操作,代码和置1操作对应,比较简单,~(1U << (pos & OS_BITMAP_MASK))表示需要改变内容的状态字的bit位为0,其余位为1,然后通过按位与运算设置状态字UINT32 *bitmap的指定bit位的内容为0。
VOID LOS_BitmapClr(UINT32 *bitmap, UINT16 pos)
{if (bitmap == NULL) {return;}*bitmap &= ~(1U << (pos & OS_BITMAP_MASK));
}
LOS_HighBitGet()获取状态字中为1的最高位
代码中CLZ(bitmap)是宏,展开为(__builtin_clz(bitmap)),这是编译器内置的高效位运算的库函数,clz是count leading zeros的缩写,就是统计二进制数值中高位区开头的全是0的数目。使用OS_BITMAP_MASK减去该值,结果就是状态字中的1的最高位。
UINT16 LOS_HighBitGet(UINT32 bitmap)
{if (bitmap == 0) {return LOS_INVALID_BIT_INDEX;}return (OS_BITMAP_MASK - CLZ(bitmap));
}
LOS_LowBitGet()获取状态字中为1的最低位
代码其中CLZ(bitmap)是宏,展开为(__builtin_ctz(value)),这是编译器内置的高效位运算的库函数,ctz是count trailing zeros的缩写,就是统计二进制数值中低位区结尾的全是0的数目,该结果就是状态字中的1的最低位。
UINT16 LOS_LowBitGet(UINT32 bitmap)
{if (bitmap == 0) {return LOS_INVALID_BIT_INDEX;}return CTZ(bitmap);
}
小结
本文带领大家一起剖析了LiteOS位操作模块的源代码,代码非常简单,参考官方示例程序代码,实际编译运行一下,加深理解。
点击关注,第一时间了解华为云新鲜技术~
LiteOS内核源码分析:位操作模块相关推荐
- LiteOS内核源码分析:静态内存Static Memory
本文分享自华为云社区<LiteOS内核源码分析系列十二 静态内存Static Memory>,原文作者:zhushy . 内存管理模块管理系统的内存资源,它是操作系统的核心模块之一,主要包 ...
- LiteOS内核源码分析:动态内存之Bestfit分配算法
本文分享自华为云社区<LiteOS内核源码分析系列十三 动态内存Bestfit分配算法>,原文作者:zhushy . 内存管理模块管理系统的内存资源,它是操作系统的核心模块之一,主要包括内 ...
- LiteOS内核源码分析:消息队列Queue
本文分享自华为云社区<LiteOS内核源码分析系列十 消息队列Queue>,原文作者:zhushy . 队列(Queue)是一种常用于任务间通信的数据结构.任务能够从队列里面读取消息,当队 ...
- LiteOS内核源码分析:任务LOS_Schedule
本文分享自华为云社区<LiteOS内核源码分析系列六 -任务及调度(5)-任务LOS_Schedule>,原文作者:zhushy . 本文我们来一起学习下LiteOS调度模块的源代码,文中 ...
- LiteOS内核源码分析:任务栈信息
本文分享自华为云社区<LiteOS内核源码分析系列六 -任务及调度(2)-任务LOS_Task>,原文作者:zhushy . 我们介绍下LiteOS任务栈的基础概念.LiteOS任务栈是高 ...
- Linux内核源码分析方法
说明:这是一个刚接触内核三个月的同学,通过对一个内核特性的分析,总结出一套分析内核的方法. 一.内核源码之我见 Linux内核代码的庞大令不少人"望而生畏",也正因为如此,使得人们 ...
- Linux内核源码分析《进程管理》
Linux内核源码分析<进程管理> 前言 1. Linux 内核源码分析架构 2. 进程原理分析 2.1 进程基础知识 2.2 Linux进程四要素 2.3 进程描述符 task_stru ...
- Linux内核源码分析方法—程序员进阶必备
一.内核源码之我见 Linux内核代码的庞大令不少人"望而生畏",也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是 ...
- v74.01 鸿蒙内核源码分析(编码方式篇) | 机器指令是如何编码的 | 百篇博客分析OpenHarmony源码
Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https ...
最新文章
- Debug.startMethodTracing() 没有生成trace文件
- 使用NuGet发布自己的类库包(Library Package)
- JVM参数详解和调优
- 物联网核心协议—消息推送技术演进
- windows命令提示符下输入net start/stop mysql发生系统错误5,拒绝访问的解决方法
- apt 根据注解,编译时生成代码
- 用计算机桁架各杆内力,运用AUTO CAD求解桁架内力?
- LeetCode 1066. 校园自行车分配 II(状态压缩DP)
- Docker中的libcontainer架构图
- Jenkins分布式构建和部署(master-slave)
- Mysql用户访问工作原理
- jQuery的立即调用表达式
- 有观赏性的c语言程序,设计一个C语言程序,对以孩子链表表示的树计算该树的深度- 一起装修网...
- 套接字超时选项(SO_RCVTIMEO 与 SO_SNDTIMEO)
- Oracle中的COALESCE,NVL,NVL2,NULLIF函数
- EDIUS 8中的快捷键该如何自定义
- UCI数据集中文介绍:Waveform Database Generator (Version 1) Data Set
- hdu1175连连看
- linux有类似酷狗qq音乐软件,除了网易云QQ音乐,这些小众音乐APP同样值得推荐。...
- 【软件工程/系统软件/程序设计语言】 2019年-中国计算机学会推荐国际学术会议和期刊目录(四)