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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> IRQ+FIQ, возможность "одновременного" существования IRQ и FIQ
E_V_S
сообщение Oct 3 2012, 10:43
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 23-07-12
Пользователь №: 72 873



Доброго всем дня.

Поясните пожалуйста, возможно ли что прерывание FIQ возникнет во время обработки IRQ (или наоборот)?
Для каждого прерывания свой режим, и биты в статусных режимах так стоят, что во время IRQ режима - FIQ разрешен, и наоборот, во время FIQ - IRQ разрешен.

Также заметил что SWI только IRQ запрещает... FIQ опять возможен?
Go to the top of the page
 
+Quote Post
kovigor
сообщение Oct 3 2012, 11:29
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(E_V_S @ Oct 3 2012, 13:43) *
Поясните пожалуйста, возможно ли что прерывание FIQ возникнет во время обработки IRQ (или наоборот)?

Почему нет ? Книжку артина Тревора почитайте:
http://lord-n.narod.ru/walla.html
Go to the top of the page
 
+Quote Post
E_V_S
сообщение Oct 3 2012, 11:37
Сообщение #3





Группа: Участник
Сообщений: 12
Регистрация: 23-07-12
Пользователь №: 72 873



Цитата(kovigor @ Oct 3 2012, 14:29) *
Почему нет ? Книжку артина Тревора почитайте:
http://lord-n.narod.ru/walla.html


Да, да, да, именно эта книжка меня к таким вопросам и подвела. sm.gif Прямого ответа на мой вопрос там нет, а косвенного не могу найти sad.gif
Go to the top of the page
 
+Quote Post
chernenko
сообщение Oct 3 2012, 11:46
Сообщение #4


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

Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116



В этой части ARM7TDMI и ARM926EJ одинаковы?
Go to the top of the page
 
+Quote Post
SII
сообщение Oct 3 2012, 15:44
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



В мануалах всё чётко прописано. FIQ запрещается автоматически только самим же FIQ, а значит, может произойти при выполнении любого другого обработчика (если программист, конечно, ручками FIQ не запретил).
Go to the top of the page
 
+Quote Post
theBMV
сообщение Oct 5 2012, 08:17
Сообщение #6


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

Группа: Свой
Сообщений: 131
Регистрация: 14-10-08
Из: г. Королев
Пользователь №: 40 940



На то он и FIQ wink.gif
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Oct 5 2012, 16:53
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



Цитата(SII @ Oct 3 2012, 19:44) *
В мануалах всё чётко прописано. FIQ запрещается автоматически только самим же FIQ, а значит, может произойти при выполнении любого другого обработчика (если программист, конечно, ручками FIQ не запретил).


смотрите файл-скрипт запуска на асме там для каждого режима выставляется флаг I и F у вас какой контроллер?


--------------------
Go to the top of the page
 
+Quote Post
E_V_S
сообщение Oct 8 2012, 08:09
Сообщение #8





Группа: Участник
Сообщений: 12
Регистрация: 23-07-12
Пользователь №: 72 873



Цитата(SyncLair @ Oct 5 2012, 19:53) *
смотрите файл-скрипт запуска на асме там для каждого режима выставляется флаг I и F у вас какой контроллер?


контроллер - ARM926EJ

под отладчиком можно видеть что IRQ и SWI ставят 1 в бит I (т.е. зпрещают IRQ) и если FIQ разрешены, то их бит F=0, а стало быть FIQ может быть...

Наверное биты I и F и дают ответ на мой вопрос. Ежели я внутри IRQ обнулю I, то вложенные прерывания тут как тут sm.gif

Сейчас в IRQ я ручками запрещаю FIQ на время обработчика IRQ (после разрешаю)... Пришлось сделать так, что только одно прерывание существует единовремменно, покуда имеется разделяемый ресурс который используется в основной программе, а также в IRQ и FIQ...


Go to the top of the page
 
+Quote Post
SyncLair
сообщение Oct 8 2012, 11:49
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



Цитата(E_V_S @ Oct 8 2012, 12:09) *
контроллер - ARM926EJ

Наверное биты I и F и дают ответ на мой вопрос. Ежели я внутри IRQ обнулю I, то вложенные прерывания тут как тут sm.gif


Для каждого режима свой CPSR регистр. При запуске туда заносят состояние флагов I и F
перепишите скрипт запуска установите нужные значения и будет вам счастье.


--------------------
Go to the top of the page
 
+Quote Post
E_V_S
сообщение Oct 8 2012, 13:26
Сообщение #10





Группа: Участник
Сообщений: 12
Регистрация: 23-07-12
Пользователь №: 72 873



Цитата(SyncLair @ Oct 8 2012, 14:49) *
Для каждого режима свой CPSR регистр. При запуске туда заносят состояние флагов I и F
перепишите скрипт запуска установите нужные значения и будет вам счастье.


Для каждого режима вроде свой SPSR, куда копируется CPSR... или это только в ARM7?
Go to the top of the page
 
+Quote Post
SII
сообщение Oct 8 2012, 14:36
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Не путайте архитектуру и ядро. ARM7 -- это семейство ядер, так же как и ARM9, ARM11, Cortex-A и т.д. А поведение процессора определяется спецификацией на архитектуру, а не на ядро (можно сказать, что архитектура -- это что должно делаться процессором, а ядро -- это как оно делается в конкретной реализации процессора).

Все версии архитектуры ARM, кроме M-профиля (ARMv6-M и ARMv7-M, ядра серии Cortex-M) ведут себя в общем и целом одинаково, просто каждая последующая версия архитектуры добавляет новые вещи. Ядро ARM7TDMI -- это версия ARMv4T, ARM926 -- это ARMv5TEJ (но ARM920T -- это ARMv4T, так что по цифрам в номере ядра судить об архитектуре нельзя). Все они обрабатывают прерывания абсолютно одинаково. Более того, даже суперсовременные процессоры с ядрами Cortex-A обрабатывают прерывания тем же самым способом, хотя там довольно много разных дополнений и расширений.

Сообщение отредактировал SII - Oct 8 2012, 14:36
Go to the top of the page
 
+Quote Post
MBR
сообщение Oct 10 2012, 05:23
Сообщение #12


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

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



Цитата(E_V_S @ Oct 8 2012, 12:09) *
Наверное биты I и F и дают ответ на мой вопрос. Ежели я внутри IRQ обнулю I, то вложенные прерывания тут как тут sm.gif

Собственно я в своей операционке mkernel так и реализовал вложенные прерывания на ARM7. Только нужно не забывать предварительно сохранять r0-r3, r12, lr, spsr. Иначе мы никогда не вернемся в точку возвращения. По ссылке ниже - полные исходники на реализацию вложенных прерываний и FIQ.

https://github.com/alexeyk13/mkernel/tree/master/arch/arm7
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 11 2012, 02:21
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(E_V_S @ Oct 8 2012, 14:09) *
контроллер - ARM926EJ
Сейчас в IRQ я ручками запрещаю FIQ на время обработчика IRQ (после разрешаю)... Пришлось сделать так, что только одно прерывание существует единовремменно, покуда имеется разделяемый ресурс который используется в основной программе, а также в IRQ и FIQ...

Получается что FIQ вам не нужен. Зачем тогда его используете? Сделайте все прерывания через IRQ.
И обнулять в обработчике ничего не нужно. Почитайте мануал на ядро про режимы процессора. Найдите где у вас в начале программы выставляются дефолтные значения для флагов CPSR для режимов FIQ и IRQ и выставьте их там.
Go to the top of the page
 
+Quote Post
SII
сообщение Oct 11 2012, 03:13
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Цитата(jcxz @ Oct 11 2012, 06:21) *
Получается что FIQ вам не нужен. Зачем тогда его используете? Сделайте все прерывания через IRQ


У себя я сначала тоже было сделал поддержку и FIQ, и IRQ, а потом понял, что на практике пользы от FIQ никакой, а лишний код и всё прочее требует. Поэтому и отказался от него. Ну а поскольку сам по себе из воздуха он не возникает, то и заботиться о его запрещении не требуется: можно считать, что его просто нет. (Правда, не исключаю, что в природе существуют микроконтроллеры, где на него что-нибудь завязано, но пока не встречался).
Go to the top of the page
 
+Quote Post
MBR
сообщение Oct 11 2012, 05:22
Сообщение #15


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

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



Цитата(SII @ Oct 11 2012, 07:13) *
У себя я сначала тоже было сделал поддержку и FIQ, и IRQ, а потом понял, что на практике пользы от FIQ никакой, а лишний код и всё прочее требует.

Не совсем так. Основной смысл FIQ - это быстрый вызов прерываний. Так как никаких pending битов в ARM7 нет, а на обработку nested interrupts нужно время, можно не уложиться во временные пределы. Плюсом у FIQ свой банк верхних регистров, поэтому не нужно сохранять контекст, а можно сразу приступать к обработке. Другое использование - если nested interrupts не реализованы (а кодить тут, если с приоритетами, сильно больше, чем просто подключить FIQ), чтобы не дожидаться завершения прерывания, можно использовать FIQ.
Go to the top of the page
 
+Quote Post

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

 


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


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