Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
08.04.2011, 13:21
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Как правильно объявлять булевый тип переменных для МК Atmel?
Подскажите, как правильно объявлять булевый тип переменных для МК Atmel?
|
|
|
|
08.04.2011, 13:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Как правильно объявлять булевый тип переменных для МК Atmel?
Это не от контроллера зависит, а от компилятора.
|
|
|
|
08.04.2011, 14:38
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: Как правильно объявлять булевый тип переменных для МК Atmel?
Компилятор AVR GCC
|
|
|
|
08.04.2011, 15:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Как правильно объявлять булевый тип переменных для МК Atmel?
Если используете С++, то там есть встроенный тип bool
В Си такого типа нет. Можете определить его сами через typedef на основе char или объявлять булевые переменные как битовые поля структуры. Первый способ ведет к перерасходу памяти, ведь вместо 1 бита мы тратим сразу 8. Второй ведет к группировке таких булевых переменных и объявлению их только оптом. Ну и к обязательной критической секции при модификации такой переменной. Ведь изменение это чтение-модификация-запись. Прерываний во время этой операции быть не должно. Впрочем, если эти переменные не изменяются в прерываниях, то можно и без критической секции обойтись.
Последний раз редактировалось kison; 08.04.2011 в 15:03.
|
|
|
|
08.04.2011, 15:05
|
|
Частый гость
Регистрация: 08.06.2010
Сообщений: 17
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Как правильно объявлять булевый тип переменных для МК Atmel?
Используйте uint8_t. Определен в ‹inttypes.h›.
|
|
|
|
08.04.2011, 15:19
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: Как правильно объявлять булевый тип переменных для МК Atmel?
определяю переменную:
typedef char Flags;
Подскажите, а дальше как писать?
|
|
|
|
08.04.2011, 15:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
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.
|
|
|
|
08.04.2011, 15:46
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: Как правильно объявлять булевый тип переменных для МК Atmel?
с этим понятно.
А второй способ с побитовой группировкой как реализовать?
|
|
|
|
08.04.2011, 15:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
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 если флаги изменяются в прерывании. И про критическую секцию в этом случае. Вся модификация флажков должна быть внутри такой секции. Даже если именно этот флаг в прерывании и не изменяется, а изменяется только соседний.
|
|
|
|
08.04.2011, 16:08
|
|
Заблокирован
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
|
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 если флаги изменяются в прерывании. И про критическую секцию в этом случае. Вся модификация флажков должна быть внутри такой секции. Даже если именно этот флаг в прерывании и не изменяется, а изменяется только соседний.
|
согласен, посути тоже что и я хотел написать уже тут написано Вами
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:25.
|
|