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

 
 
> Побитовый сдвиг данных в структуре, Как реализовать
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
Ответов
neiver
сообщение Oct 31 2011, 12:07
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Использовать объединения для приведения типов это уже само по себе грязный хак.
Код
union MyUnion{
   Type1 a;
   Type2 b;
};
...
union MyUnion var;
var.a = something;
do_something_with(var.b);

По стандарту объединение - это лишь указание компилятору, что его поля могут разделять общую память, и обещание (с стороны программиста) не использовать эти поля одновременно. Гарантируется, что записывая "а", мы его сможем прочитать, записывая "b" мы сможем прочитать его. А записывая "а", а после читая "b" мы нагло обманываем компилятор и можем за это получить по ушам. Шибко умный оптимизатор может заметить, что выражение var.a инициализируется, но нигде не используется и выкинет его инициализацию, после чего значение var.b будет не определено. Хотя часто такой код работает до поры до времени, пока не изменился уровень/флаги оптимизации, не обновился компилятор и т.д.
Единственно надежный способ (уже указан выше) это преобразовывать указатель на структуру в указатель на char:
Цитата
union SPI_union TXdata;
uint8_t* pData = (uint8_t*)&TXdata;

После этого можешь передавать данные в SPI:

SPDR = *pData++;

Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 19th June 2025 - 01:41
Рейтинг@Mail.ru


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