Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 08.04.2011, 13:21  
sanstan
Прописка
 
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
sanstan на пути к лучшему
По умолчанию Как правильно объявлять булевый тип переменных для МК Atmel?

Подскажите, как правильно объявлять булевый тип переменных для МК Atmel?
Реклама:
sanstan вне форума  
Непрочитано 08.04.2011, 13:55  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Как правильно объявлять булевый тип переменных для МК Atmel?

Это не от контроллера зависит, а от компилятора.
kison вне форума  
Непрочитано 08.04.2011, 14:38  
sanstan
Прописка
 
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
sanstan на пути к лучшему
По умолчанию Re: Как правильно объявлять булевый тип переменных для МК Atmel?

Компилятор AVR GCC
sanstan вне форума  
Непрочитано 08.04.2011, 15:01  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Как правильно объявлять булевый тип переменных для МК Atmel?

Если используете С++, то там есть встроенный тип bool
В Си такого типа нет. Можете определить его сами через typedef на основе char или объявлять булевые переменные как битовые поля структуры. Первый способ ведет к перерасходу памяти, ведь вместо 1 бита мы тратим сразу 8. Второй ведет к группировке таких булевых переменных и объявлению их только оптом. Ну и к обязательной критической секции при модификации такой переменной. Ведь изменение это чтение-модификация-запись. Прерываний во время этой операции быть не должно. Впрочем, если эти переменные не изменяются в прерываниях, то можно и без критической секции обойтись.

Последний раз редактировалось kison; 08.04.2011 в 15:03.
kison вне форума  
Непрочитано 08.04.2011, 15:05  
alex29a
Частый гость
 
Регистрация: 08.06.2010
Сообщений: 17
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
alex29a на пути к лучшему
По умолчанию Re: Как правильно объявлять булевый тип переменных для МК Atmel?

Используйте uint8_t. Определен в ‹inttypes.h›.
alex29a вне форума  
Непрочитано 08.04.2011, 15:19  
sanstan
Прописка
 
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
sanstan на пути к лучшему
По умолчанию Re: Как правильно объявлять булевый тип переменных для МК Atmel?

определяю переменную:
typedef char Flags;
Подскажите, а дальше как писать?
sanstan вне форума  
Непрочитано 08.04.2011, 15:35  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Как правильно объявлять булевый тип переменных для МК Atmel?

Дальше у Вас новый тип - Flags. Назвали бы лучше bool
Тогда:
Код:
#define FALSE (0)
#define TRUE  !FALSE

typedef char bool;

bool Flags;

Flags = TRUE;
Flags = FALSE;

if(Flags) {....};

Последний раз редактировалось kison; 08.04.2011 в 15:44.
kison вне форума  
Непрочитано 08.04.2011, 15:46  
sanstan
Прописка
 
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
sanstan на пути к лучшему
По умолчанию Re: Как правильно объявлять булевый тип переменных для МК Atmel?

с этим понятно.
А второй способ с побитовой группировкой как реализовать?
sanstan вне форума  
Непрочитано 08.04.2011, 15:55  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Как правильно объявлять булевый тип переменных для МК Atmel?

Сообщение от sanstan Посмотреть сообщение
А второй способ с побитовой группировкой как реализовать?
Тоже просто.
Код:
#include ‹stdint.h›

typedef struct
{
 uint8_t  fl_1  :1;
 uint8_t  fl_2  :1;
 uint8_t  fl_3  :1;
 uint8_t  fl_4  :1;
 uint8_t  fl_5  :1;
 uint8_t         :3; // это заглушка для неиспользуемых, можно не ставить.
} Flags_t;

#define FALSE (0)
#define TRUE  !FALSE

Flags_t Flags;

Flags.fl_1 = TRUE;
Flags.fl_4 = FALSE;
if(Flags.fl_3){....};
Не забывайте про квалификатор volatile если флаги изменяются в прерывании. И про критическую секцию в этом случае. Вся модификация флажков должна быть внутри такой секции. Даже если именно этот флаг в прерывании и не изменяется, а изменяется только соседний.
kison вне форума  
Непрочитано 08.04.2011, 16:08  
projects.org.ua
Заблокирован
 
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
projects.org.ua на пути к лучшему
По умолчанию Re: Как правильно объявлять булевый тип переменных для МК Atmel?

Сообщение от kison Посмотреть сообщение
Тоже просто.
Код:
#include ‹stdint.h›

typedef struct
{
 uint8_t  fl_1  :1;
 uint8_t  fl_2  :1;
 uint8_t  fl_3  :1;
 uint8_t  fl_4  :1;
 uint8_t  fl_5  :1;
 uint8_t         :3; // это заглушка для неиспользуемых, можно не ставить.
} Flags_t;

#define FALSE (0)
#define TRUE  !FALSE

Flags_t Flags;

Flags.fl_1 = TRUE;
Flags.fl_4 = FALSE;
if(Flags.fl_3){....};
Не забывайте про квалификатор volatile если флаги изменяются в прерывании. И про критическую секцию в этом случае. Вся модификация флажков должна быть внутри такой секции. Даже если именно этот флаг в прерывании и не изменяется, а изменяется только соседний.
согласен, посути тоже что и я хотел написать уже тут написано Вами
projects.org.ua вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
Книги dosikus Делимся опытом 11242 29.12.2015 23:45
[Решено] Третье Послание Человечеству lelkanet Отвлекитесь, эмбеддеры! 201 06.01.2010 00:33


Часовой пояс GMT +4, время: 15:24.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot