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

 
 
> Проблема с прерываниями в 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
Ответов
Navovvol
сообщение Sep 20 2011, 08:46
Сообщение #2


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

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



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


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

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





Группа: Новичок
Сообщений: 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
ReAl
сообщение Sep 20 2011, 13:30
Сообщение #5


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

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

Сообщений в этой теме
- 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
- - element   Добрый день. Аналогичная проблема возникла при ада...   Sep 18 2011, 16:50
|- - 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
|- - demiurg_spb   Цитата(element @ Sep 18 2011, 20:50) В об...   Sep 19 2011, 04:38
|- - V_G   Цитата(demiurg_spb @ Sep 19 2011, 15:38) ...   Sep 20 2011, 07:17
|- - 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
|- - demiurg_spb   Цитата(V_G @ Sep 20 2011, 11:17) Ни в meg...   Sep 20 2011, 08:52
- - 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   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 Текстовая версия Сейчас: 12th August 2025 - 21:57
Рейтинг@Mail.ru


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