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

 
 
> Проблема с прерываниями в Xmega
Kantik
сообщение Jun 14 2010, 19:40
Сообщение #1





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



Добрый день уважаемые форумчане.
В данный момент активно активно разбираюсь с ATXmega 128A1.
Суть проблемы. По ходу выполнения программы возникает прерывание по переполнению счетчика TCC1, соответ. переход в подпрограмму обработки этого прерывания, подпрограмма выполняется, а вот выход должен быть нештатным, т.е. не по команде reti, а переход по команде rjmp.
Ранее, при работе с обычными мегами, вначале выполнения программы сохранял во временном рег. адрес указателя стека, разрешал прерывание по переполению, глобал. прерывания и т.д. Перед завершением подпрограммы обработки прерывания очишал флаг прерывания по переполнению счетчика, восстанавливал бит I в SREG и затем восстанавливал адрес указателя стека в рег. SPH/SPL и выполнял команду rjmp.
Теперь о проблеме с XMega. Кроме разрешения прерывания по переполнеию выставляется так же уровень в регистре TCC1_INTCTRLA (например высокий), разрешение прерывание высокого уровня в регистре PMIC_CTRL, разрешаются глобальные прерывания в SREG. при возникновении прерывания возникает флаг в регистре PMIC_STATUS. Судя по описанию биты в данном регистре очишаются только при выполнении команды reti. Не очишенный флаг в регистре PMIC_STATUS блокирует возникновение этого перывания в дальнейшем. Возможно ли обойти данную проблему?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
element
сообщение Sep 18 2011, 16:50
Сообщение #2





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



Добрый день.
Аналогичная проблема возникла при адаптации многозадачной ОС для XMega. На обычных мегах операционка живёт уже десяток лет, но при запуске на XMeg-е отказалась работать.
Работа системы в следующем: по прерываю таймера обработчик переключает задачи - сохраняет/восстанавливает регистры, стек, точки возврата и (ЭТО ВАЖНО!) регистр флагов SREG. При инициализации системы ячейки контекста задач, хранящие SREG неопределённые (как правило нулевые после сброса) - и это в принципе не важно, т.к. в процессе работы задачи флаги меняются - потом сохраняются и т.д. Выход из диспетчера задач (обработчика прерывания таймера) всегда завершается командой RETI, - т.е. I-бит в SREG поднимается - прерывания разрешаются.
Что получилось в XMeg-е: При выходе из прерывания RETI не поднимал I-бит, прерывания оказались выключенными, ОС зависала на одной задаче.
При детальном изучении поведения I бита и команды RETI выяснилось:
код, не являющийся обработчиком прерывания
CLI
RETI
поднимает бит I
код
RETI
в обработчике прерывания НИКАК не влияет на I-бит.
В общем, проблема решилась просто: добавил команду SEI перед RETI.
Вывод: поведение RETI зависит от текущего состояния PMIC. Никакого волшебства.
Однако, в атмел можно кинуть камень, за НЕОПИСАНИЕ такого поведения команды RETI в своих даташитах.


Сообщение отредактировал element - Sep 18 2011, 16:51
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 19 2011, 04:38
Сообщение #3


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

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



Цитата(element @ Sep 18 2011, 20:50) *
В общем, проблема решилась просто: добавил команду SEI перед RETI.
Не в ассемблерной вставке на обычной меге это бы кончилось плачевно. Т.к. производить раскрутку стека (модифицировать SPL+SPH) надо атомарно.
На Xmega это решено видимо как-то иначе?


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


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(demiurg_spb @ Sep 19 2011, 15:38) *
Цитата
В общем, проблема решилась просто: добавил команду SEI перед RETI.


Не в ассемблерной вставке на обычной меге это бы кончилось плачевно. Т.к. производить раскрутку стека (модифицировать SPL+SPH) надо атомарно.
На Xmega это решено видимо как-то иначе?

Написали же, xmegа в прерываниях не сбрасывает флаг I, и рецепт "добавил команду SEI перед RETI" не есть правильный. Случайно заработало, в следующий раз при аналогичной проблеме не заработает. Ни в mege, ни в xmege не стоит лишний раз дергать флаг I, тем более в прерываниях.
У xmegи вообще трехуровневая система прерываний, и надо очень грамотно расставлять их изначальные приоритеты, не дергая I.


Цитата(Navovvol @ Sep 20 2011, 17:27) *
Это теперь для каждого прерывания добавлять смещение к адресу модуля ? Мда... это ппц самому всё прописывать, а если учитывать объем, то допустить ошибку в расчетах адреса проще простого.

Что Вы имеете в виду? Адреса прерываний по-прежнему фиксированы, никаких проблем в ассемблере не встретил.
Откройте из Студии (у меня 4 версия) файл ATxmega32A4def.inc (или другой под нужный проц), и в разделе "INTERRUPT VECTORS, ABSOLUTE ADDRESSES" увидите их все.
Можно, конечно, добавлять смещение к базовому адресу модуля (в том же файле ниже), но я для себя пока такой необходимости не увидел

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


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

Группа: Свой
Сообщений: 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

Сообщений в этой теме
- Kantik   Проблема с прерываниями в Xmega   Jun 14 2010, 19:40
- - demiurg_spb   Цитата(Kantik @ Jun 14 2010, 23:40) возни...   Jun 14 2010, 19:55
|- - Kantik   Цитата(demiurg_spb @ Jun 14 2010, 23:55) ...   Jun 14 2010, 20:09
- - Duhas   а выставить в прерывании флаг, а потом его обработ...   Jun 14 2010, 20:30
|- - V_G   Только что решил аналогичную проблему. Без reti не...   Jun 15 2010, 07:03
|- - zombi   Цитата(element @ Sep 18 2011, 19:50) выяс...   Sep 18 2011, 20:48
||- - _Артём_   Цитата(zombi @ Sep 18 2011, 23:48) ... Т....   Sep 19 2011, 01:53
||- - element   Цитата(zombi @ Sep 19 2011, 00:48) ... Т....   Sep 20 2011, 08:43
|- - Navovvol   Цитата(V_G @ Sep 20 2011, 11:17) Что Вы и...   Sep 20 2011, 07:55
||- - ILYAUL   QUOTE (Navovvol @ Sep 20 2011, 11:55) Пох...   Sep 20 2011, 08:11
||- - Navovvol   Цитата(ILYAUL @ Sep 20 2011, 12:11) Вы зн...   Sep 20 2011, 08:19
|- - demiurg_spb   Цитата(V_G @ Sep 20 2011, 11:17) Написали...   Sep 20 2011, 08:44
- - Navovvol   Вы где нашли таблицу векторов прерываний? всё изла...   Sep 20 2011, 05:34
|- - Палыч   Цитата(Navovvol @ Sep 20 2011, 09:34) Вы ...   Sep 20 2011, 05:53
|- - Navovvol   Цитата(Navovvol @ Sep 20 2011, 09:34) Вы ...   Sep 20 2011, 06:27
- - Navovvol   element, если прерывание не сбрасывает I бит, тогд...   Sep 20 2011, 08:46
|- - ReAl   Цитата(Navovvol @ Sep 20 2011, 11:46) ele...   Sep 20 2011, 09:26
|- - element   Цитата(ReAl @ Sep 20 2011, 13:26) Ну, нап...   Sep 20 2011, 09:52
|- - ReAl   Цитата(element @ Sep 20 2011, 12:52) хотя...   Sep 20 2011, 13:30
- - Navovvol   1. SREG не сохраняется автоматически при запросе п...   Sep 20 2011, 10:37
|- - Палыч   Цитата(Navovvol @ Sep 20 2011, 14:37) 3. ...   Sep 20 2011, 10:45
||- - Navovvol   Цитата(Палыч @ Sep 20 2011, 14:45) Это - ...   Sep 20 2011, 11:03
|- - element   Цитата(Navovvol @ Sep 20 2011, 14:37) 1. ...   Sep 20 2011, 11:06
- - ILYAUL   Может быть проще объяснить ситуацию. В MEGA-x для...   Sep 20 2011, 11:25
|- - _Артём_   Цитата(ILYAUL @ Sep 20 2011, 14:25) но Вы...   Sep 20 2011, 11:37
|- - Navovvol   Цитата(ILYAUL @ Sep 20 2011, 15:25) Может...   Sep 20 2011, 11:38
- - element   В общем, с учётом всех советов и личного опыта сис...   Sep 21 2011, 09:43


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

 


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


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