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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Приоритет и вложенность прерываний, матчасть
maug
сообщение Jun 6 2007, 10:47
Сообщение #16


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 12-04-07
Пользователь №: 26 989



Цитата(GetSmart @ Jun 6 2007, 17:33) *
2. Вообще непонятно, какой такой исключительной ситуации?

Эта фраза из документации на SAM7 с gaw.ru пункт 12.2.3 (Режимы работы ARM7TDMI) и

12.2.4.3 Типы исключительных ситуаций
Ядро поддерживает пять типов исключительных ситуаций, работающих в привилегированном режиме. Ниже приведен их список:
1 быстрое прерывание (FIQ)
2 обычное прерывание (IRQ)
3 аварийная ситуация при работе с памятью (используется для реализации защищенного режима работы памяти или виртуальной памяти)
4 сбой при выполнении команды или выполнение несуществующей команды
5 программные прерывания (SWI)

Я имел ввиду именно это.
Go to the top of the page
 
+Quote Post
Calculator
сообщение Jun 6 2007, 10:53
Сообщение #17


Участник
*

Группа: Свой
Сообщений: 45
Регистрация: 19-04-07
Пользователь №: 27 172



Цитата(GetSmart @ Jun 6 2007, 11:37) *
Код
ldr R14, =AT91C_BASE_AIC;Отметить окончание прерывания в
str R14, [R14, #AIC_EOICR]
Тут скорее всего косяк. Сбрасывать признак прерывания нужно в самом конце прерывания, а не сразу на входе. И общие прерывания уже должны быть запрещены.

Здесь нет косяка smile.gif
Общие прерывания запрещены строчкой выше (вот этой)
Код
msr     CPSR_c, #I_BIT | ARM_MODE_IRQ;Запретить прерывания и переключиться назад в IRQ mode

Запись в AT91C_BASE_AIC разрешает контроллеру прерываний SAM7 выставить новый запрос прерывания ядру. Ядро запустит обработчик только после выполнения последней команды обработчика, которая сделает возврат и переключит режим ядра из IRQ в USER/SUPERVISOR.
Этот обработчик нормально работает в нескольких проектах с активным использованием прерываний
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 6 2007, 11:14
Сообщение #18


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Calculator @ Jun 6 2007, 16:53) *
Здесь нет косяка smile.gif
Общие прерывания запрещены строчкой выше (вот этой)
Код
msr     CPSR_c, #I_BIT | ARM_MODE_IRQ;Запретить прерывания и переключиться назад в IRQ mode

Запись в AT91C_BASE_AIC разрешает контроллеру прерываний SAM7 выставить новый запрос прерывания ядру. Ядро запустит обработчик только после выполнения последней команды обработчика, которая сделает возврат и переключит режим ядра из IRQ в USER/SUPERVISOR.
Этот обработчик нормально работает в нескольких проектах с активным использованием прерываний

Запись -----//----- разрешает контроллеру прерываний реагировать (сразу исполнять, если разрешены общие прерывания) на прерывания с более низким приоритетом чем текущий. В прерываниях, в которых разрешены вложенные прерывания эту команду ставят в самом конце прерывания перед самым выходом, по вполне очевидным причинам.

Запоминает же контроллер все прерывания, вне зависимости от их приоритета и записи в AT91C_BASE_AIC, что бы потом, после выхода из текущего прерывания (или даже внутри него) обработать все запомненные прерывания в порядке приоритета и пожеланий программиста.

Цитата(maug @ Jun 6 2007, 16:47) *
Эта фраза из документации на SAM7 с gaw.ru пункт 12.2.3 (Режимы работы ARM7TDMI) и

12.2.4.3 Типы исключительных ситуаций
Ядро поддерживает пять типов исключительных ситуаций, работающих в привилегированном режиме. Ниже приведен их список:
1 быстрое прерывание (FIQ)
2 обычное прерывание (IRQ)
3 аварийная ситуация при работе с памятью (используется для реализации защищенного режима работы памяти или виртуальной памяти)
4 сбой при выполнении команды или выполнение несуществующей команды
5 программные прерывания (SWI)

Я имел ввиду именно это.

При возникновении исключительной ситуации используется персональный стек этого исключения.

Прочитайте что ли файлик arm7tdmi.pdf
А то придётся всё содержимое этого файла вам разжёвывать.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Calculator
сообщение Jun 8 2007, 06:22
Сообщение #19


Участник
*

Группа: Свой
Сообщений: 45
Регистрация: 19-04-07
Пользователь №: 27 172



Цитата(GetSmart @ Jun 6 2007, 17:14) *
Запись -----//----- разрешает контроллеру прерываний реагировать (сразу исполнять, если разрешены общие прерывания) на прерывания с более низким приоритетом чем текущий. В прерываниях, в которых разрешены вложенные прерывания эту команду ставят в самом конце прерывания перед самым выходом, по вполне очевидным причинам.

Могу повторить только то, что уже писал. Запись -----//----- действительно разрешает контроллеру прерываний реагировать, но не исполнять, т.к. сброшен флаг разрешения прерываний IRQ в регистре статуса. Последняя команда обработчика прерывания переключает режим ядра, делает возврат в фоновую програму и разрешает прерывания IRQ. Если они есть, то самое приоритетное из них будет выполнено после выполнения одной инструкции из фоновой программы

Цитата(maug @ Jun 5 2007, 17:45)
Этот код видел вот только из за особенности ICCARM асемблера не могу прикрутить аналогичную. не понимает команды работы
ldr R14, =AT91C_BASE_AIC ;Считать вектор в R0
ldr R0 , [R14, #AIC_IVR]
ldr R14, =AT91C_BASE_AIC ;Отметить окончание прерывания в
str R14, [R14, #AIC_EOICR]

Может у кого нибудь есть опыт работы ICC?

На сколько я понял с таким обработчиком, все команды (функции) тела прерывания будут использовать не IRQ стек, а общий стек лимитированный лишь размером памяти?

Опыта работы с ICC у меня нет, но нужно просто разобраться, почему не понимаются эти команды. Может быть у ассемблера немного отличается синтаксис, может быть нет define на AT91C_BASE_AIC, может быть define есть, но равен не тому же, чему в IAR. На всякий случай вот эти define:
Код
AT91C_BASE_AIC  EQU       0xFFFFF000 ;Базовый адрес контроллера прерываний
AIC_IVR         EQU       0x100;Регистр вектора IRQ (смещение)
AIC_FVR         EQU       0x104;Регистр вектора FIQ
AIC_EOICR     EQU       0x130;Регистр "Окончание прерывания"

Стек режима IRQ использоваться будет, но мало и его максимальная длина фиксирована. Для максимум 8 вложенных прерываний (а больше не разрешит контроллер прерываний) длина стека IRQ должна быть 3*4*8 байт (3 двойных слова на 8 уровней приоритетов). Если используется всего пара приоритетов, то соответственно 3*4*2

Сообщение отредактировал Calculator - Jun 8 2007, 06:27
Go to the top of the page
 
+Quote Post
telerobot
сообщение Apr 10 2010, 18:49
Сообщение #20





Группа: Новичок
Сообщений: 1
Регистрация: 10-04-10
Пользователь №: 56 553



Здравствуйте.
У меня вопрос. Я работаю с AT91SAM7X. Проиннициализировал таймер и юарт. Через регистр AIC_SMR задал юарту максимальный приоритет а таймеру минимальный.
Обработчики обьявляю так: __irq __arm <название>
Я все это сделал но вложенные прерывания не срабатывают. При попадании в обработчик таймера и наступлении прерывания от юарта, в обработчик юарта я попадаю только после завершения обработчика таймера.
У меня вопрос, что нужно сделать, что бы заработали вложенные прерывания?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 10 2010, 23:47
Сообщение #21


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Посмотреть свежий топик http://electronix.ru/forum/index.php?showtopic=74904&hl=.

Про прерывания в ARM уж на форуме все разжевали и в рот положили. Ан нет, туда же. Что поискать в тягость?
Go to the top of the page
 
+Quote Post
malysh_nrg
сообщение Apr 12 2010, 11:36
Сообщение #22





Группа: Участник
Сообщений: 8
Регистрация: 19-06-07
Пользователь №: 28 558



Цитата(telerobot @ Apr 10 2010, 23:04) *
что нужно сделать, что бы заработали вложенные прерывания?


Бесспорно, их нужно разрешить. Разрешить на уровне ядра и на уровне периферии. Внимательно изучите ассемблеровский код в СтартАпе в части настройки режимов и в части обработки прерывания. В моём примере стартАп-а (ссылка в посте выше), на первый и беглый взгляд, в прерывания IRQ (где у меня запрещены прерывания, метка IRQ_Handler_Entry: ) перед самым скачком в п/п-обработчик периферии ядро переключается в основной режим SYS, где (!была моя проблема) уже разрешены прерывания.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 12 2010, 15:20
Сообщение #23


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(telerobot @ Apr 10 2010, 23:04) *
Обработчики обьявляю так: __irq __arm <название>


Аттрибуты функции __irq __arm предназначены для невложенных прерываний.
Go to the top of the page
 
+Quote Post

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

 


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


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