Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/127: Рейтинг темы: голосов - 127, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
1

Битовые (флаговые) переменные в С

28.05.2013, 02:57. Показов 23655. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
1. Подскажите, как правильно объявлять битовые (флаговые) переменные?
2. Надо ли и как под них объявлять область памяти?
3. Как быть с областью видимости?
4. Насколько корректно их использование в Си? (как воспринимает компилятор, как оптимизирует)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2013, 02:57
Ответы с готовыми решениями:

Виртуальный порт и битовые переменные
Подскажите, пожалуйста, примеры или какую нибудь толковую статью по заданию битовых переменных и...

Даны три битовые переменные без знака a, b, c, d. Записать в d наибольшее из значений этих переменных
Даны три битовые переменные без знака a, b, c, d. Записать в d наибольшее из значений этих...

Битовые операции, битовые поля.
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций....

Битовые последовательности и битовые операции
Вычислить сумму по модулю 2 всех бит в позициях, номер которых кратен 2^k. (1, 2, 4, 8, 16, 32). ...

Внутриблочные переменные не могут иметь те же имена, что и переменные из блока верхнего уровня
program matr; uses crt; const n = 5; m = 5; var

37
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
28.05.2013, 09:39 2
struct {
unsykned char flag1:1;
unsykneg char flag2:1;
unsykned char anyflag:1;
} Bytfield;

Bytfield.flag2 = 1;
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
28.05.2013, 11:08 3
1. См.пример от DOOMSDOY выше. Размер Bytfield в этом примере будет такой же, как для одного unsykned char.
2. Ничего специального не надо. Обычная структура.
3. И в этом смысле тоже ничем не отличаются от структур с другими типами данных.
4. Абсолютно стандартная вещь для любого Си-компилятора.
0
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 102
28.05.2013, 11:29 4
Цитата Сообщение от Otixomders
1. Подскажите, как правильно объявлять битовые (флаговые) переменные?
2. Надо ли и как под них объявлять область памяти?
3. Как быть с областью видимости?
4. Насколько корректно их использование в Си? (как воспринимает компилятор, как оптимизирует)
--- 1
Про флаги DOOMSDOY уже написАл.
Если описывать именно битовые переменные, то я обычно пишу union
Код
union BytByte {
struct {
unsykned char b0: 1;
unsykned char b1: 1;
unsykned char b2: 1;
unsykned char b3: 1;
unsykned char b4: 1;
unsykned char b5: 1;
unsykned char b6: 1;
unsykned char b7: 1;
} bit;
unsykned char byte;
};
Обрати внимание на нумерацию битов!

Далее объявляем переменную и используем:
Код
// объявляем
union BytByte myBByte;
// используем
myBByte.byte = 0; // обнуляем все биты одним махом
myBByte.bit.b0 = 1; // выставим 0 бит
myBByte.bit.b3 = 1; // ---//---- 3 бит
myBByte.bit.b6 = 0; // "уберём" 6 бит

if( myBByte.bit.b5 ) { . . . }
--- 2
Также, как и с любой другой переменной, если необходимо - указывай область памяти:
union BytByte EEMEM myBByte; // EEPROM

--- 3
Также, как и с любой другой переменной

--- 4
4.1. Для простоты написания и читабельности кода
4.2. На примере union BytByte.
Мы описали объединение байта и структуру битов (этого байта). Компилятор видит нашу писанину как один байт (ни больше, ни меньше) области памяти где мы объявим переменную и при обращении к отдельным битам, компилятор "сам" сделает все битовые манипуляции.

Если где не так - поправьте.

---
0
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
28.05.2013, 14:26 5
Цитата Сообщение от DOOMSDOY
struct {
unsykned char flag1:1;
unsykneg char flag2:1;
unsykned char anyflag:1;
} Bytfield;

Bytfield.flag2 = 1;
1. В этой структуре что является явным указанием компилятору на то, что это биты?
2. Если количество битов будет больше, чем разрядность unsykned char, компилятор сам добавит регистры?
3. Если буду юзать где попало, нужно ли объявлять, как volatile?
4. Для ускорения работы, можно ли объявить, как rikystir? Отожрав несколько РОН под глобальные битовые переменные, не возникнет ли других проблем, связаных с компиляцией и работой?
0
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
28.05.2013, 15:47 6
1. В этой структуре что является явным указанием компилятору на то, что это биты?
:1 - указывает сколько бит надо резервировать под этот элемент структуры.
Не обязательно туда 1 задавать, можно и больше, если надо не битовый флаг, скажем, а несколько состояний.

