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

 
 
7 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Высшая степень вложенности 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
_Pasha
сообщение Nov 13 2009, 07:26
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(GetSmart @ Nov 13 2009, 10:14) *
Звук (вывод в DAC) пришлось весить на FIQ

Если вывод по I2S, то почему не используете GPDMA? Или ЦАП не стандартный?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 13 2009, 07:33
Сообщение #3


.
******

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



Цитата(_Pasha @ Nov 13 2009, 13:26) *
Если вывод по I2S, то почему не используете GPDMA? Или ЦАП не стандартный?

Вывод конкретно в DAC (периферия проца), а не в I2S. GPDMA не работает с DAC.

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 13 2009, 08:46
Сообщение #4


.
******

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



Взято из другой темы
Цитата(KRS @ Oct 27 2009, 03:48) *
А кто нибудь посчитал расходы на вложенные прерывания - именно для ARM7 ? IMHO если убрать весь этот оверхед - окажется что вложенных прерываний и не надо wink.gif.
Если уж обработчик такой тяжелый что жрет много времени - не проще ли перекинуть большую его часть на обычный уровень!
А для совсем критических вещей есть же FIQ - два уровня IRQ, FIQ вполне достаточно.

Информирую, оверхед не просто нулевой, а отрицательный! smile.gif Не просто нет ничего лишнего, а наоборот одна только экономия от правильного применения вложенности.

Ещё из другой темы
Цитата(zltigo @ Oct 26 2009, 18:35) *
Цитата(GetSmart @ Oct 26 2009, 18:23) *
Вложенные прерывания - гениальная весчь в умелых руках. Не надо ля-ля smile.gif
А вложенные софтовые прерывания - вообще наше всё!

Нет sad.gif В 99% тяжелая кувалда используемая неумелыми руками во исполнение принципа "а чего-тут думать - трясти вкладывать надо"

cool.gif

------------
Маленькая поправка первого поста. Синуса 48000 ==> следует читать Синуса 750 Гц при сэмплировании (FIQом) 48000.

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 13 2009, 11:52
Сообщение #5


Гуру
******

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



Цитата(GetSmart @ Nov 13 2009, 10:14) *
...было нельзя.
...А обработчик FIQ для АЦП у меня имеет очень сложный алгоритм и переписывать...

Обычное дело, сначала в виде аргументов постулаты "было нельзя" и абстрактно написанные "сложные алгоритмы". Потом конечно берем кувалду и начинаем выкручиваться из ситуации куда сами и залезли. Обычное дело sad.gif. Подходим к делу не удивили.
И вообще в описанном Вами случае собственно вложенности-то и нет - есть очевидная разбивка ранее не продуманного обработчика прерывания на собственно обработчик прерывания и псевдопроцесс продолжения обработки. Собственно чем и доказали, что без вложенные обработчики без надобности, если думать системно - поздравляю!


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
VslavX
сообщение Nov 13 2009, 12:21
Сообщение #6


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(GetSmart @ Nov 13 2009, 09:33) *
Вывод конкретно в DAC (периферия проца), а не в I2S. GPDMA не работает с DAC.

Хм, мне не очень понятно зачем выводить 48кГц на 10-битный линейный DAC, да еще и моно. Обычно два класса звуковых приложений - или хотя бы минимальные стерео 48кГц/16 бит - типа простейших плееров, или уже моно 8кГц 8 бит - типа диспетчерских матюгальников/телефонной связи. Ну придумать применение моно/48кГц/10 бит конечно можно, но "ни рыба, ни мясо", ИМХО. Поставили бы уже дешевый I2S кодек, отдавали бы по GPDMA и никаких мучений.

Цитата(GetSmart @ Nov 13 2009, 09:33) *
А обработчик FIQ для АЦП у меня имеет очень сложный алгоритм

Наверное, так тоже можно делать. Но я уже пару лет при наличии ОС с приоритизацией потоков так не делаю - все сложные алгоритмы выносятся "на раз" в приоритетную задачу и там колбасятся. Сложный - значит долгий, если делать его в прерывании - то будет влияние на реал-тайм. Что Вы успешно и доказали - раз Вам понадобились вложенные прерывания.

Как мне видится решение Вашей задачи - выносится АЦП в приоритетный поток, а ЦАП - на прерывания, раз уж очень хочется и нету нормальной аппаратуры. А так как сделано сейчас - тут я согласен с zltigo - сами поставили себя в нечеловеческие условия, выкрутились и радуетесь. Замечательно, но потраченным усилиям можно только удивиться.

