Я подозреваю, что это проблема выравнивания, и либо GCC, либо процессор пытается компенсировать это.Структура определяется следующим образом:
typedef struct {
long mtype;
unsigned short uRespQueue;
unsigned short uID;
unsigned short uLen;
unsigned char pData[8000];
} message_t;
При условии нормальных ограничений выравнивания и 32-разрядного процессора смещения каждого поля:
mtype 0 (alignment 4)
uRespQueue 4 (alignment 2)
uID 6 (alignment 2)
uLen 8 (alignment 2)
pData 10 (alignment 1)
На всех, кроме самых последних версийпроцессор ARM, доступ к памяти должен быть должен быть выровнен на процессоре ARM, и при приведении:
*((unsigned int *)pMessage->pData) = (unsigned int)pData;
вы пытаетесь записать 32-разрядное значение на выровненный адрес.Чтобы исправить выравнивание, кажется, что адрес урезал младшие биты адреса, чтобы иметь правильное выравнивание.При этом произошло совпадение с полем uLen
, вызвавшим проблему.
Чтобы справиться с этим правильно, необходимо убедиться, что вы записали значение в правильно выровненный адрес.Либо сместите указатель, чтобы выровнять его, либо убедитесь, что pData
выровнен, чтобы иметь возможность обрабатывать 32-битные данные.Я бы переопределил структуру, чтобы выровнять элемент pData
для 32-битного доступа.
typedef struct {
long mtype;
unsigned short uRespQueue;
unsigned short uID;
unsigned short uLen;
union { /* this will add 2-bytes of padding */
unsigned char *pData;
unsigned char rgData[8000];
};
} message_t;
Структура должна по-прежнему занимать такое же количество байтов, поскольку имеет 4-байтовое выравнивание из-за mtype
field.
Тогда вы сможете получить доступ к указателю:
unsigned char *pData = ...;
/* setting the pointer */
pMessage->pData = pData;
/* getting the pointer */
pData = pMessage->pData;