|
Проблема с прерываниями в Xmega |
|
|
|
Jun 14 2010, 19:40
|
Группа: Участник
Сообщений: 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 блокирует возникновение этого перывания в дальнейшем. Возможно ли обойти данную проблему?
|
|
|
|
|
 |
Ответов
|
Sep 18 2011, 16:50
|
Группа: Новичок
Сообщений: 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
|
|
|
|
|
Sep 20 2011, 07:17
|

Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Sep 20 2011, 08:52
|

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

|
Цитата(V_G @ Sep 20 2011, 11:17)  Ни в mege, ни в xmege не стоит лишний раз дергать флаг I, тем более в прерываниях. Абсолютно голословно. Чем это чревато? Поясните на примере обычной меги для конкретики. Я абсолютно точно знаю что и когда дёргаю, если дёргаю, а главное знаю зачем это нужно... Вы знакомы с концепциями SST (super simple threading)? Вижу что нет. Почитайте, узнаете много нового.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|