|
Битовые области в WinAVR |
|
|
|
Nov 3 2011, 08:15
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Обычно для управления отдельными битами и их проверкой используют конcтрукции: Код ... #define bOne 0x01;
uint8_t Bfield;
int main (void) { ... Bfield |= (1<<bOne); // установка в 1 бита ... Bfield &= ~(1<<bOne); // установка в 0 бита ... if ( Bfield & bOne ) // проверка на 1 { ... } } Есть ли возможность с помощью определения структуры и задания полей задавать битовые области ? Сейчас к сожалению нет возможности попробывать работоспособность этого в железе поэтому привожу пример: Код ... struct Bfield { bit bOne:1; bit bTwo:1; bit bFree:1; };
int main (void) { ... Bfield.bOne=1; // установка в 1 бита ... Bfield.bTwo=0; // установка в 0 бита ... if ( Bfield.bFree==1 ) // проверка на 1 { ... }
|
|
|
|
|
Nov 3 2011, 09:57
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(Палыч @ Nov 3 2011, 11:29)  (только с типом bit Вы погорячились). в книге единственного автора книги описывающий синтаксис языка Си для WinAVR Ю.А.Шпак "Программирование на языке C для AVRи PIC микроконтроллеров" на стр.111 описывется тип данных bit для описания бита
|
|
|
|
|
Nov 4 2011, 09:22
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(XVR @ Nov 3 2011, 17:10)  Писать char Код struct Bfield { char bOne:1; char bTwo:1; char bFree:1; }; тогда получиться что битовое поле будет занимать 1 байт ?
|
|
|
|
|
Nov 7 2011, 10:11
|
Частый гость
 
Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764

|
Цитата(MaxiMuz @ Nov 4 2011, 13:22)  тогда получиться что битовое поле будет занимать 1 байт ? Нет, т.к. 3 битовых поля упакуются в одну переменную указанного типа (в Вашем случае 8-битный char). Вот была совсем недавно тема (хоть в названии значится IAR, но справедливо для всех Си-компиляторов) http://electronix.ru/forum/index.php?showtopic=83920UPD Возможно назову вещи не совсем правильно, но в общем случае битовое поле - это всего лишь средство языка облегчающее труд программиста. А на выходе после компиляции получим те же операции побитовых И и ИЛИ (что в первом посте этой темы).
Сообщение отредактировал Sergey_Aleksandrovi4 - Nov 7 2011, 10:17
|
|
|
|
|
Nov 7 2011, 10:51
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(MaxiMuz @ Nov 4 2011, 12:22)  тогда получиться что битовое поле будет занимать 1 байт ? Да. Пока количество бит в поле не превысит 8-ми штук. Вместо char предпочтительнее всё же использовать uint_fast8_t или uint8_t или unsigned char. Вообще по классике (в вашем диалекте) битовые поля объявляют так: Код struct Bfield { unsigned bOne:1; unsigned bTwo:1; unsigned bFree:1; };
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Nov 7 2011, 17:58
|
Частый гость
 
Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764

|
Цитата(MaxiMuz @ Nov 4 2011, 13:22)  тогда получиться что битовое поле будет занимать 1 байт ? Цитата(Sergey_Aleksandrovi4 @ Nov 7 2011, 14:11)  Нет. Цитата(demiurg_spb @ Nov 7 2011, 14:51)  Да. Тогда я ничего не понимаю. Что есть битовое поле? Это структура вида Код struct Bfield { unsigned chdr bOne:1; unsigned chdr bTwo:1; unsigned chdr bFree:1; }; или это запись вида Код unsigned chdr bOne:1; внутри структуры? А будет ли легитимна конструкция, когда в структуру помимо (?)битовых полей(?) запаковываются переменные? Код struct Bfield { unsigned chdr bOne:1; unsigned chdr bTwo:1; unsigned chdr bFree:1; int Var1; unsigned char Arr[3]; float Var2; };
|
|
|
|
|
Nov 7 2011, 23:43
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Sergey_Aleksandrovi4 @ Nov 7 2011, 19:58)  А будет ли легитимна конструкция, когда в структуру помимо (?)битовых полей(?) запаковываются переменные? Код struct Bfield { unsigned chdr bOne:1; unsigned chdr bTwo:1; unsigned chdr bFree:1; int Var1; unsigned char Arr[3]; float Var2; }; Должна быть легетимна. Проверял на IAR, MSVC++ и других.
|
|
|
|
|
Nov 9 2011, 10:13
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
В WinAVR (20080610) пишу: Код #include <avr/io.h> #include <inttypes.h>
#define KeyMask (1<<Btn1)|(1<<Btn2)
struct Bfield { char One : 1; char bTwo : 1; char bFree : 1; };
int main (void) { Bfield.bTwo=1; Bfield.bOne=0; if (~(PINB)&(KeyMask)) { PORTB=KeyMask; } } Вместо char пробывал и unsigned char и unsigned int8_t и просто unsignedВ итоге ошибка: Код test.c:27: error: 'Bfield' undeclared (first use in this function) test.c:27: error: (Each undeclared identifier is reported only once test.c:27: error: for each function it appears in.) Что я не так делаю ?
|
|
|
|
|
Nov 9 2011, 10:24
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (MaxiMuz @ Nov 9 2011, 13:13)  Что я не так делаю ? Вы объявили тип Bfield, но не переменную этого типа. CODE struct { char One : 1; char bTwo : 1; char bFree : 1; } Bfield; Вот так будет работать.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 9 2011, 12:31
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(Сергей Борщ @ Nov 9 2011, 13:24)  Вы объявили тип Bfield, но не переменную этого типа. Код struct { char One : 1; char bTwo : 1; char bFree : 1; } Bfield; Вот так будет работать. Работает, Спасибо ! Получается что в книге Шпак Ю.А. описание структур неполное Кстати , а как теперь сделать так чтобы битовая область находилась в регистре МК как глобальная переменная ?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|