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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Проблема с прерываниями в Xmega
Navovvol
сообщение Sep 20 2011, 08:19
Сообщение #16


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

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



Цитата(ILYAUL @ Sep 20 2011, 12:11) *
Вы знаете зачем перед вектором прерывания стоит .org ? И что она делает?

могу предположить, что определяет абсолютный адрес.
Go to the top of the page
 
+Quote Post
element
сообщение Sep 20 2011, 08:43
Сообщение #17





Группа: Новичок
Сообщений: 8
Регистрация: 23-01-09
Пользователь №: 43 859



Цитата(zombi @ Sep 19 2011, 00:48) *
...
Т.е. для выхода из обработчика прерывания не достаточно одной команды RETI ? надо еще и SEI перед ним лепить?

Шо то слабо верится в такой баг laughing.gif


Добрый день.

В обычном обработчике прерываний ничего, кроме RETI лепить не нужно.
Вы, видимо, невнимательно читали мой пост. В моём случае такая комбинация необходима для XMeg-и потому, что обработчк прерываний - менеджер задач, он переключает задачи и соответсвенно их контексты, а это значит, что он все системно-критичные объекты сохраняет-восстанавливает для каждой задачи: стек, регистр флагов, набор регистров общего назначения. Таким образом при восстановлении регистра флагов бит I оказывался сброшенным. В обычной меге при входе в прерывание I-бит сбрасывается а при выходе из прерывания достаточно было RETI - там она железно подымала I. Прикол в том, что в XMeg-е при входе в прерывание I-бит не сбрасывается, а блокируется только ЭТОТ уровень прерываний, а прерывания более высокого уровня приоритета могут прервать текущий (согласно даташиту).
Такая схема сделана для работы многоуровневой системы прерываний, потому что если будет сброшен I-бит, то ВООБЩЕ НИКАКИЕ прерывания не сработают.
Команда RETI завязана на PMIC, она просто сообщает контроллеру, что данный уровень приоритетов освободился. Интересно, что в обычном режиме - не из прерывания - RETI всё таки подымает I-бит sm.gif.

Информация для тех - кто играет на мегах и иск-мегах на асме виртуозно, с применением фигур высшего пилотажа. На си там вабще всё компилер разруливает.

И ещё - для того что бы читать/писать указатель стека НЕ НУЖНО атомарная операция (в терминах её трактовки для AVR), но прерывания должны быть запрещены, - иначе - "УПС..."


[quote name='V_G' date='Sep 20 2011, 11:17' post='974064']
Написали же, xmegа в прерываниях не сбрасывает флаг I, и рецепт "добавил команду SEI перед RETI" не есть правильный. Случайно заработало, в следующий раз при аналогичной проблеме не заработает. Ни в mege, ни в xmege не стоит лишний раз дергать флаг I, тем более в прерываниях.
У xmegи вообще трехуровневая система прерываний, и надо очень грамотно расставлять их изначальные приоритеты, не дергая I.



Случайностей в процессоре не бывает.
Приоритеты все грамотно расставлены, поверьте.
А откуда такая боязнь дёргать I-бит? даже в прерываниях?
Прерывание - обычная процедура, просто она вызывается асинхронно по отношению к основной нити программы, реагируя на событие в нужный момент. В обычных мегах, где не было приоритетов, для эмуляции многоуровневой системы прерываний в обработчике я ставил sei, давая возможность более приоритеным событиям прервать текущий уровень.
Я использую архитектуру построения программы клиент-сервер, с системой событий. Прерывания у меня выставляют флаги - далее основной цикл по мере возможностей разгребает события (аналогичноый подход у V_G). Но иногда бывают события, никак не позволяющие отлагательств - например обработка КЗ в IGBT-транзисторе. Здесь и спасает "дёргание I-бита".

Сообщение отредактировал IgorKossak - Sep 20 2011, 10:46
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 20 2011, 08:44
Сообщение #18


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(V_G @ Sep 20 2011, 11:17) *
Написали же...
Исправьте каменты в 13 сообщении. Не стоит приписывать мне того, что я не писал.
А суть моего вопроса была в том, как на Xmega решается проблема атомарности модификации регистра SP...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Sep 20 2011, 08:46
Сообщение #19


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

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



element, если прерывание не сбрасывает I бит, тогда что вам даст SEI перед RETI ?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 20 2011, 08:52
Сообщение #20


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(V_G @ Sep 20 2011, 11:17) *
Ни в mege, ни в xmege не стоит лишний раз дергать флаг I, тем более в прерываниях.
Абсолютно голословно. Чем это чревато? Поясните на примере обычной меги для конкретики.
Я абсолютно точно знаю что и когда дёргаю, если дёргаю, а главное знаю зачем это нужно...
Вы знакомы с концепциями SST (super simple threading)? Вижу что нет. Почитайте, узнаете много нового.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 20 2011, 09:26
Сообщение #21


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Navovvol @ Sep 20 2011, 11:46) *
element, если прерывание не сбрасывает I бит, тогда что вам даст SEI перед RETI ?

Ну, например, даст возможность не инициализировать важные переменные
Цитата(element @ Sep 18 2011, 19:50) *
по прерываю таймера обработчик переключает задачи - сохраняет/восстанавливает регистры, стек, точки возврата и (ЭТО ВАЖНО!) регистр флагов SREG. При инициализации системы ячейки контекста задач, хранящие SREG неопределённые (как правило нулевые после сброса) - и это в принципе не важно,
в частности, образ SREG в контексте задачи.
Если бы в образе SREG была поднята 1-ка, то не нужно было бы уповать на поднятие I командой reti, всё отрабатывало бы по восстановлению SREG.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
element
сообщение Sep 20 2011, 09:52
Сообщение #22





Группа: Новичок
Сообщений: 8
Регистрация: 23-01-09
Пользователь №: 43 859



Цитата(ReAl @ Sep 20 2011, 13:26) *
Ну, например, даст возможность не инициализировать важные переменные
в частности, образ SREG в контексте задачи.
Если бы в образе SREG была поднята 1-ка, то не нужно было бы уповать на поднятие I командой reti, всё отрабатывало бы по восстановлению SREG.

Абсолютно верно!
Все важные переменные инициализируются, просто нафига инициализировать то, что не нужно инициализировать?
Подготовить образы SREG с поднятым I для всех задач конечно можно, но тогда первая задача в списке (это именно та задача, в нити которой происходит первичная инициализация процессора) будет с разрешёнными прерываниями, а прерывания можно разрешить только после полной инициализации. Да и не было такой проблемы в меге. В х-меге вылезло-решилось. Поэтому здесь и описал ситуацию, чтобы другие уже не наступали на г...

Кстати, для скептиков, которые считают стрёмным дёргать I, модифицировать стек-поинтер, и т.п. Вы даже не представляете какие софтовые извраты прохавывает процессор. Архитектура AVR очень удобна для работы в системе многозадачки. Оч. не хватает команды групповой записи регистров в память sad.gif , но в авр32 это уже реализовано, там вабще можно миниWindows на асме сляпать sm.gif

хотя идея с поднятым I в образах SREG здоровая, сначала думал так сделать, но решил, что для большей стабильности кода лучше комбинация SEI-RETI

Цитата(demiurg_spb @ Sep 20 2011, 12:52) *
Абсолютно голословно. Чем это чревато? Поясните на примере обычной меги для конкретики.
Я абсолютно точно знаю что и когда дёргаю, если дёргаю, а главное знаю зачем это нужно...
Вы знакомы с концепциями SST (super simple threading)? Вижу что нет. Почитайте, узнаете много нового.


5 баллов!

Сообщение отредактировал element - Sep 20 2011, 09:57
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Sep 20 2011, 10:37
Сообщение #23


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

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



1. SREG не сохраняется автоматически при запросе прерывания
2. в прерывании бит I не сбрасывается
3. в прерывании нельзя сбросить бит I
Т.О при выходе из прерывания командой RETI бит I не может быть сброшен, если вы сохраняли/восстанавливали SREG, то скорее всего ошибка в его сохранении/восстановлении.
И вообще команда SEI в прерывании ничего вам не даст на Atxmega.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 20 2011, 10:45
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Navovvol @ Sep 20 2011, 14:37) *
3. в прерывании нельзя сбросить бит I
.....И вообще команда SEI в прерывании ничего вам не даст на Atxmega.

Это - Вы нашли такие отклонения реального "железа" от документации производителя? Или это - Ваши домыслы?
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Sep 20 2011, 11:03
Сообщение #25


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

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



Цитата(Палыч @ Sep 20 2011, 14:45) *
Это - Вы нашли такие отклонения реального "железа" от документации производителя? Или это - Ваши домыслы?

я не правильно выразился.

в общем вот что я имел ввиду:
"Interrupts must be globally enabled for any interrupts to be generated. This is done by setting
the global interrupt enable bit (I-bit) in the CPU Status Register. The I-bit will not be cleared
when an interrupt is acknowledged
. Each interrupt level must also be enabled before interrupts
with the corresponding level can be generated."

doc8210, 95 стр.

т.е. нельзя потерять I, если прерывание "подтверждено"
Go to the top of the page
 
+Quote Post
element
сообщение Sep 20 2011, 11:06
Сообщение #26





Группа: Новичок
Сообщений: 8
Регистрация: 23-01-09
Пользователь №: 43 859



Цитата(Navovvol @ Sep 20 2011, 14:37) *
1. SREG не сохраняется автоматически при запросе прерывания
2. в прерывании бит I не сбрасывается
3. в прерывании нельзя сбросить бит I
Т.О при выходе из прерывания командой RETI бит I не может быть сброшен, если вы сохраняли/восстанавливали SREG, то скорее всего ошибка в его сохранении/восстановлении.
И вообще команда SEI в прерывании ничего вам не даст на Atxmega.


1. Какие откровения...
2. CLI никто не отменял. да и in R16,CPU_SREG; cbr R16,1<<IFLAG ;out CPU_SREG,R16 с успехом работает.
3. смотри п. 2
Читаете внимательно? Ошибок нет. Всё работает. Ситуацию хорошо обрисовал ReAl (см. Сообщение #21)
И вообще, простите, вы совершенно не представляете, о чём говорите.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Sep 20 2011, 11:25
Сообщение #27


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Может быть проще объяснить ситуацию.

В MEGA-x для многозадачного уровня , что бы не пропустить важное прерывание - в текущем прерывании нужно было добавлять команду SEI (т.к. флаг при входе сбрасывался) - вложенные прерывания
В XMEGA-x сделали приоритет прерываний , который Вы и задаёте до первой команды SEI. В связи с этим при входе в прерывания флаг I не сбрасывается , но Вы можете сделать это CLI или ( не пробывал может кто и знает) - отключить уровни прерываний , которые не имеют право прервать выполняемое прерывание ( повторюсь - надо уточнить).


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 20 2011, 11:37
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ILYAUL @ Sep 20 2011, 14:25) *
но Вы можете сделать это CLI или ( не пробывал может кто и знает) - отключить уровни прерываний , которые не имеют право прервать выполняемое прерывание ( повторюсь - надо уточнить).


И сброс бита I, и запрет уровня ненужного прерывания работают...
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Sep 20 2011, 11:38
Сообщение #29


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

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



Цитата(ILYAUL @ Sep 20 2011, 15:25) *
Может быть проще объяснить ситуацию.

В MEGA-x для многозадачного уровня , что бы не пропустить важное прерывание - в текущем прерывании нужно было добавлять команду SEI (т.к. флаг при входе сбрасывался) - вложенные прерывания
В XMEGA-x сделали приоритет прерываний , который Вы и задаёте до первой команды SEI. В связи с этим при входе в прерывания флаг I не сбрасывается , но Вы можете сделать это CLI или ( не пробывал может кто и знает) - отключить уровни прерываний , которые не имеют право прервать выполняемое прерывание ( повторюсь - надо уточнить).

Вот это уже похоже на правду, а то пишут тут, что выход из прерывания теперь связка из SEI и RETI (которая магическим образом отменяет какие то "важные" переменные)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 20 2011, 13:30
Сообщение #30


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(element @ Sep 20 2011, 12:52) *
хотя идея с поднятым I в образах SREG здоровая, сначала думал так сделать, но решил, что для большей стабильности кода лучше комбинация SEI-RETI
А получили меньшую переносимость без реального повышения стабильности по сравнению с нормальным путём.
Если первой задаче нужно стартовать с запрещёнными прерываниями, то пропишите это явно, либо статически при инициализации этой задачи, либо во время выполнения в чём-то типа os_start(), чтобы она модифицировала образ стека первой задачи (в зависимости от построения оси, как оно будет проще/лучше)
И всё будет «честно», всё будет работать без необходимости подсовывать костыль SEI.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th June 2025 - 06:19
Рейтинг@Mail.ru


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