浅谈位掩码(BitMask)的运用
最近移植别人的代码,发现别人老是会用到掩码,着实看不懂,后来稍微学习了一下,现在有所心得,整理一下,大家共勉。
讲位掩码原理之前,先谈一谈我遇到位掩码的情况。我移植的是嵌入式程序(STM32程序),里面使用一个8位变量,来控制多个状态。比如:
他使用了一个8位量,去控制3个状态位:X、Y、Z三轴的限制为状态。这样就不必使用三个八位变量去配置这三个轴的状态。
所以,下面进行一些总结:
1、位掩码的使用是为了控制一些bool值(开关量)。比如:电机正反转、led亮灭。
2、用一个母体(我自己起的名字啊,非官方),自己定义的一个8位变量(下面会介绍),可以控制8个相关的开关量,如果用16位的变量,可以控制16个。这样,既节省内存,而且方便统一管理。
为了能使用掩码,我们需要提前定义一些操作函数:
我们先一个一个介绍这些函数:(大神们可以跳过这一段)
1、bit(n) (1<<n)
该函数就是移位操作,比如:bit(X_LIMIT_BIT),也就是bit(1),
也就是0000 0001b << 1 移位完成后就是0000 0010b。
2、bit_true(x,mask)
该函数是赋值函数,x是母体,就是我上文自己的定义;mask是你写入的目标,一般就是bit(X_LIMIT_BIT)。比如:
uint8_t axis_limit_mask = 0; //这就是定义母体,该母体用于管理XYZ三个轴的限制情况。
现在,X轴运动中,突然超出限制,运动到工作范围之外,就需要将母体对应X的位变为1。就调用该函数:
bit_true(axis_limit_mask , bit(X_LIMIT_BIT) ),该函数执行之后:
母体就变成了0000 0010b,以后调用该母体就可以知道:X轴超限,YZ没有超限。
3、bit_false(x,mask)
该函数也是赋值函数,类似上一个。
4、bit_toggle(x,mask)
该函数也是赋值函数,类似上一个。
5、bit_istrue(x,mask)
该函数是读函数,用读取母体信息。x是母体,mask你是读取的目标,也用bit()函数来执行。就按照上面X轴超限继续举例。
比如:X超限,我就需要停止机器。
就应该这样:
那我们如何来判断X超限呢?用读取函数bit_istrue()。如下:
bit_istrue()函数:如果是真,返回1,如果是假,返回0。
6、bit_isfalse(x,mask)
该函数是读函数,类似上一个。
那么,我们该如何使用这种掩码呢?
1、首先,要像上图一样,定义出你需要的量的值。举例:
宏定义:X_LIMIT_BIT为第一位,Y为第二位,Z为第三位。
bit(X_LIMIT_BIT)-------->0000 0010b
bit(Y_LIMIT_BIT)-------->0000 0100b
bit(Z_LIMIT_BIT)-------->0000 1000b
该八位数据的第零位没有用,(也可以从第零位开始,没特别大区别)。
最后那个LIMIT_MASK是统一管理,
LIMIT_MASK------------->0000 1110b,当你需要判断是否存在轴超限时,不用每个轴一个一个判断,直接用LIMIT_MASK判断即可。只能知道是否有超限,并不知道哪个轴超限,之后可以继续再判断到底是哪个轴超限。(算是一个小技巧吧)
2、需要定义个一个母体来进行存放信息。
母体是8位,则最多可以存放8个开关量;母体也可以定义16位,或者32位。
母体一般最后加个 “_mask” ,这样知道是对应的掩码,比如:axis_limit_mask ,就可以很直接的知道是轴限制掩码。
整体知识如上吧,大家一起加油,冲冲冲!!!