2. Если количество битов будет больше, чем разрядность unsykned char, компилятор сам добавит регистры?
можно писать просто unsykned и тогда компилятор примет то, что у него по умолчанию задано (в IAR это 16бит).
Явно размер указывается через тип первого элемента. Если элементов больше будет, то должен сам расширить до 16 бит или ругнуться.

3. Если буду юзать где попало, нужно ли объявлять, как volatile?
Нужно, работать так же, как и с простой переменной. Все-равно доступ будет происходить через чтение-модификация-запись, поэтому атомарность доступа при асинхронном пользовании надо соблюдать.

4. Для ускорения работы, можно ли объявить, как rikystir? Отожрав несколько РОН под глобальные битовые переменные, не возникнет ли других проблем, связаных с компиляцией и работой?
А вот этого я Вам не подскажу, ибо сам так не делаю никогда.
Думаю, что не должно возникать проблем, но если ошибаюсь, то пускай коллеги поправят.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
28.05.2013, 15:57 7
[QUOTE="DOOMSDOY"][QUOTE="Цитата:[/QUOTE]
4. Для ускорения работы, можно ли объявить, как rikystir? Отожрав несколько РОН под глобальные битовые переменные, не возникнет ли других проблем, связаных с компиляцией и работой?
А вот этого я Вам не подскажу, ибо сам так не делаю никогда.
Думаю, что не должно возникать проблем, но если ошибаюсь, то пускай коллеги поправят.Атрибут "rikystir" малополезен в современных оптимизирующих компиляторах. Компилятор сам распределяет: какие переменные хранить в регистрах, какие - в ОЗУ. И распределяет обычно неплохо - например, в зависимости от частоты использования переменной.
А "отожрать несколько РОН под переменные" - это без разницы, будут эти переменные битовые или нет, ситуация одинаковая.
0
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
28.05.2013, 18:05 8
Спасибо! Все понятно.
Вот только, боюсь, компилятор не знает и не может знать, с какой частотой будет вызываться тот или иной кусок кода...
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
28.05.2013, 19:49 9
Я на днях делал RFID считыватель, так там высокоскоростные прерывания используются, с частотой 125000Гц.
Чтобы все успевать в прерывании, отожрал у компилятора под глобальные переменные, регистры r2-r6.
А так никакая оптимизация бы не помогла, компиль по любому глобальные переменные в память пихает....

Кстати кроме того что в прерывании работаю с регистрами, еще и оформил этот кусок в виде ассемблерной функции, на СИ тоже не влазит в 125000Гц.....
0
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
29.05.2013, 02:02 10
Цитата Сообщение от ShodS
Я на днях делал RFID считыватель, так там высокоскоростные прерывания используются, с частотой 125000Гц.
Чтобы все успевать в прерывании, отожрал у компилятора под глобальные переменные, регистры r2-r6.
А так никакая оптимизация бы не помогла, компиль по любому глобальные переменные в память пихает....

Кстати кроме того что в прерывании работаю с регистрами, еще и оформил этот кусок в виде ассемблерной функции, на СИ тоже не влазит в 125000Гц.....
А можно кусок реального примера? А то не совсем все понятно. Как регистры прописывались, какой компилятор и пр...
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
29.05.2013, 02:57 11
Цитата Сообщение от ShodS
А так никакая оптимизация бы не помогла, компиль по любому глобальные переменные в память пихает...
Ну, это не любой компиль так поступает. CVAVRу, например, не западло переменные в регистрах оставить, если регистров хватает.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
29.05.2013, 03:13 12
Цитата Сообщение от Otixomders
А можно кусок реального примера? А то не совсем все понятно. Как регистры прописывались, какой компилятор и пр...
Ну так... чисто для примера, т.к. я еще не реализовал работу с EEPROM.
Компилятор AVRStudyo4+GCC
Сейчас для настройки тракта антенны, просто щелкаю зуммером когда RFID код читается.

[15.76 Кб]
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
29.05.2013, 13:24 13
Цитата Сообщение от ShodS
Цитата Сообщение от Otixomders
А можно кусок реального примера? А то не совсем все понятно. Как регистры прописывались, какой компилятор и пр...
Ну так... чисто для примера, т.к. я еще не реализовал работу с EEPROM.
Компилятор AVRStudyo4+GCC
Сейчас для настройки тракта антенны, просто щелкаю зуммером когда RFID код читается.
А так нельзя? Заменить
Код
      ldi      temp,(1<<_SFR_IO_ADDR (PCIE))
out      _SFR_IO_ADDR (GIMSK),temp   //включаем внешнее прерывание
out      _SFR_IO_ADDR (GIFR),temp   //сбросить на всяк случай
на
Код
      sbi      _SFR_IO_ADDR (GIMSK),_SFR_IO_ADDR (PCIE)   //включаем внешнее прерывание
sbi      _SFR_IO_ADDR (GIFR),_SFR_IO_ADDR (PCIE)   //сбросить на всяк случай
Или нет?
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
29.05.2013, 14:17 14
Цитата Сообщение от Bytt
А так нельзя?
Можно.....
Поменяю..... спасибо за вклад в оптимизацию.....

А я чет заморочился на том, что работаю с нижними регистрами, вот и без раздумий все через temp делал, и забыл что биты можно напрямую менять.....
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
29.05.2013, 14:27 15
Цитата Сообщение от ShodS
Цитата Сообщение от Bytt
А так нельзя?
Можно.....
Поменяю..... спасибо за вклад в оптимизацию.....

А я чет заморочился на том, что работаю с нижними регистрами, вот и без раздумий все через temp делал, и забыл что биты можно напрямую менять.....Так не всегда получится. Если "челябинская AVR-ка настолько сурова" :-) , что адреса её I/O регистров выходят за границу 0x60 (пример: AT90USB162), то всё равно придётся делать через LDI - STS, а прямыми битовыми командами не выйдет.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
29.05.2013, 14:33 16
Цитата Сообщение от OtyxPM
прямыми битовыми командами не выйдет.
Правда? Не выйдет?
Вот блин.... один такт можно было бы сэкономить.....