В-общем, я не против вложенных прерываний, все мои порты используемой TN-Kernel их поддерживают. Но, мое мнение - если уж понадобились вложенные прерывания, то в консерватории что-то не так - где-то "главный консерватор" провтыкал.
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 13 2009, 14:44
Сообщение #7


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
А обработчик FIQ для АЦП у меня имеет очень сложный алгоритм

В новых LPC по прежнему нет DMA для АЦП?!
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 13 2009, 17:10
Сообщение #8


.
******

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



Цитата(zltigo @ Nov 13 2009, 17:52) *
Обычное дело, сначала в виде аргументов постулаты "было нельзя" и абстрактно написанные "сложные алгоритмы". Потом конечно берем кувалду и начинаем выкручиваться из ситуации куда сами и залезли. Обычное дело sad.gif. Подходим к делу не удивили.
И вообще в описанном Вами случае собственно вложенности-то и нет - есть очевидная разбивка ранее не продуманного обработчика прерывания на собственно обработчик прерывания и псевдопроцесс продолжения обработки. Собственно чем и доказали, что без вложенные обработчики без надобности, если думать системно - поздравляю!

Поражаюсь чьей-то глупости необъективности.
А теперь пожалуйста конкретней - что значит "ранее не продуманного обработчика" ?
Заранее предупреждаю. Разделение алгоритма на IRQ/FIQ/треды проектировал лично я. Могу обосновать каждую песчинку алгоритма. С Вашей стороны пока вижу только пространственные сравнения и никакой конкретики. Если я пишу "было нельзя" значит было нельзя весить на IRQ. IRQ внутри FreeRTOS не обеспечивает необходимой латентности для оцифровки нужных сигналов. Причём тут постулаты? Ни откуда я не "выкручивался". Может я не знаю более "гениального" решения? Подскажите. Посмотрим.

Цитата(VslavX @ Nov 13 2009, 18:21) *
Хм, мне не очень понятно зачем выводить 48кГц на 10-битный линейный DAC, да еще и моно. Обычно два класса звуковых приложений - или хотя бы минимальные стерео 48кГц/16 бит - типа простейших плееров, или уже моно 8кГц 8 бит - типа диспетчерских матюгальников/телефонной связи. Ну придумать применение моно/48кГц/10 бит конечно можно, но "ни рыба, ни мясо", ИМХО. Поставили бы уже дешевый I2S кодек, отдавали бы по GPDMA и никаких мучений.

48 КГц моно для качественного воспроизведения звуковых файлов на одном динамике. 8кГц 8 бит - ховно и прошлый век. Принудительно делать 8кГц 8 бит в системе, которая способна воспроизводить 48 КГц удел слабаков.

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 13 2009, 17:12
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(GetSmart @ Nov 13 2009, 19:10) *
Разделение алгоритма на IRQ/FIQ/треды проектировал лично я. Могу обосновать каждую песчинку алгоритма.

Обоснуйте необходимость вешать обработчик ADC на FIQ.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 13 2009, 17:25
Сообщение #10


.
******

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



Цитата(VslavX @ Nov 13 2009, 18:21) *
Наверное, так тоже можно делать. Но я уже пару лет при наличии ОС с приоритизацией потоков так не делаю - все сложные алгоритмы выносятся "на раз" в приоритетную задачу и там колбасятся. Сложный - значит долгий, если делать его в прерывании - то будет влияние на реал-тайм. Что Вы успешно и доказали - раз Вам понадобились вложенные прерывания.

Сложный, не значит долгий. Сложный - это сложный, долгий - это долгий. Если посмотрите на осциллограмму, то увидите, что в FIQ АЦП прога висит по-разному, но максимум 40 мкс. Это не много для прерываний вообще, но много для FIQ DAC, что явилось объективной причиной для реализации вложенности. Переносить алгоритм в тред = затормозить его (алгоритм) или проц (все другие алгоритмы) на порядок. Либо отнять ещё лишнюю память для буферов, увеличить размер кода и прочее. В моей реализации процессор не делает ничего лишнего, чего не надо делать. Это как два варианта - 1. в нужный момент вызвать софтовое прерывание и 2. в треде максимального приоритета тупо поллить флаг, ожидая когда же он установится, тратя напрасно процессорное время.

Цитата(defunct @ Nov 13 2009, 23:12) *
Обоснуйте необходимость вешать обработчик ADC на FIQ.

Чтобы переключения контекстов FreeRTOS и критические секции не вызывали пауз в оцифровке сигналов (а там 14 каналов) и по возможности иметь минимально возможный джиттер.

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 13 2009, 17:37
Сообщение #11


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(GetSmart @ Nov 13 2009, 19:25) *
Чтобы переключения контекстов FreeRTOS и критические секции не вызывали пауз в оцифровке сигналов (а там 14 каналов) и по возможности иметь минимально возможный джиттер.

