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

 
 
> Прерывания в Atmel 8535
DMD
сообщение Jun 3 2008, 20:48
Сообщение #1


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

Группа: Свой
Сообщений: 120
Регистрация: 19-02-08
Пользователь №: 35 166



У меня возникла парочка вопросов по прерываниям, смотрел в документации - не нашел. Если сможете - подскажите, пожалуйста.
Как я понял из документации, при входе в обработчик прерывания все остальные прерывания запрещаются, ведь так? То есть неявно выполняется инструкция cli. А что происхоит в случае, если за время обработки происходит внешнее прерывание, INT0, к примеру? Информация о нем отбрасывается или остается где-то? Дело в том, что я пишу обработчик и мне надо знать было ли за время работы обработчика прерывание. Если было, то после выхода вызвать другой обработчик...
И ещё вопрос: как я понял, приоритет у всех внешних прерываний одинаковый, ведь так? А назначить приоритет можно только программно, правда?
Спасибо.


--------------------
Все будет хорошо! Я проверял!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DMD
сообщение Jun 3 2008, 22:24
Сообщение #2


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

Группа: Свой
Сообщений: 120
Регистрация: 19-02-08
Пользователь №: 35 166



А есть возможность как-нибудь очистить вот эту очередь прерываний? Я имею ввиду сделать так, чтобы после обработки текущего отложенные прерывания не выполнялись?.. Куда хоть посмотреть можно?


--------------------
Все будет хорошо! Я проверял!
Go to the top of the page
 
+Quote Post
zhevak
сообщение Jun 6 2008, 06:11
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(DMD @ Jun 4 2008, 04:24) *
А есть возможность как-нибудь очистить вот эту очередь прерываний? Я имею ввиду сделать так, чтобы после обработки текущего отложенные прерывания не выполнялись?.. Куда хоть посмотреть можно?


Возвращайтесь из обработчика прерывания не по команде RETI, а по команде RET. Разница в том, что RETI насильственно устанавливает флаг I в регистре SREG, а команда RET -- флаги в регистре не трогает вообще. И не забудьте про регистры, которые вы в начале обработчика сохранили в стеке.

А флаги конкретных прерываний (которые имели наглость установиться за это время) снимайте сами, как это посоветовал dENIM.

Сообщение отредактировал zhevak - Jun 6 2008, 06:13


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
777777
сообщение Jun 7 2008, 07:52
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(zhevak @ Jun 6 2008, 10:11) *
Возвращайтесь из обработчика прерывания не по команде RETI, а по команде RET.

Возвращаться из обработчика по команде RET нельзя!
Цитата(zhevak @ Jun 6 2008, 10:11) *
Разница в том, что RETI насильственно устанавливает флаг I в регистре SREG, а команда RET -- флаги в регистре не трогает вообще.

Вот именно! А их надо восстанавливать. Что тебе насчитает основная программа, если прерывания будут периодически портить регистр состояния?
Go to the top of the page
 
+Quote Post
zhevak
сообщение Jun 7 2008, 10:38
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(777777 @ Jun 7 2008, 13:52) *
Возвращаться из обработчика по команде RET нельзя!


Да, почему нельзя? Если ты пишешь код и четко понимаешь как он исполняется, то какие проблемы?

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

Я не вижу здесь ни каких проблем. Не традиционный подход? -- Да. Опасные игры с кодом? -- Да. Но если ты четко знаешь, что происходит, то какие проблемы? По моему, здесь как раз и проходит грань между программированием, как "технология", и программированием, как "искусство".


А вообще, беспредметно спорить, только время терять.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 9 2008, 11:42
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(zhevak @ Jun 7 2008, 13:38) *
Да, почему нельзя? Если ты пишешь код и четко понимаешь как он исполняется, то какие проблемы?

И превед глюкодром!
Лучше не давать бестолковых советов.

Из обработчика прерывания следует возвращаться командой RETI.


Цитата(DMD @ Jun 4 2008, 01:24) *
А есть возможность как-нибудь очистить вот эту очередь прерываний? Я имею ввиду сделать так, чтобы после обработки текущего отложенные прерывания не выполнялись?.. Куда хоть посмотреть можно?

А вы уверены, что это действительно то, что Вам нужно?
Обработчики прерываний можно сделать максимально короткими, тогда не придется сбрасывать "очереди отложенных прерываний". Все будет успевать отрабатываться как положено.

Например:
прерывание от UART - принять байт, взвести флаг "есть" данные и выйти.
прерывание таймера - увеличить внутренний счетчик (дергуть ногой если надо) и выйти.
прерывание от АЦП - сохранить результат АЦП (переключить на другой канал если требуется) и выйти.
и т.п.

Основную же обработку - вести в основном цикле программы (тобиш в main).

Цитата(Maik-vs @ Jun 9 2008, 12:31) *
Вы пишите на ассемблере, отлаживайте. И тогда всё будет нормально, хоть с вложенными прерываниями, хоть с выложенными smile.gif

И будут преведы, да еще и на ассемблере. smile.gif
Потом попробуйте к такой программе прилепить новую функциональность. (например еще один протокол обмена).

AVR со своим одноуровневым контроллером прерываний избавляет пользователя от множества проблем, бери да спокойно работай. Глубина стека прогнозируемая, overload прогнозируемый и легко расчитываемый. Карандаш в руки - просчитать нагрузку обработчиков прерываний и все - можно спасть спокойно. Неспешно расширять функционал программы не боясь что система загнется (не трогая обработчиков прерываний).

почему многие так и рвутся получить проблему (через одно место работая с прерываниями)? А потом эту проблему исправлять опять же через то же самое место?!
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Jun 10 2008, 12:39
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(defunct @ Jun 9 2008, 15:42) *
И будут преведы, да еще и на ассемблере. smile.gif
Потом попробуйте к такой программе прилепить новую функциональность. (например еще один протокол обмена).

Преведы бывают хоть на ассемблере, хоть на с хоть на чём! Если руки не оттуда.
Функциональность программы для МК - гм, изначально несколько более строго задаётся, чем функциональность программы для большого компьютера. Брать куски из одного проекта для другого - да. Расширять функциональность - это если плохое ТЗ.

Цитата(defunct @ Jun 9 2008, 15:42) *
почему многие так и рвутся получить проблему (через одно место работая с прерываниями)? А потом эту проблему исправлять опять же через то же самое место?!

Потому что многих жмёт пространство и время. Про коробочку размером с "крону" написано. Про время: попробуйте сделать хоть генератор текста для врезания в видеосигнал - будете считать циклы процессора. С карандашом в руках, совсем несложно.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 10 2008, 14:22
Сообщение #8


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Maik-vs @ Jun 10 2008, 15:39) *
Преведы бывают хоть на ассемблере, хоть на с хоть на чём! Если руки не оттуда.

На ассемблере преведов на порядок больше, и руки тут не при чем.
Зерно примитивов меньше - текста больше, сложность программы выше.
Программа получается ДУБОВАЯ - практически не подлежащая вразумительному расширению.

Цитата
Функциональность программы для МК - гм, изначально несколько более строго задаётся, чем функциональность программы для большого компьютера. Брать куски из одного проекта для другого - да.

У кого как, мне важнее time-to-market и возможность заливать в одно и тоже железо разное ПО. Постепенно наращивать функциональность приходится - допустим выпустят новый Сепам или МРЗС и еще какую-то байду, добавить их к уже имеющейся прошивке нет проблем, и все управляющие устройства сразу умеют с ними работать. Надо только обновить прошивку.
За примерами далеко ходить не надо -
DVD/CD-RW - поддержка дисков разных производителей часто добавляется уже после выхода привода в продажу;
Wireless AP / Router'ы - добавление различных режимов и служб тоже происходит после.
и т.п.
Цитата
Расширять функциональность - это если плохое ТЗ.

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

Цитата
Потому что многих жмёт пространство и время.

Пространство меня не жмет. Хоть в медном тазу можно клепать, лишь бы крепилось на дин-рейку.
А про время, я вас умаляю. Ассемблеру с C не тягяться в этом.
Улыбнуло. ;>

Цитата
Про коробочку размером с "крону" написано. Про время: попробуйте сделать хоть генератор текста для врезания в видеосигнал - будете считать циклы процессора. С карандашом в руках, совсем несложно.

Мне не нужен генератор врезки текста, но например в IP router я смогу при необходимости легко добавить telnet консольку или http сервер или фильтр какой-нить хитроумный.
Go to the top of the page
 
+Quote Post
galjoen
сообщение Jun 10 2008, 15:17
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(defunct @ Jun 10 2008, 18:22) *
На ассемблере преведов на порядок больше, и руки тут не при чем.
Зерно примитивов меньше - текста больше, сложность программы выше.
Программа получается ДУБОВАЯ - практически не подлежащая вразумительному расширению.
У кого как, мне важнее time-to-market и возможность заливать в одно и тоже железо разное ПО. Постепенно наращивать функциональность приходится - допустим выпустят новый Сепам или МРЗС и еще какую-то байду, добавить их к уже имеющейся прошивке нет проблем, и все управляющие устройства сразу умеют с ними работать. Надо только обновить прошивку.

А я наоборот как наполучал преведы на С (для АВР), так на асм перешёл. И С для АВР забыл как страшный сон (для компьютера конечно на С++ пишу). У АВР 80% работы - это работа с USART, CAN, SPI, таймерами, портами др. устройсвами. А в этом С только мешает. Напишешь на С и понимаешь, что написал программу на ассемблере с помощью С. Всё равно приходится весь получившийся ассемблерный текст контролировать.
А насчёт расширяемости:
1. Я сначала USB-HID написал и обращение через него к специфическим задачам.
2. Самопрограммирование через USB.
3. Всякие модбасы и др. USARTовские дела.
4. Mass Storage.
5. FAT (при работе без подключения к компьютеру).
6. SLEEP (работа от ионистора).
7. CAN.
Всё это работает в разных проектах в разных вариантах. В т.ч. и всё это в одном устройстве (на AT90CAN128). И прошивки без проблем через интернет обновляются самими пользователями. Причём они даже об этом иногда не знают.
Я всё это к тому, что и на асме и на С можно как плохо, так и хорошо писать.
Go to the top of the page
 
+Quote Post
777777
сообщение Jun 11 2008, 05:51
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(galjoen @ Jun 10 2008, 19:17) *
А я наоборот как наполучал преведы на С (для АВР), так на асм перешёл.


Вместо того, чтобы найти их причину? smile.gif
Go to the top of the page
 
+Quote Post
galjoen
сообщение Jun 11 2008, 14:56
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(777777 @ Jun 11 2008, 09:51) *
Вместо того, чтобы найти их причину? smile.gif

Нашёл несколько причин. Одна из них - несохранение С некоторых регистров в прерываниях. Искал долго т.к. вылезало редко, не во всех режимах, вылезало совсем в другом месте (в том месте которое было прервано после возврата с испорченными регистрами) и приводило к тому, что процессор выдавал на шину 1, а устройство 0. При этом происходило замыкание, срабатывала защита по питанию, срабатывал BOD, процессор перезапускался. Столько времени я бесполезно потерял... Понимаю, что в новых версиях это исправлено, но у меня уже какая-то аллергия на С для АВР выработалась. Мне всё кажется, что это глюк не мой, а С. А когда на асме пишу, то между мной и процессором никого нет... Макрокоманд для стандартных случаев понаписал. Если надо быстро сделать (и можно неоптимально), то макрокомандами пользуюсь. В принципе что-то типа своего языка на макрокомандах получилось.
ЗЫ Прошу прощения за офтоп.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- DMD   Прерывания в Atmel 8535   Jun 3 2008, 20:48
- - Qwertty   Цитата(DMD @ Jun 4 2008, 00:48) Если было...   Jun 3 2008, 21:17
|- - smac   Цитата(Qwertty @ Jun 4 2008, 01:17) Это п...   Jun 6 2008, 12:23
||- - Т.Достоевский   Цитата(smac @ Jun 6 2008, 16:23) ... в ко...   Jun 6 2008, 20:01
|- - 777777   Цитата(Qwertty @ Jun 4 2008, 01:17) Возмо...   Jun 7 2008, 04:00
|- - artemm   Цитата(Qwertty @ Jun 4 2008, 00:17) Возмо...   Jun 9 2008, 05:56
|- - Maik-vs   Цитата(artemm @ Jun 9 2008, 09:56) Если р...   Jun 9 2008, 09:31
|- - alx2   Цитата(artemm @ Jun 9 2008, 10:56) Если р...   Jun 9 2008, 20:28
|- - dENIM   Цитата(DMD @ Jun 4 2008, 01:24) А есть во...   Jun 3 2008, 23:27
|- - 777777   Цитата(zhevak @ Jun 7 2008, 14:38) Я не в...   Jun 9 2008, 04:29
||- - zhevak   Цитата(777777 @ Jun 9 2008, 10:29) Пробле...   Jun 9 2008, 06:43
|- - Maik-vs   Вот оно, ключевое слово: Цитата(defunct @ Jun...   Jun 12 2008, 11:11
|- - defunct   Цитата(Maik-vs @ Jun 12 2008, 14:11)...   Jun 12 2008, 18:49
||- - sKWO   Цитата(defunct @ Jun 12 2008, 22:49) Если...   Jun 13 2008, 10:42
||- - Maik-vs   Цитата(defunct @ Jun 12 2008, 22:49) Если...   Jun 14 2008, 18:52
|- - sKWO   Цитата(Maik-vs @ Jun 12 2008, 15:11)...   Jun 15 2008, 09:05
- - 733259   ЦитатаДело в том, что я пишу обработчик и мне надо...   Jun 13 2008, 18:09
- - 733259   Не по теме, но не удержался Кодregister uint8_t ...   Jun 15 2008, 09:42


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:53
Рейтинг@Mail.ru


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