2013-10-31 1 views
1

각 "행"에 수신 된 메시지가 들어있는 2 차원 정수 배열 (8x8)이 있습니다. 이 배열의 요소 인 incomingMessageBuffers [1] [0 : 7]을 ​​마스크 및 시프트 메서드를 사용하는 것보다 빠를 수있는 정의 된 비트 필드가있는 구조체에 매핑하는 데 관심이 있습니다. 비트 필드 순서는 컴파일러에 따라 다르다는 것을 알고 있습니다. 그러나 관계없이이 사실과 관련이 없다고 생각하는 이유는 무엇입니까?배열 필드를 비트 필드가있는 구조체에 매핑

내가 MYSTRUCT 정의

- incomingMessageBuffer [1][0:7] 
    0. 0x1544 
    1. 0x0000 
    2. 0x0008 
    3. 0x3400 
    4. 0x0012 
    5. 0x8100 
    6. 0x0000 
    7. 0x0000 

MYSTRUCT

으로지도하려고 메모리 : 매핑 및 원하는 결과의 예는

struct MYSTRUCT{ 
    unsigned int PACKET0:16; 
    unsigned int PACKET1:16; 
    unsigned int PACKET2:16; 

    unsigned char PACKET3_LOW:8; 
    unsigned int MYINTEGER:16; 
    unsigned char PACKET4_HIGH:8; 

    unsigned char PACKET5_LOW:8; 
    unsigned char MYBIT:1; 
    unsigned char EXTRABITS:3; 
    unsigned char MYNIBBLE:4; 

    unsigned int PACKET6:16; 
    unsigned int PACKET7:16; } 

내 코드 대신

volatile struct MYSTRUCT *Message   
Message = &incomingMessageBuffer[1][0];  

myInteger = (Message->MYINTEGER);   
myBit = (Message->MYBIT);  
myNibble = (Message->MYNIBBLE); 

Expected values: 
myInteger = 0x1234 
myBit = 0x01; 
myNibble = 0x08; 

, 이 매핑을 PACKET0,1 및 2 올바르게 있지만 다음 멤버 할당 잘못되었습니다. 유형의 크기가 추가 상위 비트 폭보다 큰 경우 정의의 이러한 유형의 규칙에 대한 이해 ...

struct 
{ 
    type [member_name] : width ; 
}; 

유형이 MEMBER_NAME 유형을 정의 (즉 PACKET6, MYBIT 등)에서 in member_name은 0으로 채워집니다.

struct MYSTRUCT_2{ 
    unsigned int PACKET0:16; 
    unsigned int PACKET1:16; 
    unsigned int PACKET2:16; 

    unsigned char PACKET3_LOW:8; 
    unsigned long int MYINTEGER:16; //Notice long int here 
    unsigned char PACKET4_HIGH:8; 

    unsigned char PACKET5_LOW:8; 
    unsigned char MYBIT:1; 
    unsigned char EXTRABITS:3; 
    unsigned char MYNIBBLE:4; 

    unsigned int PACKET6:16; 
    unsigned int PACKET7:16; 
} 

을 다음 구조체 멤버의 마스킹을 사용하여 내 변수를 할당합니다 : 그래서

volatile struct MYSTRUCT *Message   
Message = &incomingMessageBuffer    

myInteger = (Message->MYINTEGER)&0xFFFF   
myBit = (Message->MYBIT)&0x01   
myNibble = (Message->MYNIBBLE)&0x0F   

을 난 내가 같은 내 구조를 정의하지 않는 한 기대 값이 할당되는 볼 수 없기 때문에이 잘못된 것 같다 왜 MYINTEGER를 부호없는 long int로 선언하면 MYINTEGER의 크기를 정의하는 것만으로 비트 매핑에 따라 올바른 할당이 수행됩니까?

도움을 주시면 감사하겠습니다.

답변

0

나는이 문제가 내 첫 번째 구조의 정수 정의가 잘못 정렬되어있을 수 있다고 생각합니다. MYINTEGER는 8 비트 각각의 매핑이 두 문자 정의 다음에 오는 있기 때문에 정수의 첫 번째 비트를 수반 정렬이 ... (16)

이러한 그의 배수에

struct MYSTRUCT{ 
    unsigned int PACKET0:16; 
    unsigned int PACKET1:16; 
    unsigned int PACKET2:16; 

    unsigned char PACKET3_LOW:8; 
    unsigned char PACKET4_HIGH:8; 
    unsigned int MYINTEGER:16; 

    unsigned char PACKET5_LOW:8; 
    unsigned char MYBIT:1; 
    unsigned char EXTRABITS:3; 
    unsigned char MYNIBBLE:4; 

    unsigned int PACKET6:16; 
    unsigned int PACKET7:16; } 

을 정의되는 경우 작품 ... 구조체. 그러나이 동일한 논리를 사용하여 왜 long int로 선언하면 문제가 해결 될지 이해할 수 없습니다.