对于下列宏进行分析:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESSBIT_MASK(MCDR2_ADDRESS)
#define BIT_MASK(_bf)((1U<
#define SET_BITS(_dst, _bf, _val)\
(_dst)= (((_dst)&~(BIT_MASK(_bf))) |(((_val)<
// 使用形式:SET_BITS(MCDR2,MCDR2_ADDRESS, RegisterNumber)
宏BIT_MASK:形成bwMCDR2_ADDRESS个1位及bsMCDR2_ADDRESS个0位的二进位串,即(bwMCDR2_ADDRESS+ bsMCDR2_ADDRESS)位地址的高bwMCDR2_ADDRESS为1的掩码。在此例中,bmMCDR2_ADDRESS = 1 1110 0000 0000 0000 0000。
工作原理:
(1U<
((1U<
宏SET_BITS:将_dst地址的低bsMCDR2_ADDRESS(此例为17)与_val组成新地址。
若_dst=1 0010 1001 1100 0101 0011,_val = 0011,则_dst将形成新的地址:
0 0110 1001 1100 0101 0011。
工作原理:
(_dst)&~(BIT_MASK(_bf)):将掩码取反,与_dst相与,即取低bsMCDR2_ADDRESS位。
(_val)<
((_dst)&~(BIT_MASK(_bf))) |(((_val)<
作用:SET_BITS可用于更新(bwMCDR2_ADDRESS+ bsMCDR2_ADDRESS)位IP地址的网络编号。
源码如下所示:
#include "stdio.h"
#include
#include "conio.h"
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
#define BIT_MASK(_bf) ((1U<
#define SET_BITS(_dst, _bf, _val)\
(_dst)= ( ((_dst)&~(BIT_MASK(_bf))) | (((_val)<
/*使用形式:SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber)*/
void main()
{
unsigned dst = 0x1ffff; /* 1 1111 1111 1111 1111*/
unsigned regnum = 0x8; /* 1000 */
printf("%x\n", BIT_MASK(MCDR2_ADDRESS)); /*0x1e0000, 即: 1 1110 0000 0000 0000 0000*/
SET_BITS(dst, MCDR2_ADDRESS, regnum);
printf("%x\n", dst);/*11ffff,即: 1 0001 1111 1111 1111 1111*/
}