LiteOS内核源码分析:位操作模块
摘要:本文带领大家一起剖析了LiteOS位操作模块的源代码,代码非常简单,参考官方示例程序代码,实际编译运行一下,加深理解。
在进一步分析之前,本文我们先来熟悉下LiteOS提供的辅助功能模块–位操作,在互斥锁等模块对位操作有使用。位操作是指对二进制数的bit位进行操作。程序可以设置某一变量为状态字,状态字中的每一bit位(标志位)可以具有自定义的含义。文中所涉及的源代码,均可以在LiteOS开源站点https://gitee.com/LiteOS/LiteOS 获取。位操作模块源代码、开发文档如下:
- LiteOS内核位操作源代码
位操作模块功能比较简单,包括位操作的头文件kernel\include\los_bitmap.h、C源代码文件kernel\base\los_bitmap.c。
- 开发指南位操作文档
我们先看看位操作的概念核使用场景,详细的介绍及相关的示例,请参考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内核源码分析--位操作模块》,原文作者:zhushy 。
LiteOS内核源码分析:位操作模块的更多相关文章
- LiteOS内核源码分析:任务LOS_Schedule
摘要:调度,Schedule也称为Dispatch,是操作系统的一个重要模块,它负责选择系统要处理的下一个任务.调度模块需要协调处于就绪状态的任务对资源的竞争,按优先级策略从就绪队列中获取高优先级的任 ...
- 鸿蒙内核源码分析(GN应用篇) | GN语法及在鸿蒙的使用 | 百篇博客分析OpenHarmony源码 | v60.01
百篇博客系列篇.本篇为: v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...
- 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 百篇博客分析OpenHarmony源码 | v59.01
百篇博客系列篇.本篇为: v59.xx 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿 ...
- 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙看这篇或许真的够了 | 百篇博客分析OpenHarmony源码 | v50.06
百篇博客系列篇.本篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉 ...
- 鸿蒙内核源码分析(位图管理篇) | 谁能一分钱分两半用 | 百篇博客分析OpenHarmony源码 | v19.03
百篇博客系列篇.本篇为: v19.xx 鸿蒙内核源码分析(位图管理篇) | 谁能一分钱分两半用 | 51.c.h .o 先看四个宏定义,进程和线程(线程就是任务)最高和最低优先级定义,[0,31]区间 ...
- 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 百篇博客分析OpenHarmony源码 | v5.05
百篇博客系列篇.本篇为: v05.xx 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...
- 鸿蒙内核源码分析(任务调度篇) | 任务是内核调度的单元 | 百篇博客分析OpenHarmony源码 | v4.05
百篇博客系列篇.本篇为: v04.xx 鸿蒙内核源码分析(任务调度篇) | 任务是内核调度的单元 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度 ...
- v87.01 鸿蒙内核源码分析 (内核启动篇) | 从汇编到 main () | 百篇博客分析 OpenHarmony 源码
本篇关键词:内核重定位.MMU.SVC栈.热启动.内核映射表 内核汇编相关篇为: v74.01 鸿蒙内核源码分析(编码方式) | 机器指令是如何编码的 v75.03 鸿蒙内核源码分析(汇编基础) | ...
- Linux内核源码分析方法
一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...
- Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7)
http://blog.chinaunix.net/uid-20543672-id-3157283.html Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3 ...
随机推荐
- Redis平台-整合PHP
1.Redis的相关介绍: 定义: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合 ...
- TS实现汉诺塔算法,以及图灵完备讨论
之前在网上看到徐大佬更新的一篇文章: 用 TypeScript 类型运算实现一个中国象棋程序 在线预览地址:https://tsplay.dev/Nd4n0N 把鼠标放在最后几行的走棋结果上,惊喜的一 ...
- APP攻防--安卓逆向&数据修改&逻辑修改&视图修改
APP攻防--安卓逆向&数据修改&逻辑修改&视图修改 @ 目录 APP攻防--安卓逆向&数据修改&逻辑修改&视图修改 工具集 apk目录意义 逆向数据修 ...
- Chromium VIZ工作流
在 Chromium 中 viz 的核心逻辑运行在 GPU 进程中,负责接收其他进程产生的 viz::CompositorFrame(简称 CF),然后把这些 CF 进行合成,并将合成的结果最终渲染在 ...
- HarmonyOS UI 开发
引言 HarmonyOS 提供了强大的 UI 开发工具和组件,使开发者能够创建吸引人的用户界面.本章将详细介绍在 HarmonyOS 中应用 JS.CSS.HTML,HarmonyOS 的 UI 组件 ...
- centos7通过yum安装mysql5.7以上版本
1.检查并卸载mariadb yum remove *mariadb* 遇到要求输入直接y/n 直接输入y回车 2.下载并安装mysql mysql源地址:https://repo.mysql.com ...
- 我整理了一份Flink流计算入门教程清单(转)
好久不见! 作为技术出身的我,不太会写软文广告,今天就直接来个硬广.之前与人民邮电出版社合作的<Flink原理与实践>经过一年多时间的打磨和润色,这两天终于与大家见面了,恳请各位朋友多多支 ...
- JUC并发编程学习笔记(十四)异步回调
异步回调 Future设计的初衷:对将来的某个事件的结果进行建模 在Future类的子类中可以找到CompletableFuture,在介绍中可以看到这是为非异步的请求使用一些异步的方法来处理 点进具 ...
- 探讨C语言中数组、元素内存地址之间的关系
最近一直在研究C语言,总结出一个结论:C开发者就是和内存与数据结构在打交道. 这篇文章先整理一下内存这块学习到的知识以免后面忘记了. 我们先讨论下数组和指针之间的关系,代码如下: #include & ...
- 微服务系列-使用WebFlux的WebClient进行Spring Boot 微服务通信示例
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 概述 在之前的教程中,我们看到了使用 RestTemplate 的 Spring Boot 微服务通信示例. 从 5.0 ...