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

 
 
> Высшая степень вложенности Real/Soft FIQ/IRQ
GetSmart
сообщение Nov 13 2009, 07:14
Сообщение #1


.
******

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



Посвящается zltigo и прочим противникам вложенности прерываний smile.gif

Только что закончил прикручивать звук в и без того сложный проект под FreeRTOS на LPC2368. Звук - это воспроизведение WAV с MicroSD карточки. Работа с SD сделана на основе исходников ffsample.zip (elm-chan.org).

1. Вложенные FIQ
Звук (вывод в DAC) пришлось весить на FIQ для того, чтобы он не тормозился программой и осью. Но на FIQ уже висело АЦП и переносить его на IRQ было нельзя. Сначала поставил в начале обработчика проверку откуда источник FIQ и развилку на два обработчика. Всё вроде работало. Но при воспроизведении синуса 48000 Гц на осциллографе (да и в динамике) были искажения из-за того, что проц долго находился в FIQ от АЦП. Пришлось исхитряться и делать вложенные FIQ, работающие в режиме и на стеке Undefined Instruction. Работать в режиме FIQ и отрабатывать другие FIQ нельзя (по крайней мере в известных мне компиляторах), т.к. компиляторы используют регистр LR для своих целей. А обработчик FIQ для АЦП у меня имеет очень сложный алгоритм и переписывать его на асм желания не было. Только пролог и эпилог на асме. Вот если бы была опция (атрибут функции), которая запрещала использовать LR внутри функции, то это было бы реально. На асме (асм-обработчике) такое сделать вообще без проблем.

2. Вложенные Software IRQ
Звук в FIQе выводится из двух буферов по 256 байт. Пока один буфер выводится, второй должен успеть обновить данные из SD карточки. Для заполнения этого буфера было выбрано прерывание IRQ со средним приоритетом, вызываемое софтовым способом. То есть как только внутри FIQ произошёл вывод последнего сэмпла из буфера то сразу же записывается (не OR-ится!) бит в VICSoftInt. Далее уровень FIQов продолжает работать с максимальной латентностью не замечая что происходит на более низких уровнях (IRQ,System и прочие). Если на выходе из FIQ есть приоритетные IRQ, то они отрабатываются. Если их нет, то срабатывает софтовое IRQ для подгрузки данных. В начале софтового обработчика сбрасывается флаг софтового прерывания через VICSoftIntClear (не AND-ится!) и происходит переключение в режим и на стек Undefined. То есть я сделал так, что все вложенные прерывания (FIQ & IRQ) работают в режиме и на стеке Undefined Instruction, чтобы они не потребляли "без спросу" стек тредов. Вобщем внутри этого обработчика происходила подгрузка данных и установка флага готовности данных. Затем переключение обратно в IRQ, восстановление регистров, SPSR и окончательный выход в тред или на ещё менее приоритетное прерывание.

Тред при этом, отвечающий за воспроизведение WAV, почти ничего не делает, только запускает воспроизведение и ждёт окончания, вызывая delay(). Всё остальное происходит "автоматически". А софтовое IRQ обеспечивает максимальную латентность подгрузки новых данных.

LPC2368 @ 24MHz легко справляется с воспроизведением 56000 Гц звука в реальном времени из файла на MicroSD без каких-либо глюков. Глюки появляются на 64000. Но и это не предел, если доработать Ченовский исходник так, чтобы там не было лишнего копирования, то 64000 без проблем. Если ещё убрать конвертацию WAV данных при воспроизведении и копировать (через DMA) прямо в буфер, использующийся в FIQ, то и думаю 80000 реально достичь. И это при том, что модуль воспроизведения WAV использует только 1 КБ данных (буферА) в раме плюс стек Undef. Без вложенности таких параметров никогда не достичь. Если поллить флаг подгрузки данных из треда, то он отъест слишком много времени проца, будет иметь самый высокий приоритет и от силы будет поспевать подгружать данные для звука в 10000 Гц. А садить подгрузку данных в невложенное IRQ тоже не выход, т.к. прога там достаточно долго сидит, и множество других, более приоритетных прерываний "заткнутся" и работа девайса нарушится.

