|
|
  |
Вложенные прерываня |
|
|
|
Jul 7 2006, 22:40
|
Местный
  
Группа: Свой
Сообщений: 421
Регистрация: 25-12-04
Пользователь №: 1 675

|
Цитата(DASM @ Jul 8 2006, 02:04)  А никак. Ну, не правда. Вложенные прерывания возможны. Чтоб приоритеты - надо будет маску прерываний ручками подправлять. В книге, которая про ARM LPC по-русски (забыл как называется, под рукой нет) это рассматривается (поищите по конфе). А заодно (почти в тему) - вот попадаю я в обработчик IRQ по умолчанию и хочу перевести бит-флаги в номер прерывания (чтоб по таблице функцию-обработчик найти), т.е. мне надо узнать позицию (номер бита) младщей единицы (в XScale инструкция CLZ есть, а в LPC?). Написал такое, но асм для ARM я почти не знаю, может кто подчкажет как оптимизировать? /* in: r3 - bit mask */ /* out: r1 - int num */ MOV r1,#0 findirqstart: AND r4, a3, #1 CMP r4, #0 BNE findirqend ADD r1, r1, #1 MOV r3, r3, lsr #1 B findirqstart findirqend:
|
|
|
|
|
Jul 8 2006, 09:23
|

Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 24-03-05
Из: Санкт-Петербург
Пользователь №: 3 661

|
Всем большое спасибо, а вот тот ответ, который я хотел услышать: ARM 7 аппаратно НЕ поддерживает вложенные прерывания, но обеспечить их можно софтварным путём, используя следующие асмовые макросы #define IENABLE /* Nested Interrupts Entry */ \ __asm { MRS LR, SPSR } /* Copy SPSR_irq to LR */ \ __asm { STMFD SP!, {LR} } /* Save SPSR_irq */ \ __asm { MSR CPSR_c, #0x1F } /* Enable IRQ (Sys Mode) */ \ __asm { STMFD SP!, {LR} } /* Save LR */ \
#define IDISABLE /* Nested Interrupts Exit */ \ __asm { LDMFD SP!, {LR} } /* Restore LR */ \ __asm { MSR CPSR_c, #0x92 } /* Disable IRQ (IRQ Mode) */ \ __asm { LDMFD SP!, {LR} } /* Restore SPSR_irq to LR */ \ __asm { MSR SPSR_cxsf, LR } /* Copy LR to SPSR_irq */ \
и втыкать их перед и после того кода обработчика прерывания более низким приоритетом, который мы хотим прерывать ещё раз всем спасибо
|
|
|
|
|
Jul 8 2006, 10:38
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(moonrock @ Jul 8 2006, 12:23)  ARM 7 аппаратно НЕ поддерживает вложенные прерывания Осталось выяснить КТО аппаратно подерживает сохранение контекстов для КАЖДОГО из возможных прерываний :-)). На самом деле достоинством является вообще наличие аппаратно переключаемого стека и собственных регистров FIQ и IRQ. Таким образом "софтовая" организация вложенных прерываний является абсолютно естественной а не каким-то "извращением" являющимся дурной особенностью ARM7. Цитата(yuri_t @ Jul 8 2006, 13:17)  IMHO,без крайней необходимости с nested interrupt в ARM7/9 лучше не связываться - весьма коварная штука. Не коварнее организации вложенных прерываний на любом другом процессоре, но проектировать систему со вложенными прерываниями действительно нужно только в случае крайней необходимости.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2006, 12:49
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ Jul 8 2006, 15:14)  У меня во многих прогах уровень вложенности может доходить до 5-8 Нашли, чем гордится :-((( Цитата и всё работает стабильнее некуда. Ну на принципиальную нестабильность механизма вложенности никто и не жаловался... Если у Вас простейшая системка, хоть и 8 прерываниями, но простейшая с мало или не зависящими от результатов работы друг друга обработчиками, то проблем не будет особых. Ну а если нужно будет разруливать все нюансы взаимодействия недозавершенных обработчиков с их прервавшими и т.д., то уже потенциальных ошибок много больше :-(. Разруливание опять таки в обработчиках, что есть дополнительный код и время. Цитата Да, и ещё. Прерывания без __nested работают на стеке IRQ|FIQ. А объявленные с __nested работают на стеке основной программы, и ещё в стеке IRQ|FIQ дополнительно занимают 3-4 слова. Ага, и это есть хреново, ибо когда у Вас единственная основная программка с единственным стеком, то оно и ладно, а если у меня их количество десятками исчисляется? Прикажете в стеке каждой заложить место для стеков многочисленных ее прервавших? Причем поскольку необходимость вложенности перерываний почти всегда следует из громоздкости обработчика, то и требования к размеру стека скорее всего будут заметными :-(. В общем случае нужно СИЛЬНО думать и все взвешивать перед тем как использовать вложенные прерывания.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2006, 13:06
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(GetSmart @ Jul 8 2006, 16:14)  Те же, кто не хочет использовать много асма, могут писать всё на Си... Я лишь предложил способ, пригодный для использования на любом компиляторе. Слово __nested ADS, например, не знает. Цитата(Andrew2000 @ Jul 8 2006, 17:00)  А на мой вопрос про завменитель CLZ кто-нить может ответить? Могли бы уже и сами посмотреть список команд для архитектуры V4. Нет там прямой замены. P.S. ztigo: за раскрытие темы подводных камней
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|