각 "행"에 수신 된 메시지가 들어있는 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의 크기를 정의하는 것만으로 비트 매핑에 따라 올바른 할당이 수행됩니까?
도움을 주시면 감사하겠습니다.