Программа в нормальном режиме почти постоянно переключается между пятью режимами ARM-ядра (System, Supervizor, IRQ, FIQ, Undefined) и прекрасно себя чувствует smile.gif

На картинке - воспроизведение синуса со вложенными FIQ, на нижней - с обычными FIQ. Вместе с FIQ от АЦП.


Пример пролога/эпилога Nested Software IRQ для CW 1.7
Код
static    void WavIntr_Wrapper() __attribute__((naked));
    void WavIntr();            // без static - для стандартной передачи параметров (меньшего сохранения регистров извне)

// софтверное прерывание (VICSoft...), работает в режиме и на стеке Undefined Instruction
static void WavIntr_Wrapper()
{
    asm(  "STMDB    SP!,{R12,LR}        \n\t"        // 8 байт на стеке IRQ, плюс xx байт на стеке Undefined
            "MVN      LR,#~0xFFFFFF00        \n\t"
            "MOV      R12,#" STRINGFY(1 << RES1_INT) "\n\t"
            "STR      R12,[LR,#0xFFFFF01C-0xFFFFFF00] \n\t"    // VICSoftIntClear = (1 << RES1_INT);
            "MRS      R12,SPSR        \n\t"
            "MSR      CPSR_c,#0x1b        \n\t"        // Undef_Mode + Enable IRQ + Enable FIQ
            "STMDB    SP!,{R0-R3,R12,LR}    \n\t");

    WavIntr();            // должна объявляться глобально, без static

    asm(  "LDMIA    SP!,{R0-R3,R12,LR}    \n\t"
            "MSR      CPSR_c,#0x92        \n\t"        // IRQ_Mode + Disable IRQ + Enable FIQ
            "MSR      SPSR_all,R12        \n\t"
            "MVN      LR,#~0xFFFFFF00        \n\t"
//          "MOV      R12,#" STRINGFY(1 << RES1_INT) "\n\t"
//          "STR      R12,[LR,#0xFFFFF01C-0xFFFFFF00] \n\t"    // VICSoftIntClear = (1 << RES1_INT);
            "STR      LR,[LR]            \n\t"        // VICAddress = xx; (сброс приоритетов IRQ)
            "LDMIA    SP!,{R12,LR}        \n\t"
            "SUBS     PC,LR,#4        \n\t");
}


Ещё родилась идея вместо Undef использовать и работать на Supervizor-е. Для этого надо бы внимательно изучить порт LPC2300 FreeRTOS.

Прошу высказываться. Критика приветствуется. Готов услышать про недостатки, хотя сам пока ни одного не нашёл smile.gif

