问题描述:
定义如下数据结构
typedef struct tagStdMacInfo /*待学MAC信息,微码提供给驱动,驱动提供给协议均使用该数据结构*/
{
UINT32 macValid : 1; /*mac信息是否被学习标志*/
UINT32 isLocal : 1; /*本地标志*/
UINT32 isSmartGroup : 1; /*接口类型是否为smartGroup*/
UINT32 reserved0 : 1;
UINT32 vpnId :12; /*VPLS实例表示 即vpnid*/
.......................
}VPLS_STD_MAC_INFO;
实际使用:
VPLS_STD_MAC_INFO MacStdElement = {0};
MacStdElement.vpnId=0x1;
- MacStdElement.isSmartGroup =0x1;
................
问题:
在如上的结构中,定义为一个位域的字节,在赋值为0时候,无任何问题;当赋值为1的时候,显示为0xffffffff,当取的时候也是同样显示。
解决:
首先,怀疑是否是编写的函数有问题,因为其他定义的12位的没有问题,查看定义发现先前定义对于1bit的,冒号后边有空格,尝试去掉空格,无作用。
其次,查看实际物理内存,发觉实际写的值是真确的,说明写的过程可以放心,是显示问题,可是在取的过程和赋予其他值的过程是否正 确呢?
再次,查看相关部分的汇编代码,如下:
写内存过程
MacStdElement.isSmartGroup =0x1;
0x1c4e14 +0x0a0: LDRB r3,[r11,#-0x2c]
0x1c4e18 +0x0a4: ORR r2,r3,#4
0x1c4e1c +0x0a8: MOV r3,r2
0x1c4e20 +0x0ac: STRB r3,[r11,#-0x2c]
向上层赋值过程(isLocal为UINT32)
isLocal = pElement->isLocal;
0xe58f8 +0x118: LDR r3,[r11,#-0x28]
0xe58fc +0x11c: LDRB r2,[r3,#0]
0xe5900 +0x120: AND r3,r2,#0xff
0xe5904 +0x124: MOV r2,r3,LSR #1
0xe5908 +0x128: AND r3,r2,#0xff
0xe590c +0x12c: AND r2,r3,#1
0xe5910 +0x130: STR r2,[r11,#-0x40]
结论:
是tornado的显示问题,不会对程序造成影响!!至此,遂大松一口气
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步