Позвольте мне объяснить концепцию заполнения в структурах и затем упакованных структурах на примере.
А затем давайте посмотрим, почему требуется упаковка.
Заполнение:
struct eg_struct
{
unsigned char abc;
unsigned int xyz;
}
Когда структура объявлена, как указано выше для 16-битной архитектуры, переменной abc
будет назначен некоторый адрес.Следующий адрес не присваивается переменной xyz
, вместо этого добавляется один дополнительный байт, а затем следующий адрес будет присваиваться переменной xyz
.
В конце структура выглядит примерно так::
struct eg_struct
{
unsigned char abc;
unsigned char paddedbytes[1];
unsigned int xyz;
}
Заполнение делает адреса переменных-членов легко доступными для микроконтроллера.Недостатком являются дополнительные ненужные байты, которые входят в изображение.
Упаковка:
Если та же структура объявлена с использованием атрибута «packed
», дополнительный байт будетне добавляется после переменной abc
.
Позвольте мне привести один пример, где требуется упаковка:
Рассмотрим микроконтроллер, сопряженный с EEPROM, где используется некоторая структурасохранен.
Представьте, что запись функции в EEPROM будет выглядеть следующим образом:
Write_EEPROM(EEPROM address, Ram address, Byte count);
Теперь, если упаковка не выполнена, дополнительные заполненные байты будут занимать пространство в EEPROM, котороебесполезно.