Я работаю над прошивкой для 16-битного PIC и пишу на C (компилятор Microchip C30). Мое устройство получает длинный список байтов от внешнего устройства, а затем я пытаюсь скопировать эти байты в структуру. Структура определяется следующим образом:
typedef struct __attribute__((__packed__)) {
char F1Nickname[17];
char F2Nickname[17];
DWORD F1CurrentPos;
DWORD F2CurrentPos;
WORD F1CurrentTemp;
WORD F2CurrentTemp;
DWORD F1MaxPos;
DWORD F2MaxPos;
BYTE F1TempCompOn;
BYTE F2TempCompOn;
BYTE CheckSum;
} deviceStatus;
У меня была странная проблема: всякий раз, когда общее количество байтов в структуре было нечетным числом, моя программа зависала и попадала в подпрограмму обслуживания AddressError. Я могу исправить проблему, просто добавив дополнительный байт в структуру, но это похоже на временное решение.
Я поместил в структуру упакованный атрибут, потому что хотел убедиться, что компилятор не вставит между моими переменными какие-либо байты-заполнители. Если бы это произошло, значения в моей структуре были бы неверными при копировании из полученного массива символов.
Я знаю, что есть также атрибут, называемый выровненным. Выравнивание просто выравнивает начало структуры по четному байту или выравнивает каждый элемент структуры по четному байту? Считаете ли вы, что здесь требуется выровненный атрибут? Если я добавлю выровненный атрибут в эту структуру, я должен также добавить его в структуру на устройстве, которое отправляет данные, верно? На данный момент они оба определены точно так же, как показано выше.
Если я добавлю выровненный атрибут, должен ли я удалить упакованный атрибут? Разве они в основном не делают обратное?
packed
и позволить компилятору сделать всю работу. - person nmichaels   schedule 11.08.2011