|
IRQ+FIQ, возможность "одновременного" существования IRQ и FIQ |
|
|
|
Oct 3 2012, 10:43
|
Группа: Участник
Сообщений: 12
Регистрация: 23-07-12
Пользователь №: 72 873

|
Доброго всем дня.
Поясните пожалуйста, возможно ли что прерывание FIQ возникнет во время обработки IRQ (или наоборот)? Для каждого прерывания свой режим, и биты в статусных режимах так стоят, что во время IRQ режима - FIQ разрешен, и наоборот, во время FIQ - IRQ разрешен.
Также заметил что SWI только IRQ запрещает... FIQ опять возможен?
|
|
|
|
|
Oct 3 2012, 11:37
|
Группа: Участник
Сообщений: 12
Регистрация: 23-07-12
Пользователь №: 72 873

|
Цитата(kovigor @ Oct 3 2012, 14:29)  Почему нет ? Книжку артина Тревора почитайте: http://lord-n.narod.ru/walla.htmlДа, да, да, именно эта книжка меня к таким вопросам и подвела.  Прямого ответа на мой вопрос там нет, а косвенного не могу найти
|
|
|
|
|
Oct 5 2012, 16:53
|
Местный
  
Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197

|
Цитата(SII @ Oct 3 2012, 19:44)  В мануалах всё чётко прописано. FIQ запрещается автоматически только самим же FIQ, а значит, может произойти при выполнении любого другого обработчика (если программист, конечно, ручками FIQ не запретил). смотрите файл-скрипт запуска на асме там для каждого режима выставляется флаг I и F у вас какой контроллер?
--------------------
|
|
|
|
|
Oct 8 2012, 08:09
|
Группа: Участник
Сообщений: 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, то вложенные прерывания тут как тут  Сейчас в IRQ я ручками запрещаю FIQ на время обработчика IRQ (после разрешаю)... Пришлось сделать так, что только одно прерывание существует единовремменно, покуда имеется разделяемый ресурс который используется в основной программе, а также в IRQ и FIQ...
|
|
|
|
|
Oct 8 2012, 11:49
|
Местный
  
Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197

|
Цитата(E_V_S @ Oct 8 2012, 12:09)  контроллер - ARM926EJ Наверное биты I и F и дают ответ на мой вопрос. Ежели я внутри IRQ обнулю I, то вложенные прерывания тут как тут  Для каждого режима свой CPSR регистр. При запуске туда заносят состояние флагов I и F перепишите скрипт запуска установите нужные значения и будет вам счастье.
--------------------
|
|
|
|
|
Oct 8 2012, 13:26
|
Группа: Участник
Сообщений: 12
Регистрация: 23-07-12
Пользователь №: 72 873

|
Цитата(SyncLair @ Oct 8 2012, 14:49)  Для каждого режима свой CPSR регистр. При запуске туда заносят состояние флагов I и F перепишите скрипт запуска установите нужные значения и будет вам счастье. Для каждого режима вроде свой SPSR, куда копируется CPSR... или это только в ARM7?
|
|
|
|
|
Oct 8 2012, 14:36
|
Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
Oct 10 2012, 05:23
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748

|
Цитата(E_V_S @ Oct 8 2012, 12:09)  Наверное биты I и F и дают ответ на мой вопрос. Ежели я внутри IRQ обнулю I, то вложенные прерывания тут как тут  Собственно я в своей операционке mkernel так и реализовал вложенные прерывания на ARM7. Только нужно не забывать предварительно сохранять r0-r3, r12, lr, spsr. Иначе мы никогда не вернемся в точку возвращения. По ссылке ниже - полные исходники на реализацию вложенных прерываний и FIQ. https://github.com/alexeyk13/mkernel/tree/master/arch/arm7
|
|
|
|
|
Oct 11 2012, 03:13
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414

|
Цитата(jcxz @ Oct 11 2012, 06:21)  Получается что FIQ вам не нужен. Зачем тогда его используете? Сделайте все прерывания через IRQ У себя я сначала тоже было сделал поддержку и FIQ, и IRQ, а потом понял, что на практике пользы от FIQ никакой, а лишний код и всё прочее требует. Поэтому и отказался от него. Ну а поскольку сам по себе из воздуха он не возникает, то и заботиться о его запрещении не требуется: можно считать, что его просто нет. (Правда, не исключаю, что в природе существуют микроконтроллеры, где на него что-нибудь завязано, но пока не встречался).
|
|
|
|
|
Oct 11 2012, 05:22
|
Частый гость
 
Группа: Участник
Сообщений: 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.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|