Easyelectronics.ru

Электроника для всех
Текущее время: 25 янв 2022, 09:57

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 44 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 29 авг 2011, 22:29 
Старожил

Зарегистрирован: 08 авг 2011, 21:53
Сообщения: 480
Доброе время суток.
Есть Atmega 162 в которой два USART.
Для каждого обрабатывается прерывание на получение/отправку байта.
Вопрос вот в чем.
Предположим пришел символ на USART0, вошли в прерывание и выставили cli().
В это время приходит/уходит символ на втором USART1 (а у нас режим запрета глобальных прерываний).
Отработал обработчик вызванного прерывания USART0, выставили sei().
Что произойдет дальше? Вызовется ли прерывание на USART1, или будет выставлен флаг прерывания в регистре UCSRA1 но без прерывания, и функцию обработки надо вызывать вручную?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 29 авг 2011, 22:38 
Супермодератор
Аватара пользователя

Зарегистрирован: 23 апр 2010, 12:58
Сообщения: 5892
Откуда: Москва/Саратов
Если второе прерывание разрешено, то оно случится. Программа кинется в его обработчик.

_________________
http://d.64h.me/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 29 авг 2011, 22:47 
Старожил

Зарегистрирован: 08 авг 2011, 21:53
Сообщения: 480
dcoder писал(а):
Если второе прерывание разрешено, то оно случится. Программа кинется в его обработчик.

Ага, то есть если для USART1 разрешены прерывания, то после отработки прерывания USART0, при получении команды sei, прервется обработчик прерывания USART0 и управление перейдет на обработчик прерывания для USART1? Соответственно при обработке прерывания USART1 в стеке будут два адреса возврата. Ниже адрес в теле обработчика прерывания для USART0, следующая команда после sei, а выше адрес возврата из прерывания USART0. Я правильно понимаю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 29 авг 2011, 23:06 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Второе прерывание выполнится. Но если первое прерывание будет слишком долгим, то следующие пришедшие на второй порт символы могут быть потеряны.
Нет, не правильно. При выходе из первого прерывания и установленном флаге на второе вызов второго прерывания произойдет после выхода из первого. Это если выход делать по правилам, через reti. Если в первом прерывании разрешать прерывания, то вызов второго прервет вызов первого.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 29 авг 2011, 23:14 
Старожил

Зарегистрирован: 08 авг 2011, 21:53
Сообщения: 480
PRC писал(а):
Это если выход делать по правилам, через reti. Если в первом прерывании разрешать прерывания, то вызов второго прервет вызов первого.

Я пишу на C, поэтому не могу непосредственно влиять на то, как компилятор реализует выход из прерывания, но если ситуация как в выделенной Вашей цитате. То есть предположим, что в ассемблерном коде sei будет стоять перед reti. Тогда прерывание второго порта прервет прерывание первого до возврата из него. Соответственно когда выполнится второе прерывание, то возврат будет идти по обратной цепочке. Сначала вернемся на reti первого прерывания, затем на прерванный участок программы. Так? Вроде я где то читал, что в 162 меге порт буферизирован: порт может начать принимать байт данных еще до того как предыдущий байт будет считан из буферного регистра приемника. То есть время вроде есть.

И еще один вопросик. МК работает на 16Мгц. Предположим, что скорость передачи составляет 250 000 бод.
Если нам надо грубо оценить время в тактах, которое пройдет между передачей/получением байтов по USART, то получается около 64 (без учета буферизации USART, пусть это будет спасательным кругом если тормознули). То есть надо успеть обработать каждый принятый байт за это время деленное на 2 (два USARTA).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 01:20 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Daemon78 писал(а):
Я пишу на C, поэтому не могу непосредственно влиять на то, как компилятор реализует выход из прерывания, но если ситуация как в выделенной Вашей цитате. То есть предположим, что в ассемблерном коде sei будет стоять перед reti.

Не будет:) При выходе по reti флаг глобального прерывания восстанавливается и ставить дополнительное разрешение не нужно. А значит сначала будет выход, а затем вызов следующего прерывания.
В общем случае, у авр вызовы прерываний не вложенные. Для их разрешения нужно руками ставить флаг I.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 11:57 
Старожил

Зарегистрирован: 08 авг 2011, 21:53
Сообщения: 480
PRC писал(а):
Daemon78 писал(а):
Я пишу на C, поэтому не могу непосредственно влиять на то, как компилятор реализует выход из прерывания, но если ситуация как в выделенной Вашей цитате. То есть предположим, что в ассемблерном коде sei будет стоять перед reti.

Не будет:) При выходе по reti флаг глобального прерывания восстанавливается и ставить дополнительное разрешение не нужно. А значит сначала будет выход, а затем вызов следующего прерывания.
В общем случае, у авр вызовы прерываний не вложенные. Для их разрешения нужно руками ставить флаг I.

Извините, видимо у меня принципиальное недопонимание.
Предположим есть что то вроде обработчика

Код:
void some_int_handler ()
{
cli();
//Суперкод
sei();
return; // Исключительно для наглядности
}

Входим в прерывание, сбрасываем флаг глобальные прерываний;
Что то делаем;
Устанавливаем флаг глобальных прерываний;
Выходим (return я для наглядности вставил, в коде его нет, но в ассемблерном листинге будет один из вариантов возврата типа выталкивание из стека адреса возврата и переход на него, а может еще чего)
1. Итак, вошли в прерывание. Правильно ли я понимаю, что хоть мы и в прерывании, но флаг разрешен, и теоретически мы можем прервать обработчик прерывания?
2. Сняли Флаг прерываний. Все, теперь нас ни кто не прервет. Если разрешены другие прерывания и они случились, то они только взведут свои флаги. Кстати если за время нашего прерывания случится больше двух других прерываний, то начнется исполняться первым с наименьшим номером (читал об этом, но там спор шел так ли это или не так)?
3.Закончили обработку. Флаг прерывания сброшен.
Доходим до ключевых операторов.
Ситуация следующая. Глобальные прерывания запрещены, но у парочки флаги подняты, они на низком старте и ждут поднятия глобального флага прерываний.
Счетчик команд указывает на sei();
4.Исполняем sei(); Флаг глобальных прерываний подымается (то есть как в выделенной Вашей цитате я вручную взвел флаг), счетчик переходит на оператор return;
И...... БАЦ, фиг Вам, младшее прерывание, как наиболее шустрое, забирает управление на себя.
Что делает процессор. Запихивает в стек текущий указатель команд, для нас это будет Сишный return, и входит в другое прерывание.
Прошу не пинать, но как я понял то, что Вы описали выше, выльется в другой сценарий.
Доходим пункта 4. Исполняем sei, но процессор откладывает взведение флага прерываний до выхода из текущего прерывания. После того, как мы выполнили return, процессор вспоминает, что флаг то уже пора бы и поднять, и взводит флаг глобальных прерываний. Я правильно понимаю?
Еще раз уточню, что пишу на "Cи", то есть не вижу что там замутил компилятор. То ли reti, то ли условно pop adres, jmp adres, то ли еще что.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 12:07 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
Цитата:
1. Итак, вошли в прерывание. Правильно ли я понимаю, что хоть мы и в прерывании, но флаг разрешен, и теоретически мы можем прервать обработчик прерывания?

Нет. При входе в прерывание флаг I сбрасывается, и устанавливается после выхода из него. Всё это происходит автоматически.
Цитата:
4.Исполняем sei(); Флаг глобальных прерываний подымается (то есть как в выделенной Вашей цитате я вручную взвел флаг), счетчик переходит на оператор return;

Если вы вручную разрешите прерывания внутри обработчика прерывания - получите вложенные прерывания, и вместе с ним геморрой на своё мягкое место.

Вложенные прерывания можно использовать, но при этом нужно контролировать ход выполнения программы вплоть до такта, и любая ошибка может взорвать мозг при её поиске. Даже не могу представить задачи, где они пригодились бы...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 12:12 
Старожил

Зарегистрирован: 08 авг 2011, 21:53
Сообщения: 480
ploop писал(а):
Цитата:
1. Итак, вошли в прерывание. Правильно ли я понимаю, что хоть мы и в прерывании, но флаг разрешен, и теоретически мы можем прервать обработчик прерывания?

Нет. При входе в прерывание флаг I сбрасывается, и устанавливается после выхода из него. Всё это происходит автоматически.
Цитата:
4.Исполняем sei(); Флаг глобальных прерываний подымается (то есть как в выделенной Вашей цитате я вручную взвел флаг), счетчик переходит на оператор return;

Если вы вручную разрешите прерывания внутри обработчика прерывания - получите вложенные прерывания, и вместе с ним геморрой на своё мягкое место.

Вложенные прерывания можно использовать, но при этом нужно контролировать ход выполнения программы вплоть до такта, и любая ошибка может взорвать мозг при её поиске. Даже не могу представить задачи, где они пригодились бы...


То есть cli() внутри прерывания сбрасывает уже сброшенный флаг? А команда sei() раньше времени подымает флаг, который итак встанет после выхода из прерывания?
Получается, что для исключения вложенных прерываний, надо один раз поднять флаг, а дальше каждое прерывание уже "само будет использовать" механизм cli/sei, чтобы не допустить своего прерывания, и разрешить его после окончания своей работы?
Пойду смотреть, как же компилятор реализует обработку прерывания на асме.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 12:25 
Старожил

Зарегистрирован: 30 авг 2010, 00:02
Сообщения: 926
1. Итак, вошли в прерывание. Правильно ли я понимаю, что хоть мы и в прерывании, но флаг разрешен, и теоретически мы можем прервать обработчик прерывания?
2. Сняли Флаг прерываний. Все, теперь нас ни кто не прервет. Если разрешены другие прерывания и они случились, то они только взведут свои флаги. Кстати если за время нашего прерывания случится больше двух других прерываний, то начнется исполняться первым с наименьшим номером (читал об этом, но там спор шел так ли это или не так)?
----------------------------------------
Флаг нельзя запретить/разрешить, это аппаратная штучка и срабатывает автоматически по определенному событию. Сброшенный флаг в следующем такте может опять взвестись.
По большому счету случиться может только взвод флага, А прерывания подчинены программе и происходят только при их разрешении и наличии взведенного флага.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 12:36 
Старожил

Зарегистрирован: 08 авг 2011, 21:53
Сообщения: 480
анкер писал(а):
Флаг нельзя запретить/разрешить, это аппаратная штучка и срабатывает автоматически по определенному событию. Сброшенный флаг в следующем такте может опять взвестись.

Речь идет о флаге глобальных прерываний, который реагирует на cli/sei. То есть везде, где я говорю флаг, с которым мы совершаем действия, я имею ввиду флаг глобальных прерываний.

Аппаратные флаги, сигнализирующие о каких либо событиях я тут рассматриваю, только в разрезе того, что за время нашего прерывания, случились другие события которые взвели свои флаги прерываний и ждут, когда их обработают. Но мы с ними ни каких действий не совершаем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 12:43 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
Цитата:
То есть cli() внутри прерывания сбрасывает уже сброшенный флаг? А команда sei() раньше времени подымает флаг, который итак встанет после выхода из прерывания?

Именно так. CLI и SEI должны использоваться вне прерываний, для глобального запрета их в случае необходимости (например, при записи в EEPROM).

Цитата:
Получается, что для исключения вложенных прерываний, надо один раз поднять флаг, а дальше каждое прерывание уже "само будет использовать" механизм cli/sei, чтобы не допустить своего прерывания, и разрешить его после окончания своей работы?

Угу. Это аппаратный механизм.

Цитата:
Пойду смотреть, как же компилятор реализует обработку прерывания на асме.

А что вы там увидите? Переход на вектор, потом на обработчик, и всё...

Цитата:
Аппаратные флаги, сигнализирующие о каких либо событиях я тут рассматриваю, только в разрезе того, что за время нашего прерывания, случились другие события которые взвели свои флаги прерываний и ждут, когда их обработают.

Ну он как-бы тоже аппаратный, только у локальных флагов своё аппаратное событие, при котором они устанавливаются/сбрасываются (счётчик досчитал, байт пришел и т.д.), а у этого только одно - вход/выход в прерывание.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 12:49 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
1. Когда вызывается прерывание, то флаг I автоматически сбрасывается.
2. При выходе из прерывания по через reti, флаг I ставиться тоже автоматически.
3. Это все делается аппаратно и компилятор сам ничего не разрешает/запрещает. Единственное отличие, что для выхода из прерывания компилятор использует reti вместо ret.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 12:52 
Старожил

Зарегистрирован: 08 авг 2011, 21:53
Сообщения: 480
Огромное всем спасибо за разъяснение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 13:07 
Старожил

Зарегистрирован: 30 авг 2010, 00:02
Сообщения: 926
Daemon78 писал(а):
анкер писал(а):

Речь идет о флаге глобальных прерываний, который реагирует на cli/sei. То есть везде, где я говорю флаг, с которым мы совершаем действия, я имею ввиду флаг глобальных прерываний.

Аппаратные флаги, сигнализирующие о каких либо событиях я тут рассматриваю, только в разрезе того, что за время нашего прерывания, случились другие события которые взвели свои флаги прерываний и ждут, когда их обработают. Но мы с ними ни каких действий не совершаем.

Флага глобального прерывания не существует, команда cli и вход в прерывание действуют как запрет на реагирование на флаги прерываний. Команда sei и reti - разрешают реакцию на флаги. Для удобства параллельно в прерывании запрещаются все прерывания и сбрасывается флаг конкретного обрабатываемого прерывания. Но это не исключает вход во вложенное прерывание за счет принудительного разрешения глобальных прерываний.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 13:16 
Супермодератор
Аватара пользователя

Зарегистрирован: 23 апр 2010, 12:58
Сообщения: 5892
Откуда: Москва/Саратов
Цитата:
Флага глобального прерывания не существует
- Папа, а правда, что флаг I в регистре SREG это глобальный флаг разрешения/запрещения прерываний?
- Нет сынок, это фантастика...

_________________
http://d.64h.me/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 13:25 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
Цитата:
команда cli и вход в прерывание действуют как запрет на реагирование на флаги прерываний.

И что должно произойти после этой команды? Ну просто, если логически подумать? Ядро должно обложить матом периферию со словами - "если, сука, в прерывание сунешься, спалю нах!!!"???


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 13:29 
Супермодератор
Аватара пользователя

Зарегистрирован: 23 апр 2010, 12:58
Сообщения: 5892
Откуда: Москва/Саратов
На самом деле, все до безобразия просто:
Если (установлен флаг I в SREG) и (установлен флаг разрешения прерывания) и (установлен флаг прерывания) то бежим в обработчик.

_________________
http://d.64h.me/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 13:30 
Старожил

Зарегистрирован: 08 авг 2011, 21:53
Сообщения: 480
анкер писал(а):
Флага глобального прерывания не существует, команда cli и вход в прерывание действуют как запрет на реагирование на флаги прерываний. Команда sei и reti - разрешают реакцию на флаги. Для удобства параллельно в прерывании запрещаются все прерывания и сбрасывается флаг конкретного обрабатываемого прерывания. Но это не исключает вход во вложенное прерывание за счет принудительного разрешения глобальных прерываний.


Ф%к мой мозг.

Тогда еще раз.
sei/cli разрешает/запрещает прерывания глобально. Это факт установленный, вроде вне сомнения.
Теперь у нас есть регистр состояния в котором есть бит номер 7, который реагирует на sei/cli. Как он правильно называется? Я думал что флаг разрешения/запрещения глобального прерывания.
анкер писал(а):
Для удобства параллельно в прерывании запрещаются все прерывания и сбрасывается флаг конкретного обрабатываемого прерывания.

Как я понял из ответов, это реализуется аппаратно?
анкер писал(а):
команда cli и вход в прерывание действуют как запрет на реагирование на флаги прерываний.

То есть их действие аналогично? Только вход это аппаратный аналог программного cli?

Епрст, пока строчил ответ, еще постов добавилось.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 13:33 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
Daemon78, вас глубоко ввели в заблуждение :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 13:33 
Старожил

Зарегистрирован: 08 авг 2011, 21:53
Сообщения: 480
ploop писал(а):
Цитата:
команда cli и вход в прерывание действуют как запрет на реагирование на флаги прерываний.

И что должно произойти после этой команды? Ну просто, если логически подумать? Ядро должно обложить матом периферию со словами - "если, сука, в прерывание сунешься, спалю нах!!!"???

Валяюсь по полу!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 13:33 
Старожил

Зарегистрирован: 30 авг 2010, 00:02
Сообщения: 926
dcoder писал(а):
Цитата:
Флага глобального прерывания не существует
- Папа, а правда, что флаг I в регистре SREG это глобальный флаг разрешения/запрещения прерываний?
- Нет сынок, это фантастика...

Это не флаг, это бит разрешения. Там есть флаги переноса и т.д., но не I. Никакое событие периферии не способно прямо воздействовать на этот бит, значит это не флаг.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 13:35 
Старожил

Зарегистрирован: 08 авг 2011, 21:53
Сообщения: 480
ploop писал(а):
Daemon78, вас глубоко ввели в заблуждение :)

Хотел спросить в каком направлении, но что то вопрос странным получится.
Где именно ввели в заблуждение. Блин. В чем ввели в заблуждение.
Нет, лучше, где ошибка то?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 13:36 
Супермодератор
Аватара пользователя

Зарегистрирован: 23 апр 2010, 12:58
Сообщения: 5892
Откуда: Москва/Саратов
анкер, А вход в обработчик прерывания? Это не аппаратное событие?

_________________
http://d.64h.me/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Atmega 162, два USART, одновременный приход/отправка байта
СообщениеДобавлено: 30 авг 2011, 13:36 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
анкер
http://ru.wikipedia.org/wiki/Регистр_флагов


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 44 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB