реклама на сайте
подробности

 
 
> Побитовый сдвиг данных в структуре, Как реализовать
kt368
сообщение Oct 25 2011, 07:15
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



Здравствуйте! Имеется юнион, содержащий структуру в которой находятся данные, которые необходимо предать по SPI. Можно ли в цикле сдвигать структуру влево и передавать на ножку МК старший бит структуры?
Вот код юниона и структуры:
Код
struct SPI_TX_str {
    unsigned dch2        :1;
    unsigned ch2        :1;
    unsigned dch1        :1;
    unsigned ch1        :1;
    unsigned ch2_disp    :8;
    unsigned ch1_disp    :8;
};

struct all {
    unsigned sw                :4;
    unsigned ch2_disp        :8;
    unsigned ch1_disp        :8;
};

union SPI_union {
    struct all             all;
    struct SPI_TX_str     bits;
};
union SPI_union TXdata

И можно ли мне сделать для данного случая такой юнион, к которому я смогу обращаться типа такого:
Код
TXdata=0bxxxxxxxxxxxxxxxxxxxx;
?
Т.е чтобы записывать во все переменные, которые входят в состав структуры (которая в юнионе) при помощи одной команды на Си, как написано выше. Если б был тип данных, который занимал настраиваемое количество бит, то сделав юнион с таким типом данных я б смог его сдвигать. Может я что-то не так говорю?
Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kt368
сообщение Oct 27 2011, 05:57
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



Цитата(dxp @ Oct 27 2011, 07:02) *
Только структуру надо будет объявить пакованной
А что это значит?
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 27 2011, 09:05
Сообщение #3


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(kt368 @ Oct 27 2011, 12:57) *
А что это значит?

Почти на всех (если не на всех) процессорах, имеющих разрядность данных больше 8 бит (1 байт), существует требование по выравниванию данных. Например, однобайтовые слова могут располагаться по любым адресам, двухбайтовые - по адресам, кратным 2, четырёхбайтные (а также, например, массивы, структуры, объединения) - кратным 4. Поэтому, если объявить на какой-нить 32-разрядной платформе:

Код
struct TSlon
{
    char a;
    long b;
};


то в памяти физически это будет лежать так, что 'a' займёт один байт под адресу, кратному 4, потом будет три незанятых байта, а 'b' будет лежать по следующему адресу, кратному 4. Т.е. казалось бы sizeof структуры должен быть равен 5, а в реальности он будет равен 8.

Теперь представьте себе, что вы эту структуру отправляете на платформу, где нет такого требования и все данные лежат подряд без паддинга ("дырок"). Ясно, что получив сырой массив из байт, дальнейшая интерпретация полей будет неверной. Чтобы избавиться от этого, можно компилятору сказать, чтобы он принудительно упаковывал данные всегда без "дырок", тогда битовое представление будет правильным везде (кроме случаев с разным big/little endian). Для этого у подавляющего большинства компиляторов существует специальная директива - нечто вроде #pragma packed, как оно точно называется и используется, надо смотреть в документации на конкретный компилятор.

Пакованные структуры значительно менее эффективны в использовании - тут компилятору приходится самому (при обращении к полям) каждый раз упаковывать/распаковывать. К тому же, как уже говорилось ранее, #pragma директивы - вещь платформеннозависимая, поэтому переносимости тут тоже нет. Учитывая вышесказанное, имеет смысл подумать над собственным способом сериализации, возможно, он окажется более подходящим, хотя и потребует написания кода руками.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th August 2025 - 11:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.1182 секунд с 7
ELECTRONIX ©2004-2016