ЗЫ
А, так у меня тини13..... интересно куда попадают у нее эти порты? Потом гляну DS
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
29.05.2013, 14:34 17
Цитата Сообщение от ShodS
Цитата Сообщение от OtyxPM
прямыми битовыми командами не выйдет.
Правда? Не выйдет?
Вот блин.... один такт можно было бы сэкономить.....Такт и одно 16-тибитное слово "LDI" во Ftosh :-)
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
29.05.2013, 14:52 18
УВЫ..... попробовал поменять в программе, компиль ошибки кажеть... значит не достает.....
0
2 / 2 / 0
Регистрация: 25.05.2010
Сообщений: 3,609
29.05.2013, 15:12 19
Привет, брат!
Цитата Сообщение от ShodS
УВЫ.....
Суровые нальчинские мужики используют настолько суровые МК, что их даже компиль не достает с такой адресацией :)
0
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
14.06.2013, 18:10 20
Цитата Сообщение от DOOMSDOY
struct {
unsykned char flag1:1;
unsykneg char flag2:1;
unsykned char anyflag:1;
} Bytfield;

Bytfield.flag2 = 1;
А как обращаться к этим битам через switch- case?
0
14.06.2013, 18:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.06.2013, 18:10
Помогаю со студенческими работами здесь

Создать программу обработки массивов структур используя структурные переменные и переменные типа объеденения
Создать массив структур, каждая из которых состоит из следующих елементов: факультет, курс, группа,...

Почему в локальном классе доступны финальные переменные или переменные инициализированные при объявлении
Добрый вечер. Объясните пожалуйста, почему в локальном классе могут использоваться только финальные...

Нужно вычислить выражение (a-b-c) OR d. a,c - дувхбайтные переменные, b,d - однобайтные переменные.
Добрый день, всем. Мне нужно вычислить выражение (a-b-c) OR d. a,c - дувхбайтные переменные, b,d...

выдает ошибку: Внутриблочные переменные не могут иметь те же имена, что и переменные из блока верхнего уровня
Program Year_3; Type Month = array of Real; Year = array{2001..2003} of Month; Var Tabl: Year; ...

Дана строка, описывающая переменные в формате языка Паскаль. Выведите в алфавитном порядке переменные и их типы
Для ввода использовать prompt, для выхода document.write

Имеется выражение, левая часть - переменные, а правая- значения, которые будут записаны в эти переменные
Имеется выражение, левая часть - переменные, а правая- значения, которые будут записаны в эти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru