Цитата(SasaVitebsk)
Каждое N-ое прерывание fiq надо вызвать софтовое прерывание (N=56). При этом прерывание софтовое выполняется достаточно долго (3-30 прерываний fiq) и необходимо чтобы прерывания fiq и irq были бы разрешены.
Я почти в каждом проекте делаю что-то очень похожее. Делается легко и непринуждённо. _swi не надо трогать, там немного по-другому делается. FIQ и IRQ выполняются в штатном режиме без особых извращений по запрету прерываний. Вобщем софтовое прерывание объявляется через _arm _irq _nested. Ему даётся самый или почти самый низкий приоритет - это как надо в проге. Разумеется в нём в начале разрешаются все проерывания (и FIQ) через __enable_interrupt, а перед концом запрещаются. После запрета сбрасывается бит данного прерывания в регистре VICSoftIntClear. А в FIQ прерывании после достижения N=56 устанавливается тот же бит прерывания в регистре VICSoftInt. Таким образом, когда FIQ закончится и не будет прерываний более приоритетных чем выбранный приоритет софтового прерывания, то выполнение перейдёт на это прерывание, а когда оно отработает, то выполнение вернётся в основную прогу например. Все прерывания с приоритетами выше софтового будут его прерывать и оперативно отрабатываться, а в софтовом при этом можно сидеть очень долго и не бояться, т.к. оно затормаживает только основную прогу. Вобщем очень удобная штука. При этом, основной проге не нужно знать об всех этих заморочках и анализировать фсякие флаги. В последней своей проге у меня даже два разных таких софтовых прерывания. Всё работает без глюков.
В качестве вектора в битовой карте регистров VICSoftInt и им подобным для такого обработчика есть вектор VIC_SW (имена находятся в файле iolpc2xxx.h), но можно использовать вектор и любой другой незадействованной в проекте периферии, например VIC_WDT, VIC_DEBUGRX, VIC_DEBUGTX и другие, и даже свободные биты до 31-ого включительно.