Т.е. DMA для ADC в LPC23xx нет. Тогда обоснуйте выбор камня.
SAM7 с DMA для ADC полностью избавил бы Вас от джиттера, и от необходимости работы с железом ADC после инициализации вообще, сделал бы возможным обрабатывать данные с АЦП в самой низкоприоритетной задаче вашего RTOS'а.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 13 2009, 17:46
Сообщение #12


.
******

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



Цитата(VslavX @ Nov 13 2009, 18:21) *
Как мне видится решение Вашей задачи - выносится АЦП в приоритетный поток, а ЦАП - на прерывания, раз уж очень хочется и нету нормальной аппаратуры. А так как сделано сейчас - тут я согласен с zltigo - сами поставили себя в нечеловеческие условия, выкрутились и радуетесь. Замечательно, но потраченным усилиям можно только удивиться.

Зачем мне заведомо проигрышное по производительности и ресурсоёмкости решение? Никак не могу понять, где здесь нечеловеческие условия? Вроде всё обыденно. Я с подобными задачами (требованиями) встречаюсь постоянно и очень редко приходится говорить кому-то, что это на данном девайсе сделать невозможно. Плохому танцору мешают только яйца biggrin.gif
И усилий было потрачено меньше, чем получено кайфа от работы и от осознания красоты и эффективности решения.
Все вышеотписавшиеся живут во власти предрассудков по поводу вложенности. И что бы не случилось, всеми способами пытаются заменить наиболее производительное решение на менее производительное только потому, что не понимают всех хитростей ядра для высокоэффективной организации вложенных прерываний.

Цитата(defunct @ Nov 13 2009, 23:37) *
Т.е. DMA для ADC в LPC23xx нет. Тогда обоснуйте выбор камня.

А кто сказал, что я девайс разрабатывал? Я разрабатывал только программу для готового девайса.
Только не делайте поспешного заявления о том, что девайс проектировал дилетант. Дело совсем не в девайсе. Дело в том, что реальный профессионал способен выжать из любого девайса 200% эффективности, тогда как пытающиеся выглядеть профессионалами будут выдавать работодателю заумные объяснения почему что-то там сделать нельзя. Вот здесь вот кодека не хватает. А любимый ход конём - а у вас процессор не той системы biggrin.gif


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 13 2009, 18:00
Сообщение #13


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(GetSmart @ Nov 13 2009, 19:39) *
Зачем мне заведомо проигрышное по производительности и ресурсоёмкости решение? Никак не могу понять,

А с чего вы взяли что оно по производительности более проигрышное и ресурсоемкое?
У меня к примеру на SAM7X (частота меньше, нет LPCшного MAM - отсюда thumb код, нет peripheral FIFO как в LPC у всего кроме EMAC ) делается тоже что и у вас только вывод 44.1kHz не моно, а стерео (DAC на PWM)... АЦП шлепает себе с нулевым джиттером на 44.1ksps на канал, по данным с АЦП считается fft в реалтайм, накладываются фильтры... Есть еще ethernet и fs... ну и там 232-й, 485-й, часики и прочая мелочь.
~50% ресурсов проца свободно, вложенными прерываниями там и не пахнет.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 13 2009, 18:19
Сообщение #14


.
******

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



Цитата(defunct @ Nov 14 2009, 00:00) *
А с чего вы взяли что оно по производительности более проигрышное и ресурсоемкое?

Потому, что в LPC23xx АЦП не подключён к DMA. И реализовать свой алгоритм вы не сможете. И аргумент ваш мимо кассы. Моя оценка была не вашему алгоритму/девайсу, а предложенному VslavX. Если сделать именно так, как он указал на LPC2368, то будет именно так, как я оценил. Поэтому приводить алгоритм, реализованный на другом камне в той ситуации, в которой я работаю не вижу разумного смысла.

Цитата(defunct @ Nov 14 2009, 00:00) *
АЦП шлепает себе с нулевым джиттером на 44.1ksps на канал

Сколько там возможно разных каналов от АЦП скидывать в DMA? У меня снаружи проца стоит ещё мультиплексор. Внутри FIQа приходится ещё менять адрес на нём.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
VslavX
сообщение Nov 13 2009, 18:27
Сообщение #15


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(GetSmart @ Nov 13 2009, 19:46) *
Все вышеотписавшиеся живут во власти предрассудков по поводу вложенности. И что бы не случилось, всеми способами пытаются заменить наиболее производительное решение на менее производительное только потому, что не понимают всех хитростей ядра для высокоэффективной организации вложенных прерываний.

Сильное заявление. После него даже и отвечать как-то неудобно...
Go to the top of the page
 
+Quote Post

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

 


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


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