ни в коем случае! пишется так "| <маска битов>"Alexeyslav писал(а):есть - пишется как "|| <маска битов>"
WinAvr в вопросах и ответах
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAvr в вопросах и ответах
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAvr в вопросах и ответах
во-первых, снова непонятное увлечение макросами - для установки сразу 4 бит сделаете еще один макрос, для двух - еще, для пяти - тоже?! чем ваш макрос лучше обычной записи?!FreshMan писал(а):#define SetBit(reg, bit0, bit1, bit2) reg |= (1<<(bit0)|(1<<(bit1)|(1<<(bit2))
во-вторых, скобочки в макросе своем пересчитайте и напишите правильно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: WinAvr в вопросах и ответах
попался мне на глаз один и тот же макрос но по разному записанный
#define SetBit(reg, bit) reg |= (1<<(bit))
#define BM_SetBit(var, bit) do{(var) |= (1<<(bit));}while(0)
равнозначны ли они по правильности ?
почему этими макросами пользоватся не рекомендуется ?
#define sbi(port, bit) (port) |= (1 << (bit))
#define cbi(port, bit) (port) &= ~(1 << (bit))
#define SetBit(reg, bit) reg |= (1<<(bit))
#define BM_SetBit(var, bit) do{(var) |= (1<<(bit));}while(0)
равнозначны ли они по правильности ?
почему этими макросами пользоватся не рекомендуется ?
#define sbi(port, bit) (port) |= (1 << (bit))
#define cbi(port, bit) (port) &= ~(1 << (bit))
Последний раз редактировалось FreshMan Вс май 11, 2014 09:31:55, всего редактировалось 1 раз.
Tell Me The Truth
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: WinAvr в вопросах и ответах
правильность - понятие субъективное. По сути, если ОНО работает - оно правильно.
- ИС-пытатель
- Вымогатель припоя
- Сообщения: 577
- Зарегистрирован: Ср июн 19, 2013 08:10:48
- Откуда: Москва, СПб, Липецк, Рязань
Re: WinAvr в вопросах и ответах
Скорее всего, из-за схожести с ассемблерными командами.почему этими макросами пользоватся не рекомендуется ?
#define sbi(port, bit) (port) |= (1 << (bit))
#define cbi(port, bit) (port) &= ~(1 << (bit))
И еще они могут привести к ошибкам тех, у кого мало опыта в программировании. При их использовании нужно четко понимать, что они делают, а не абстрактно представлять, типа "сбрасывают нужный нам бит и не трогают остальные"
Я не так давно нарвался на такую ошибку. Думал баг какой-то у контроллера нашел. Но один очень внимательный человек на форуме меня образумил (причем, при всем его большом опыте тоже не сразу нашел).
Взять, например, регистр настройки и управления АЦП. В нем часть битов включают те или иные функции (в том числе сам АЦП), и есть 1 бит флага, который сбрасывается записью 1 (именно комбинация флагов с обычными битами в одном регистре и дает ошибки). А теперь подумайте, что будет, если Вы сбрасываете или устанавливаете какой-то управляющий бит одной из этих макрокоманд и при этом у Вас на тот момент установлен флаг прерывания? Правильно, флаг сбросится. Т.е. можно даже сбрасывать флаги вот таким способом: ADCSRA = ADCSRA
Другой момент. Регистр UDR интерфейса UART. при чтении он извлекает данные из буфера ПРИЕМНИКА, а при записи он посылает данные в буфер ПЕРЕДАТЧИКА. Естественно такой способ записи в него не канает. Кстати, ассемблерные команды SBI и CBI к данному регистру также применять не рекомендуется, поскольку они также делают чтение-модификацию-запись.
P.S. Пользоваться можно всем. Только необходимы соотвествующие знания и умения.
- Реклама
Re: WinAvr в вопросах и ответах
Да, равнозначны. Второй вариант позволяет более гибко им (макросом) пользоваться.FreshMan писал(а):равнозначны ли они по правильности ?
http://www.opennet.ru/docs/RUS/cpp/cpp-5.html (см. раздел "Использование точки с запятой")
Отчего же, ИС-пытатель правильно написал - главное чётко понимать что делается.FreshMan писал(а):почему этими макросами пользоватся не рекомендуется ?
А то может получиться как вот в этой теме, например.
ИС-пытатель подтвердит.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- ИС-пытатель
- Вымогатель припоя
- Сообщения: 577
- Зарегистрирован: Ср июн 19, 2013 08:10:48
- Откуда: Москва, СПб, Липецк, Рязань
Re: WinAvr в вопросах и ответах
Вот, вот этот человек, подозрительной наружности, который нашел мою ошибку! 
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAvr в вопросах и ответах
хотя при этом флаги и сбросятся, но в целом гарантировать предсказуемый результат при этом нельзя.ИС-пытатель писал(а):Т.е. можно даже сбрасывать флаги вот таким способом: ADCSRA = ADCSRA
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ИС-пытатель
- Вымогатель припоя
- Сообщения: 577
- Зарегистрирован: Ср июн 19, 2013 08:10:48
- Откуда: Москва, СПб, Липецк, Рязань
Re: WinAvr в вопросах и ответах
В смысле?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAvr в вопросах и ответах
что - в смысле? эта операция может не только сбросить флаг запроса прерывания, но и запустить новое преобразование. т.е. может - а сделает или нет - никто гарантии не даст.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: WinAvr в вопросах и ответах
ARV, race condition?
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAvr в вопросах и ответах
моя твоя не понимай 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ИС-пытатель
- Вымогатель припоя
- Сообщения: 577
- Зарегистрирован: Ср июн 19, 2013 08:10:48
- Откуда: Москва, СПб, Липецк, Рязань
Re: WinAvr в вопросах и ответах
Ну, вроде как по учебника не должно. Да и на практике я проверял у нескольких моделей - не было такого. Иначе фигня реально получится. Каждый раз при сбросе флага, когда идет преобразование, последнее будет начинаться заново.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAvr в вопросах и ответах
должно или не должно - это можно гадать, факт в том, что МОЖЕТ такое быть. и рано или поздно такое может произойти.
поясняю:
пусть идет преобразование АЦП, т.е. бит ADSC установлен.
начинает выполняться оператор ADCSRA = ADCSRA;
считывается во внутренний регистр содержимое ADCSRA, и тут возникает прерывание, хоть бы и от таймера. пока прерывание отрабатывает - завершается преобразование АЦП и бит ADSC обнуляется. после отработки прерывания вы записываете в ADCSRA содержимое временного регистра, а там ADSC установлен - вуаля! происходит несанкционированный старт преобразования.
поясняю:
пусть идет преобразование АЦП, т.е. бит ADSC установлен.
начинает выполняться оператор ADCSRA = ADCSRA;
считывается во внутренний регистр содержимое ADCSRA, и тут возникает прерывание, хоть бы и от таймера. пока прерывание отрабатывает - завершается преобразование АЦП и бит ADSC обнуляется. после отработки прерывания вы записываете в ADCSRA содержимое временного регистра, а там ADSC установлен - вуаля! происходит несанкционированный старт преобразования.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: WinAvr в вопросах и ответах
Тут ещё вопрос, не выбросит ли при оптимизации компилятор такую инструкцию вообще, как бессмысленную (с его точки зрения).
Re: WinAvr в вопросах и ответах
ARV, race condition !!!
В чистом виде race condition!
Race conditions [рэйс кондишэнс]. Это ошибки связанные с последовательностью выполнения операций. Это термин из параллельного программирования, но тут он тоже применим. Перевод на русский , на мой взгляд, обычно некорректен, так как не отражает смысла. Я бы сказал, что это можно назвать "условия выполнения" или "ошибки последовательности выполнения". А смысл в том, что последовательность выполнения операций может быть не такая, которую представлял себе автор кода. Это могут быть вариации по типу случая как выше описал уважаемый ARV. А могут быть и совсем замороченные варианты.
Одно радует, что в простых МК таких вариантов не слишком много. Это модификация регистров периферии и модификация много байтовых volatile переменных (программы с прерываниями). И то и другое можно избежать при хорошем знании МК, проработке алгоритма и использованием атомарных регионов (где требуется). Может кто-нибудь добавит ещё что?
Кстати, вариант описанный ARV может произойти и без прерывания. Если "удачно" сложиться ситуация, когда прочитается состояние в последний такт перед сбросом флага...
В чистом виде race condition!
Race conditions [рэйс кондишэнс]. Это ошибки связанные с последовательностью выполнения операций. Это термин из параллельного программирования, но тут он тоже применим. Перевод на русский , на мой взгляд, обычно некорректен, так как не отражает смысла. Я бы сказал, что это можно назвать "условия выполнения" или "ошибки последовательности выполнения". А смысл в том, что последовательность выполнения операций может быть не такая, которую представлял себе автор кода. Это могут быть вариации по типу случая как выше описал уважаемый ARV. А могут быть и совсем замороченные варианты.
Одно радует, что в простых МК таких вариантов не слишком много. Это модификация регистров периферии и модификация много байтовых volatile переменных (программы с прерываниями). И то и другое можно избежать при хорошем знании МК, проработке алгоритма и использованием атомарных регионов (где требуется). Может кто-нибудь добавит ещё что?
Кстати, вариант описанный ARV может произойти и без прерывания. Если "удачно" сложиться ситуация, когда прочитается состояние в последний такт перед сбросом флага...
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- ИС-пытатель
- Вымогатель припоя
- Сообщения: 577
- Зарегистрирован: Ср июн 19, 2013 08:10:48
- Откуда: Москва, СПб, Липецк, Рязань
Re: WinAvr в вопросах и ответах
Не выбросит. Все регистры по умолчанию объявлены как volatileWiseLord писал(а):Тут ещё вопрос, не выбросит ли при оптимизации компилятор такую инструкцию вообще, как бессмысленную (с его точки зрения).
О, мля.. А вот об этом я как-то не подумал.. )) Спасибо, буду знать. ) С прерываниями-то понятно, их всегда в голове держишь..Если "удачно" сложиться ситуация, когда прочитается состояние в последний такт перед сбросом флага...
А с другой стороны, рассматривая в этом же ключе, чем ADCSRA = ADCSRA отличается от ADCSRA |= (1<<ADIF) ?? Также можно случайно запустить новое преобразование.
Кстати, еще интересен такой вопрос: если во время преобразования попытаться сбросить флаг ADSC (старт преобразования и его текущий статус, идет/не идет), то преобразование остановится? или же его можно остановить только выключением всего АЦП?
Re: WinAvr в вопросах и ответах
Да, можно и таким способом ненароком запустить новое преобразование. Не забывай про "хорошее знание МК и проработку алгоритма".
Ответ на второй вопрос тоже лежит в области знания МК - внимательно читай спецификацию.
Ответ на второй вопрос тоже лежит в области знания МК - внимательно читай спецификацию.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAvr в вопросах и ответах
ничем не отличается, поэтому ручное сбрасывание флагов запросов прерываний делать надо с особой осторожностью. лично мне никогда и в голову не приходило использовать ADIF для определения окончания преобразования без прерываний - ADSC для этой цели куда логичнее (и безопаснее) использовать.ИС-пытатель писал(а):А с другой стороны, рассматривая в этом же ключе, чем ADCSRA = ADCSRA отличается от ADCSRA |= (1<<ADIF) ??
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: WinAvr в вопросах и ответах
но тогда надо будет коротать время в цикле, ожидая пока ADSC не станет равен нулюARV писал(а):ADSC для этой цели куда логичнее (и безопаснее) использовать.
а если мне надо запустить преобразование и идти дальше по своим делам, как тут быть ?
насколько я понимаю, без проверки ADIF тут не обойтись
Tell Me The Truth


