按位解析, 按结构体解析 一个32位的程序 parse32.c
#include <stdio.h>
union INT32BITS {
//
struct PERI_CRG143_HI3559AV100
{
unsigned int sdio2_sam_dll_ssel:13;
unsigned int sdio2_sam_dll_mode:1;
unsigned int reserved1_bit14:1;
unsigned int sdio2_sam_dll_bypass:1;
unsigned int sdio2_sam_dll_slave_en:1;
unsigned int sdio2_sam_dll_tune:4;
unsigned int reserved_bit21:1;
unsigned int sdio2_rx_srst_req:1;
unsigned int sdio2_tx_srst_req:1;
unsigned int sdio2_cksel:3;
unsigned int sdio2_srst_req:1;
unsigned int sdio2_cken:1;
unsigned int sdio2_drv_dll_srst_req:1;
unsigned int sdio2_sam_dll_srst_req:1;
unsigned int reserved_bit31:1;
}peri_crg143;
unsigned int value;
};
void main(int argc, char **argv)
{
int i;
int value;
sscanf(argv[1],"0x%x",&value);
//strtol(argv[1], &value, 13);
printf("argv1 =%s \n", argv[1]);
printf("atoi argv1 =%x \n", value);
printf("value =0x%x \n", value);
for(i=0;i<32;i++){
printf("bit%02d ",31-i);
}
printf("\n");
for(i=0;i<32;i++){
int tmp = value;
tmp>>=(31-i);
if(tmp & 1)
printf(" 1 ");
else
printf(" 0 ");
}
printf("\n");
union INT32BITS src;
src.value =value;
printf("sdio2_sam_dll_ssel[12:0] = %X \n", src.peri_crg143.sdio2_sam_dll_ssel);
printf("sdio2_sam_dll_mode[13] = %X \n", src.peri_crg143.sdio2_sam_dll_mode);
printf("reserved1_bit14[14] = %X \n", src.peri_crg143.reserved1_bit14);
printf("sdio2_sam_dll_bypass[15] = %X \n", src.peri_crg143.sdio2_sam_dll_bypass);
printf("sdio2_sam_dll_slave_en[16] = %X \n", src.peri_crg143.sdio2_sam_dll_slave_en);
printf("sdio2_sam_dll_tune[20:17] = %X \n", src.peri_crg143.sdio2_sam_dll_tune);
printf("reserved_bit21[21] = %X \n", src.peri_crg143.reserved_bit21);
printf("sdio2_rx_srst_req[22] = %X \n", src.peri_crg143.sdio2_rx_srst_req);
printf("sdio2_tx_srst_req[23] = %X \n", src.peri_crg143.sdio2_tx_srst_req);
printf("sdio2_cksel[26:24] = %X \n", src.peri_crg143.sdio2_cksel);
printf("sdio2_srst_req[27] = %X \n", src.peri_crg143.sdio2_srst_req);
printf("sdio2_cken[28] = %X \n", src.peri_crg143.sdio2_cken);
printf("sdio2_drv_dll_srst_req[29] = %X \n", src.peri_crg143.sdio2_drv_dll_srst_req);
printf("sdio2_sam_dll_srst_req[30] = %X \n", src.peri_crg143.sdio2_sam_dll_srst_req);
printf("reserved_bit31[31] = %X \n", src.peri_crg143.reserved_bit31);
}
编译:
gcc -o parse32 parse32.c
使用方法:
./parse32 0x77000000
执行结果:
argv1 =0x77000000atoi argv1 =77000000
value =0x77000000
bit31 bit30 bit29 bit28 bit27 bit26 bit25 bit24 bit23 bit22 bit21 bit20 bit19 bit18 bit17 bit16 bit15 bit14 bit13 bit12 bit11 bit10 bit09 bit08 bit07 bit06 bit05 bit04 bit03 bit02 bit01 bit00
0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sdio2_sam_dll_ssel[12:0] = 0
sdio2_sam_dll_mode[13] = 0
reserved1_bit14[14] = 0
sdio2_sam_dll_bypass[15] = 0
sdio2_sam_dll_slave_en[16] = 0
sdio2_sam_dll_tune[20:17] = 0
reserved_bit21[21] = 0
sdio2_rx_srst_req[22] = 0
sdio2_tx_srst_req[23] = 0
sdio2_cksel[26:24] = 7
sdio2_srst_req[27] = 0
sdio2_cken[28] = 1
sdio2_drv_dll_srst_req[29] = 1
sdio2_sam_dll_srst_req[30] = 1
reserved_bit31[31] = 0