• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 位操作
2
3
4## 基本概念
5
6位操作是指对二进制数的bit位进行操作。程序可以设置某一变量为状态字,状态字中的每一bit位(标志位)可以具有自定义的含义。
7
8
9## 功能说明
10
11系统提供标志位的置1和清0操作,可以改变标志位的内容,同时还提供获取状态字中标志位为1的最高位和最低位的功能。用户也可以对系统的寄存器进行位操作。位操作模块为用户提供下面几种功能,接口详细信息可以查看API参考。
12
13  **表1** 位操作模块接口
14
15| **功能分类** | **接口描述** |
16| -------- | -------- |
17| 置1/清0标志位 | -&nbsp;LOS_BitmapSet:对状态字的某一标志位进行置1操作<br/>-&nbsp;LOS_BitmapClr:对状态字的某一标志位进行清0操作 |
18| 获取标志位为1的bit位 | -&nbsp;LOS_HighBitGet:获取状态字中为1的最高位<br/>-&nbsp;LOS_LowBitGet:获取状态字中为1的最低位 |
19| 连续bit位操作 | -&nbsp;LOS_BitmapSetNBits:对状态字的连续标志位进行置1操作<br/>-&nbsp;LOS_BitmapClrNBits:对状态字的连续标志位进行清0操作<br/>-&nbsp;LOS_BitmapFfz:获取从最低有效位开始的第一个0的bit位 |
20
21
22## 编程实例
23
24
25### 实例描述
26
27对数据实现位操作,本实例实现如下功能:
28
291. 某一标志位置1。
30
312. 获取标志位为1的最高bit位。
32
333. 某一标志位清0。
34
354. 获取标志位为1的最低bit位。
36
37### 编程示例
38
39本演示代码在./kernel/liteos_a/testsuites/kernel/src/osTest.c中编译验证,在TestTaskEntry中调用验证入口函数BitSample。
40
41```
42#include "los_bitmap.h"
43#include "los_printf.h"
44
45static UINT32 BitSample(VOID)
46{
47  UINT32 flag = 0x10101010;
48  UINT16 pos;
49
50  PRINTK("\nBitmap Sample!\n");
51  PRINTK("The flag is 0x%8x\n", flag);
52
53  pos = 8;
54  LOS_BitmapSet(&flag, pos);
55  PRINTK("LOS_BitmapSet:\t pos : %d, the flag is 0x%0+8x\n", pos, flag);
56
57  pos = LOS_HighBitGet(flag);
58  PRINTK("LOS_HighBitGet:\t The highest one bit is %d, the flag is 0x%0+8x\n", pos, flag);
59
60  LOS_BitmapClr(&flag, pos);
61  PRINTK("LOS_BitmapClr:\t pos : %d, the flag is 0x%0+8x\n", pos, flag);
62
63  pos = LOS_LowBitGet(flag);
64  PRINTK("LOS_LowBitGet:\t The lowest one bit is %d, the flag is 0x%0+8x\n\n", pos, flag);
65
66  return LOS_OK;
67}
68```
69
70
71### 结果验证
72
73编译运行得到的结果为:
74
75
76```
77Bitmap Sample!
78The flag is 0x10101010
79LOS_BitmapSet: pos : 8,  the flag is 0x10101110
80LOS_HighBitGet:The highest one bit is 28, the flag is 0x10101110
81LOS_BitmapClr: pos : 28, the flag is 0x00101110
82LOS_LowBitGet: The lowest one bit is 4, the flag is 0x00101110
83```
84