Чтобы избежать повреждения памяти и других переменных, вы обычно объявляете большие буферы данных как статические и размещаете их в области видимости файла, а затем выделяете для них отдельный сегмент ОЗУ. Размещение их в стеке - плохая идея в любой встроенной системе.
Вам необходимо выяснить, существует ли требование выравнивания для ЦП и должен ли код быть переносимым или нет. Компилятор может добавлять любое количество байтов заполнения в любом месте этой структуры, что означает, что вы не сможете сделать это:
parsedPacket pp;
memcpy(&pp, raw_data, sizeof(parsedPacket )) ;
По этой причине структуры , как правило, являются плохим выбором для хранения пакетов данных . Самое безопасное решение - это:
/* packet.h */
typedef struct parsedPacket_struct {
uint8_t* partA;
uint8_t* partB;
uint8_t* partC;
uint16_t len_partA;
uint16_t len_partB;
uint16_t len_partC;
}parsedPacket;
#define MAX_PART_A 2
#define MAX_PART_B 300
#define MAX_PART_C 2
void packet_receive (parsedPacket* packet);
/* packet.c */
static uint8 partA[MAX_PART_A];
static uint8 partB[MAX_PART_B];
static uint8 partC[MAX_PART_C];
void packet_receive (parsedPacket* packet)
{
/* receive data from server */
...
packet->len_partA = ...;
packet->len_partB = ...;
packet->len_partC = ...;
packet->partA = partA;
packet->partB = partB;
packet->partC = partC;
memcpy(partA, A_from_server, packet->len_partA);
memcpy(partB, B_from_server, packet->len_partB);
memcpy(partC, C_from_server, packet->len_partC);
}
Это может быть расширено, чтобы при необходимости содержать несколько статических буферов, то есть статический массив массивов для каждого буфера. Поскольку вы имеете дело с большими объемами данных во встроенной системе, вы никогда не можете позволить программе складывать буферы по прихоти. Максимальное количество копий полученного пакета должно быть определено при разработке программы.