Сообщение отредактировал GetSmart - Nov 13 2009, 07:32


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- GetSmart   Высшая степень вложенности Real/Soft FIQ/IRQ   Nov 13 2009, 07:14
- - _Pasha   Цитата(GetSmart @ Nov 13 2009, 10:14) Зву...   Nov 13 2009, 07:26
|- - GetSmart   Цитата(_Pasha @ Nov 13 2009, 13:26) Если ...   Nov 13 2009, 07:33
|- - VslavX   Цитата(GetSmart @ Nov 13 2009, 09:33) Выв...   Nov 13 2009, 12:21
|- - defunct   ЦитатаА обработчик FIQ для АЦП у меня имеет очень ...   Nov 13 2009, 14:44
|- - GetSmart   Цитата(VslavX @ Nov 13 2009, 18:21) Навер...   Nov 13 2009, 17:25
||- - defunct   Цитата(GetSmart @ Nov 13 2009, 19:25) Что...   Nov 13 2009, 17:37
|- - GetSmart   Цитата(VslavX @ Nov 13 2009, 18:21) Как м...   Nov 13 2009, 17:46
|- - defunct   Цитата(GetSmart @ Nov 13 2009, 19:39) Зач...   Nov 13 2009, 18:00
||- - GetSmart   Цитата(defunct @ Nov 14 2009, 00:00) А с ...   Nov 13 2009, 18:19
||- - defunct   Цитата(GetSmart @ Nov 13 2009, 20:19) Ско...   Nov 13 2009, 18:34
||- - GetSmart   Цитата(defunct @ Nov 14 2009, 00:34) Все ...   Nov 13 2009, 18:38
||- - defunct   Цитата(GetSmart @ Nov 13 2009, 20:38) Отл...   Nov 13 2009, 18:46
||- - GetSmart   Цитата(defunct @ Nov 14 2009, 00:46) Муль...   Nov 13 2009, 18:51
||- - defunct   Цитата(GetSmart @ Nov 13 2009, 20:51) Не...   Nov 13 2009, 19:12
|- - VslavX   Цитата(GetSmart @ Nov 13 2009, 19:46) Все...   Nov 13 2009, 18:27
||- - GetSmart   Цитата(VslavX @ Nov 14 2009, 00:27) Сильн...   Nov 13 2009, 18:34
|- - singlskv   Решения с вложенными прерываниями имеют право на ж...   Nov 13 2009, 18:53
|- - GetSmart   Цитата(singlskv @ Nov 14 2009, 00:53) Зна...   Nov 13 2009, 19:05
|- - singlskv   Цитата(GetSmart @ Nov 13 2009, 22:05) Сей...   Nov 13 2009, 19:17
|- - defunct   Цитата(singlskv @ Nov 13 2009, 21:17) Вер...   Nov 13 2009, 19:28
|- - GetSmart   Цитата(defunct @ Nov 14 2009, 01:28) Нет,...   Nov 13 2009, 20:01
|- - singlskv   Цитата(GetSmart @ Nov 13 2009, 23:01) Име...   Nov 13 2009, 21:57
||- - GetSmart   Цитата(singlskv @ Nov 14 2009, 03:57) хот...   Nov 14 2009, 03:42
|- - defunct   Цитата(GetSmart @ Nov 13 2009, 22:01) Это...   Nov 13 2009, 23:28
- - GetSmart   Взято из другой темы Цитата(KRS @ Oct 27 2009...   Nov 13 2009, 08:46
- - zltigo   Цитата(GetSmart @ Nov 13 2009, 10:14) ......   Nov 13 2009, 11:52
|- - GetSmart   Цитата(zltigo @ Nov 13 2009, 17:52) Обычн...   Nov 13 2009, 17:10
||- - defunct   Цитата(GetSmart @ Nov 13 2009, 19:10) Раз...   Nov 13 2009, 17:12
||- - zltigo   Цитата(GetSmart @ Nov 13 2009, 20:10) Пор...   Nov 13 2009, 18:47
|- - GetSmart   Цитата(zltigo @ Nov 13 2009, 17:52) ...на...   Nov 13 2009, 18:55
|- - zltigo   Цитата(GetSmart @ Nov 13 2009, 21:55) Нел...   Nov 13 2009, 19:00
|- - GetSmart   Цитата(zltigo @ Nov 14 2009, 01:00) Можно...   Nov 14 2009, 08:48
|- - zltigo   ЦитатаДалее высокоприоритетный тред будет Это може...   Nov 14 2009, 09:55
|- - GetSmart   Цитата(zltigo @ Nov 14 2009, 15:55) Это м...   Nov 15 2009, 13:10
|- - zltigo   Цитата(GetSmart @ Nov 15 2009, 16:10) Люб...   Nov 15 2009, 13:28
||- - GetSmart   Цитата(zltigo @ Nov 15 2009, 19:28) Где В...   Nov 15 2009, 13:38
|||- - zltigo   Цитата(GetSmart @ Nov 15 2009, 16:38) Exc...   Nov 15 2009, 13:55
||- - yuri_t   Цитата(zltigo @ Nov 15 2009, 17:28) Я дав...   Nov 15 2009, 13:39
||- - GetSmart   Цитата(zltigo @ Nov 15 2009, 19:28) Пока ...   Nov 15 2009, 13:48
|||- - yuri_t   Цитата(GetSmart @ Nov 15 2009, 16:48) Ну ...   Nov 15 2009, 14:05
||- - GetSmart   Цитата(zltigo @ Nov 15 2009, 19:28) Я дав...   Nov 15 2009, 13:56
||- - zltigo   Цитата(GetSmart @ Nov 15 2009, 16:56) Щас...   Nov 15 2009, 14:00
||- - VslavX   Цитата(GetSmart @ Nov 15 2009, 15:56) Щас...   Nov 15 2009, 15:17
|- - singlskv   Цитата(GetSmart @ Nov 15 2009, 16:10) По ...   Nov 15 2009, 22:35
|- - defunct   Цитата(singlskv @ Nov 16 2009, 00:35) Есл...   Nov 16 2009, 00:19
||- - singlskv   Цитата(defunct @ Nov 16 2009, 03:19) Счит...   Nov 16 2009, 00:59
|||- - defunct   Цитата(singlskv @ Nov 16 2009, 02:59) Не ...   Nov 16 2009, 02:37
||- - GetSmart   Цитата(defunct @ Nov 16 2009, 06:19) __as...   Nov 16 2009, 03:21
|||- - defunct   Цитата(GetSmart @ Nov 16 2009, 05:21) SWI...   Nov 16 2009, 03:24
||- - GetSmart   Цитата(defunct @ Nov 16 2009, 06:19) __as...   Nov 16 2009, 07:50
||- - zltigo   Цитата(GetSmart @ Nov 16 2009, 10:50) ......   Nov 16 2009, 10:27
|- - GetSmart   Цитата(singlskv @ Nov 16 2009, 04:35) Я п...   Nov 16 2009, 03:31
|- - defunct   Цитата(GetSmart @ Nov 16 2009, 05:31) Тол...   Nov 16 2009, 04:05
|- - GetSmart   Цитата(defunct @ Nov 16 2009, 10:05) Да, ...   Nov 16 2009, 05:29
|- - VslavX   Цитата(GetSmart @ Nov 16 2009, 07:29) То ...   Nov 16 2009, 08:28
|- - GetSmart   Цитата(VslavX @ Nov 16 2009, 14:28) Возмо...   Nov 16 2009, 08:53
|- - zltigo   Цитата(GetSmart @ Nov 16 2009, 11:53) Что...   Nov 16 2009, 09:05
|- - VslavX   Цитата(GetSmart @ Nov 16 2009, 10:53) Кон...   Nov 16 2009, 09:21
|- - GetSmart   Цитата(VslavX @ Nov 16 2009, 15:21) А нич...   Nov 16 2009, 09:58
|- - zltigo   Цитата(GetSmart @ Nov 16 2009, 12:44) Но ...   Nov 16 2009, 09:59
|- - VslavX   Цитата(GetSmart @ Nov 16 2009, 11:58) Клю...   Nov 16 2009, 10:17
|- - GetSmart   Цитата(VslavX @ Nov 16 2009, 16:17) Ну, п...   Nov 16 2009, 16:51
|- - VslavX   Цитата(GetSmart @ Nov 16 2009, 18:25) Вне...   Nov 16 2009, 17:40
|- - GetSmart   Цитата(VslavX @ Nov 16 2009, 23:40) И что...   Nov 16 2009, 17:57
|- - zltigo   Цитата(GetSmart @ Nov 16 2009, 20:57) Дык...   Nov 16 2009, 18:15
|- - VslavX   Цитата(GetSmart @ Nov 16 2009, 19:57) 16 ...   Nov 16 2009, 18:41
|- - GetSmart   Цитата(VslavX @ Nov 17 2009, 00:41) То ес...   Nov 16 2009, 18:47
||- - VslavX   Цитата(GetSmart @ Nov 16 2009, 20:47) ...   Nov 16 2009, 18:55
|- - GetSmart   Цитата(VslavX @ Nov 17 2009, 00:41) ... т...   Nov 16 2009, 19:36
|- - VslavX   Цитата(GetSmart @ Nov 16 2009, 21:36) Мен...   Nov 16 2009, 20:36
|- - GetSmart   Почувствовав запах крови...он перешёл в наступлени...   Nov 17 2009, 07:38
|- - VslavX   Цитата(GetSmart @ Nov 17 2009, 09:38) И ч...   Nov 17 2009, 09:56
||- - GetSmart   Цитата(VslavX @ Nov 17 2009, 15:56) а поч...   Nov 18 2009, 07:40
||- - VslavX   Цитата(GetSmart @ Nov 18 2009, 09:40) Про...   Nov 18 2009, 12:09
|||- - zltigo   Цитата(VslavX @ Nov 18 2009, 15:09) enabl...   Nov 18 2009, 12:35
|||- - VslavX   Цитата(zltigo @ Nov 18 2009, 14:35) Это я...   Nov 18 2009, 12:40
||- - zltigo   Цитата(GetSmart @ Nov 18 2009, 10:40) И е...   Nov 18 2009, 12:46
||- - GetSmart   Цитата(zltigo @ Nov 18 2009, 18:46) ..для...   Nov 18 2009, 13:02
|||- - zltigo   Цитата(GetSmart @ Nov 18 2009, 16:02) Вло...   Nov 18 2009, 13:27
||- - GetSmart   Цитата(zltigo @ Nov 18 2009, 18:46) ..для...   Nov 18 2009, 14:07
||- - zltigo   Цитата(GetSmart @ Nov 18 2009, 17:07) Я ч...   Nov 18 2009, 14:27
||- - GetSmart   Цитата(zltigo @ Nov 18 2009, 20:27) Ту, к...   Nov 18 2009, 14:41
||- - zltigo   Цитата(GetSmart @ Nov 18 2009, 17:41) Ну ...   Nov 18 2009, 14:49
|- - GetSmart   Цитата(GetSmart @ Nov 17 2009, 13:38) Луч...   Nov 17 2009, 13:25
|- - Petka   Цитата(GetSmart @ Nov 17 2009, 16:25) Vsl...   Nov 17 2009, 15:12
|- - zltigo   Цитата(GetSmart @ Nov 17 2009, 16:25) Не ...   Nov 17 2009, 15:15
- - KRS   А взяли бы уже достпуный Cortex-M3 ( LPC1768 вроде...   Nov 15 2009, 20:07
- - Rst7   Кто так строит, кто так строит? (ЦЭ) Что стоило ...   Nov 16 2009, 09:27
|- - GetSmart   Цитата(Rst7 @ Nov 16 2009, 15:27) Что сто...   Nov 16 2009, 15:19
- - Rst7   ЦитатаНа ресемплинг не похоже Он и есть, только б...   Nov 16 2009, 17:15
- - GetSmart   Ладно, ладно, приврал На 8-битных WAV квантование...   Nov 16 2009, 18:25
- - GetSmart   К слову. Допустим кто-то поймёт, что вложенные пре...   Jun 28 2010, 20:25
|- - zltigo   QUOTE (GetSmart @ Jun 28 2010, 23:25) Не ...   Jun 28 2010, 20:47
- - GetSmart   Цитата(zltigo @ Jun 29 2010, 01:47) На са...   Jun 28 2010, 21:01
- - zltigo   QUOTE (GetSmart @ Jun 29 2010, 00:01) Сме...   Jun 28 2010, 21:16
- - singlskv   Цитата(GetSmart @ Jun 29 2010, 01:01) Дык...   Jun 28 2010, 22:04
- - GetSmart   Цитата(singlskv @ Jun 29 2010, 03:04) Про...   Jun 28 2010, 22:23
- - singlskv   Цитата(GetSmart @ Jun 29 2010, 02:19) ИМХ...   Jun 28 2010, 22:25


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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 00:26
Рейтинг@Mail.ru


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