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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Битовые области в WinAVR
MaxiMuz
сообщение Nov 3 2011, 08:15
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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
{ ... }

Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 3 2011, 08:29
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(MaxiMuz @ Nov 3 2011, 12:15) *
Есть ли возможность с помощью определения структуры и задания полей задавать битовые области ?

Такая возможность есть (только с типом bit Вы погорячились).
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Nov 3 2011, 09:57
Сообщение #3


Местный
***

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



Цитата(Палыч @ Nov 3 2011, 11:29) *
(только с типом bit Вы погорячились).

в книге единственного автора книги описывающий синтаксис языка Си для WinAVR Ю.А.Шпак "Программирование на языке C для AVRи PIC микроконтроллеров" на стр.111 описывется тип данных bit для описания бита
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 3 2011, 12:57
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(MaxiMuz @ Nov 3 2011, 13:57) *
в книге единственного автора книги описывающий синтаксис языка Си для WinAVR Ю.А.Шпак "Программирование на языке C для AVRи PIC микроконтроллеров" на стр.111 описывется тип данных bit для описания бита

Да, для отдельной переменной, типа bit. В составе битовых полей в структуре это смысла не имеет.
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Nov 3 2011, 13:57
Сообщение #5


Местный
***

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



а что делать ?
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 3 2011, 14:10
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(MaxiMuz @ Nov 3 2011, 17:57) *
а что делать ?

Писать char
Код
struct Bfield
{
  char bOne:1;
  char bTwo:1;
  char bFree:1;
};
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Nov 4 2011, 09:22
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 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 байт ?
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение Nov 7 2011, 10:11
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



Цитата(MaxiMuz @ Nov 4 2011, 13:22) *
тогда получиться что битовое поле будет занимать 1 байт ?

Нет, т.к. 3 битовых поля упакуются в одну переменную указанного типа (в Вашем случае 8-битный char). Вот была совсем недавно тема (хоть в названии значится IAR, но справедливо для всех Си-компиляторов) http://electronix.ru/forum/index.php?showtopic=83920
UPD Возможно назову вещи не совсем правильно, но в общем случае битовое поле - это всего лишь средство языка облегчающее труд программиста. А на выходе после компиляции получим те же операции побитовых И и ИЛИ (что в первом посте этой темы).

Сообщение отредактировал Sergey_Aleksandrovi4 - Nov 7 2011, 10:17
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 7 2011, 10:51
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 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;
};


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение Nov 7 2011, 17:58
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 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;
};
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 7 2011, 23:43
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 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++ и других.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 8 2011, 05:07
Сообщение #12


неотягощённый злом
******

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



Цитата(Sergey_Aleksandrovi4 @ Nov 7 2011, 20:58) *
Что есть битовое поле? Это структура...
Да. За одним маленьким исключением - нет способа взять адрес поля структуры являющегося битовым полем (offsetof не канает).
Оно должно быть понятно, ибо минимальная адресуемая величина - байт.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Nov 9 2011, 10:13
Сообщение #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.)

Что я не так делаю ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 9 2011, 10:24
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Nov 9 2011, 12:31
Сообщение #15


Местный
***

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



Цитата(Сергей Борщ @ Nov 9 2011, 13:24) *
Вы объявили тип Bfield, но не переменную этого типа.
Код
struct
{
  char One : 1;
  char bTwo : 1;
  char bFree : 1;
}  Bfield;
Вот так будет работать.

Работает, Спасибо ! Получается что в книге Шпак Ю.А. описание структур неполное sad.gif
Кстати , а как теперь сделать так чтобы битовая область находилась в регистре МК как глобальная переменная ?
Go to the top of the page
 
+Quote Post

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

 


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


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