В своё время решил вы..пендриться и расписал протокол обмена и вообще весь УАРТ структурами и юнионами.
Типа того:
Код
typedef union Data
{
float fData;
int iData;
unsigned char ucData[4];
} __attribute__ ((packed)) Data;
/**
* Описание пакета запроса от хоста
*/
struct stCommand
{
unsigned char Preamble;
unsigned char OpCode;
Data DataField;
unsigned char CRC;
};
union CommandBuffer
{
struct stCommand volatile Command;
unsigned char volatile Bytes[sizeof(struct stCommand)];
};
Далее объявляю
static union CommandBuffer volatile InBuffer;
static union CommandBuffer volatile TempInBuffer;
Так вот, пока я работаю только с InBuffer (заполняю в прерывании от УАРТа и разгребаю в основном цикле), всё нормально.
Далее, захотелось по приёму фрейма копировать его в TempInBuffer, с тем чтобы спокойно обрабатывать, в то время как принимаем новую команду (чтобы новые данные не затирали старые).
Вот тут и начинается.
Куда копать?
С union Data тоже забавная ситуация. Я сначала сделал
Код
typedef union Data
{
float fData;
int iData[2];
unsigned char ucData[4];
} __attribute__ ((packed)) Data;
Так вот: fData - нормально работает, ucData[] - тоже, а при вызове iData[] возникает ошибка.
а вот int iData (не массив) - тоже нормально работает.
Что за чертовщина! И дёрнуло связаться с этими юнионами... Никогда не пользовался и был вполне счастлив...
PS: ошибку генерирует линкер
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)