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

 
 
7 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Высшая степень вложенности Real/Soft FIQ/IRQ
defunct
сообщение Nov 13 2009, 23:28
Сообщение #31


кекс
******

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



Цитата(GetSmart @ Nov 13 2009, 22:01) *
Этот расчёт нельзя переносить в тред, т.к. скорость реакции будет непредсказуемой или черезмерно большой.

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

Из конструктивной критики Вашего решения могу сказать только:
вместо Undef mode определенно лучше использовать SVC (и быстрее переключение, и адекватный обработчик undef abort'а в системе останется), конфликт с ОС, которая наверняка использует SVC для своих нужд, решается подменой SWI вектора переходом на обработчик АЦП перед вызовом SWI, и его восстановлением после окончания обработки. Если треды тоже работают в SVC тогда можно и стек вручную переключить не так и накладно:

Код
туда
mov    r0, sp
ldr    sp, =const
stmia  sp!, {r0 ...}

и назад
ldmia  sp!, {r0 ...}
mov    sp, r0


а если нет, тогда вообще никаких проблем - просто увеличте SVC стек в стартапе.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 14 2009, 03:42
Сообщение #32


.
******

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



Цитата(singlskv @ Nov 14 2009, 03:57) *
хотя с другой стороны, кто Вам мешает рассчет перенести не в тред а в SoftIRQ ?
и иметь просто FIQ с двумя короткими ветками
или так тоже будет недостаточно оперативно ?

З.Ы. Если SoftInt слишком медленно, можно и какое-нить переферийное с максимальным приоритетом взводить...
прямо из FIQ АЦП

Это можно. Можно сделать два SoftIRQ, но я в упор не вижу выгоды, вижу только увеличение джиттера FIQ. Т.к. два FIQа асинхронны. Плюс невложенные IRQ и критические секции в тредах будут добавлять лишнюю задержку входа в это SoftIRQ. Выигрыша нет, сплошные проигрыши.


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


.
******

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



Цитата(zltigo @ Nov 14 2009, 01:00) *
Можно. Уберите приставку 'псевдо'. Останется процесс обработки. Все в терминах операционных систем. Вы просто организовали процесс НЕ средствами операционной системы, по этой причине я и назвал его 'псевдопроцесс'. Но суть осталась - вложенного прерывания нет - произведена оптимизация обработчика FIQ прерывания и часть его вынесена из этого обработчика. Так и надо строить системы БЕЗ вложенных прерываний.

Проспался, и понял о чём речь. В FIQ ADC нужно по-быстрому скидывать данные в кольцевой (например, ну или в два обычных) буфер. И по-быстрому выходить из FIQ. Далее высокоприоритетный тред будет анализировать указатели RD + WR для буфера и обрабатывть новые поступившие данные. Хорошо. Это простой, классический, но не самый эффективный алгоритм. По сравнению с моим имеет множество недостатков и ни одного достоинства ИМХО.
Список недостатков:
1. Нет вложенности FIQ (казалось бы smile.gif бонус), из-за чего латентность FIQ DAC уменьшается, а джиттер увеличивается почти в 2 раза, т.к. нет разрешения FIQов по середине обработчика (при вложенных есть).
2. Требуется буфер в раме размером на максимально возможный интервал работы других тредов, пока управление не вернётся к треду, разгребающему буфер. Пускай даже я соглашусь на тормознутую реакцию на событие, но буфер в раме требуется немалый.
3. Кол-во вычислений над оцифрованными данными будет одинаковое, но без nested FIQ будет лишнее сохранение/ восстановление данных в буфере. Плюс очень (черезмерно?) частый анализ RD WR указателей. То есть очевидна пустая трата процессорного времени тогда, когда её можно избежать.
4. Во время воспроизведения WAV у меня тормозятся именно треды (у них может упасть производительность в 4 раза например) и не тормозится ни одного важного прерывания, вот в чём фишка! А если тормозятся треды, то и тот приоритетный тред, который разгребает данные от АЦП тоже затормозится и либо потеряет данные, либо буфер ему потребуется в 4 раза больший.

Три конкретных минуса и ни одного плюса. Если я что-то не учёл, пожалуйста поправьте.

Цитата(defunct @ Nov 14 2009, 05:28) *
Ок, я понял у Вас нечто очень-очень специфичное требующее жесткого реал-тайма (модуль управления ядерным реактором?), на батарейном питании. Затем кому-то захотелось чтобы этот модуль (управления реактором на батарейках) научился исполнять голосовые команды, и, отвечать пользователю тоже голосом. Но денег на смену элементной базы не дали, и питать модуль от реактора которым он управляет тоже не разрешили. smile.gif

Не обязательно. Использованное мной решение годится для очень большого числа задач начиная от средней сложности и выше. Повторю в очередной раз - от вложенных прерываний при правильном использовании нет никакого вреда, только экономия по всем фронтам, бояться их не надо.

А теперь я расскажу историю до вчерашнего дня. Есть заказчик. У него был девайс, который что-то заложенное в нём умел делать. Появился я, и первым делом поднял производительность АЦП в 3..5 раз, плюс стабильность частоты и джиттера и прочие бонусы. Затем возник вопрос - а можно ли ещё сделать это... И когда я сделал в параллель ко всему, что девайс умеет ещё и качественное воспроизведение WAV абсолютно не задев тайм-критичные характеристики пробора, то у заказчика просто челюсть отпала. Как я уже указывал, воспроизведение WAV тормозит только треды, и ни одного важного прерывания или события. И всё это требует рамы меньше, чем в любом другом варианте реализации алгоритма. И соответственно выдаёт больше производительности в каких-нибуть у.е. вычислений (например допустимая частота сигналов АЦП) по сравнению с другим вариантом реализации при одинаковой тактовой процессора.


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


Гуру
******

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



Цитата
Далее высокоприоритетный тред будет

Это может быть и не задача операционной системы, а вернемся к приставке 'псевдо' задача - тот-же софтово взводимый обработчик IRQ с наивысшим приоритетом или любой другой exception. Что примерно Вы и сделали, только утверждаете, что это назывется "вложенные FIQ" smile.gif
Цитата(GetSmart @ Nov 14 2009, 11:48) *
А теперь я расскажу историю до вчерашнего дня....

О чем я все время и говорю - вложенные прерывания в абсолютно подавляющеи большинстве случаев есть заплатка для плохо спроектированных систем. При этом причины по которым система спроектированы плохо значения не имеют. Причем проектирование системы и большинство системных проблем начинается с постановки задачи. В Вашем случае заказчик принес откуда-то какую-то железку и захотел всего больше в разы. И Вы это сделали ВСЕМИ ДОСТУПНЫМИ СРЕДСТВАМИ.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 15 2009, 13:10
Сообщение #35


.
******

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



Цитата(zltigo @ Nov 14 2009, 15:55) *
Это может быть и не задача операционной системы, а вернемся к приставке 'псевдо' задача - тот-же софтово взводимый обработчик IRQ с наивысшим приоритетом или любой другой exception.

Любой другой exception не вызывается из FIQ, не говорите глупостей. Если же вызовется, то в нём все FIQи будут запрещены. По поводу софтового варианта уже ответил singlskv, что вариант однозначно хуже вложенных FIQ. Если Вы так не считаете, то укажите конкретные недостатки моего варианта (nested FIQ) и достоинства SoftIRQ применительно к моей проге.

Цитата(zltigo @ Nov 14 2009, 15:55) *
Что примерно Вы и сделали, только утверждаете, что это назывется "вложенные FIQ" smile.gif

Опять 25. Как это ещё назвать, если обёртка обработчика на 100% аналогична вложенным IRQ (за искл. разрешения FIQ, а не IRQ) ?

Вот кастрированная обёртка:
Код
#define NESTED_FIQ

void AdcIntr_Wrapper()
{
    asm("MOV    R8,#0xe0000000        \n\t"        // 0xE0070000 = T2IR
        "ORR    R8,#0x00070000        \n\t"
        "LDR    R9,[R8, #0]           \n\t"
        "ANDS   R9,R9,#0xff           \n\t"
        "BEQ    adc9                  \n\t"
        "STR    R9,[R8, #0]           \n\t"        // сбрасываю все флаги в T2IR
.... Вывод в DAC
        "SUBS   PC,LR,#4              \n\t"

#ifdef NESTED_FIQ
   "adc9:STMDB  SP!,{R0,LR}           \n\t"
        "MVN    LR,#~0xFFFFFF00       \n\t"
        "MOV    R0,#" STRINGFY(1 << ADC0_INT) "\n\t"
        "STR    R0,[LR,#0xFFFFF014-0xFFFFFF00] \n\t"    // VICIntEnClr = (1 << ADC0_INT);
        "MRS    R0,SPSR               \n\t"
        "MSR    CPSR_c,#0x9b          \n\t"        // Undef_Mode + Disable IRQ + Enable FIQ
        "STMDB  SP!,{R0-R3,R12,LR}    \n\t");
#else
   "adc9:STMDB  SP!,{R0-R3,LR}        \n\t");
#endif

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

#ifdef NESTED_FIQ
    asm("LDMIA  SP!,{R0-R3,R12,LR}    \n\t"
        "MSR    CPSR_c,#0xD1          \n\t"        // FIQ_Mode + Disable IRQ + Disable FIQ
        "MSR    SPSR_all,R0           \n\t"
        "MVN    LR,#~0xFFFFFF00       \n\t"
        "MOV    R0,#" STRINGFY(1 << ADC0_INT) "\n\t"
        "STR    R0,[LR,#0xFFFFF010-0xFFFFFF00] \n\t"    // VICIntEnable = (1 << ADC0_INT);
        "LDMIA  SP!,{R0,LR}           \n\t"
        "SUBS   PC,LR,#4              \n\t");
#else
    asm("LDMIA  SP!,{R0-R3,LR}        \n\t"        // эпиолог для FIQ
        "SUBS   PC,LR,#4              \n\t");
#endif
}


Я одну вещь понять не могу. Изначально я хотел чтобы вложенный FIQ работал на стеке IRQ с запрещёнными IRQ. Насколько я знаю архитектуру ARMа, так можно. Единственное ограничение - не влетать в текущий режим если в обработчике используется LR (когда прога на Си). Прямо в этой обёртке (при заходе во вложенный FIQ) меняю режим с 0x9b (Undef) на 0x92 (IRQ) и где-то (пока непонятно где) улетаю в Data Abort. То есть первый уровень вне аборта я вижу - в макросе portSAVE_CONTEXT(), а дальше пока не отследил. Теряюсь в догадках - почему?


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


Гуру
******

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



Цитата(GetSmart @ Nov 15 2009, 16:10) *
Любой другой exception не вызывается из FIQ, не говорите глупостей.

Где Вы у меня видели "из"? Я писал "после". После КОРОТКОГО обработчика FIQ, если надо продолжить что-то делать без привлечения задачи операционной системы и без затрат времени на переключения контекста операционной системой.
Цитата
применительно к моей проге.

Пока Вы пытаетесь свести обсуждение к ограниченному кусочку неведомой "моей проги", Вы можете называть любые "преимущества".
Я давным-давно утверждаю только одно - в нормально спроектированной системе вложенные прерывания нужны в исключительнейших случаях. За этим утверждением мой опыт, в том числе и опыт использования вложенных прерываний.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 15 2009, 13:38
Сообщение #37


.
******

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



Цитата(zltigo @ Nov 15 2009, 19:28) *
Где Вы у меня видели "из"? Я писал "после". После КОРОТКОГО обработчика FIQ, если надо продолжить что-то делать без привлечения задачи операционной системы и без затрат времени на переключения контекста операционной системой.

Exception (за искл. FIQ и IRQ) можно вызвать только "из", а не "после". Поэтому остаётся только SoftIRQ без вариантов.


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


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Цитата(zltigo @ Nov 15 2009, 17:28) *
Я давным-давно утверждаю только одно - в нормально спроектированной системе вложенные прерывания нужны в исключительнейших случаях. За этим утверждением мой опыт, в том числе и опыт использования вложенных прерываний.


Полностью согласен.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 15 2009, 13:48
Сообщение #39


.
******

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



Цитата(zltigo @ Nov 15 2009, 19:28) *
Пока Вы пытаетесь свести обсуждение к ограниченному кусочку неведомой "моей проги", Вы можете называть любые "преимущества".

В начале топа Вы пытались меня критиковать даже без знания каких-либо нюансов алгоритма. Давайте продолжим. Я уже много подробностей рассказал. Даже готов согласиться на ооочень тормознутую реакцию на сигнал от АЦП. Только расскажите какие конкретно приемущества мне сулит отказ от вложенных FIQ ?

Цитата
Я давным-давно утверждаю только одно - в нормально спроектированной системе вложенные прерывания нужны в исключительнейших случаях. За этим утверждением мой опыт, в том числе и опыт использования вложенных прерываний.

Ну я же только что привёл прекрасный наглядный пример использования софтового IRQ для подгрузки данных при проигрывании файлов. Такие характеристики, которые он обеспечивает не достичь никаких другим способом. Или у Вас есть другие решения?

Цитата(yuri_t @ Nov 15 2009, 19:39) *
Полностью согласен.

Ага. Будда лучше всех biggrin.gif
Конкретные примеры в студию.

Сообщение отредактировал GetSmart - Nov 15 2009, 14:05


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


Гуру
******

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



Цитата(GetSmart @ Nov 15 2009, 16:38) *
Exception (за искл. FIQ и IRQ) можно вызвать только "из", а не "после". Поэтому остаётся только SoftIRQ без вариантов.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 15 2009, 13:56
Сообщение #41


.
******

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



Цитата(zltigo @ Nov 15 2009, 19:28) *
Я давным-давно утверждаю только одно - в нормально спроектированной системе вложенные прерывания нужны в исключительнейших случаях. За этим утверждением мой опыт, в том числе и опыт использования вложенных прерываний.

Щас придумал идеальную аналогию в понятиях ОС для определения вложенных прерываний. Это как "на лету" создающийся тред максимального приоритета именно в момент когда он понадобился. Он прерывает все другие треды, но не мешает прерываниям. Вложенными делают обычно тяжёлые прерывания. Этот признак делает аналогию ещё более точной. Когда тред полностью выполнил алгоритм, то он самоликвидируется smile.gif И больше не тратит процессорного времени до очередного события.


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


Гуру
******

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



Цитата(GetSmart @ Nov 15 2009, 16:56) *
Щас придумал...

Об этом я самого начала и говорю, начиная с поста №5 если перечитаете sad.gif. Теперь Вы четко поставили задачу. Для ее решения "вкладывать прерывания" совершенно не обязательно. Как и проектировать "тяжелые прерывания"


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Nov 15 2009, 14:05
Сообщение #43


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Цитата(GetSmart @ Nov 15 2009, 16:48) *
Ну я же только что привёл прекрасный наглядный пример использования софтового IRQ для подгрузки данных при проигрывании файлов. Такие характеристики, которые он обеспечивает не достичь никаких другим способом. Или у Вас есть другие решения?


Dear GetSmart !

-во-первых:

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

- во-вторых:

Не стоит, даже в пылу полемики, заявлять:

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

Поверте, эти "вышеотписавшиеся" понимают "все хитрости ядра" намного лучше нас с Baми...
Go to the top of the page
 
+Quote Post
VslavX
сообщение Nov 15 2009, 15:17
Сообщение #44


embarrassed systems engineer
*****

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



Цитата(GetSmart @ Nov 15 2009, 15:56) *
Щас придумал идеальную аналогию в понятиях ОС для определения вложенных прерываний. Это как "на лету" создающийся тред максимального приоритета именно в момент когда он понадобился.

"Лучше поздно, чем никогда" smile.gif

Создавать "когда понадобился" - это неоптимально по производительности - создание задачи выполняется относительно долго. А вот создать высокоприоритетный поток заранее и перевести его в ожидание некоторого события - самое оно. В прерывании сделать только самые-самые необходимые действия и активировать ожидаемое событие.

Цитата(GetSmart @ Nov 15 2009, 15:56) *
Он прерывает все другие треды, но не мешает прерываниям.

Именно

Цитата(GetSmart @ Nov 15 2009, 15:56) *
Когда тред полностью выполнил алгоритм, то он самоликвидируется smile.gif И больше не тратит процессорного времени до очередного события.

Немного не так - "засыпает" на новом ожидании события. И при этом точно так же не тратит ни такта процессорного времени. Создание/ликвидация более времязатратны и по ресурсам никакого выигрыша не дадут.

Вы будете удивлены, но маленькие ОСи переключают контекст очень быстро. Самая медленная из мной тестированных - uC/OS, со всеми наворотами (учет времени исполнения задачи, счетчик переключений контекста, вызов "рюшечных" колбеков) на SAM7S@48MHz (я думаю быстродействие LPC23@24 сравнимо) переключалась примерно за 14мкс - это полное время смены контекста, если выходить из прерывания - то это время располовиниться. То есть, задержка обработки данных по сравнению с моментом обработки в самом прерывании составит всего 7мкс - это менее 20 процентов от Ваших 40мкс. SCMrtos - в два раза быстрее, TNKernel тоже можно ускорить до этих цифр. Никто не говорит, что временнЫх издержек нет, они есть, но, как правило, незначительные, и эту цену часто стОит заплатить за архитектурную простоту и другие удобства.
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 15 2009, 20:07
Сообщение #45


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



А взяли бы уже достпуный Cortex-M3 ( LPC1768 вроде, кстати пнисовместимый с 2368) и получили бы аппаратные вложенные прерывания и pendsv - примерно то что у вас сейчас получилось.
Go to the top of the page
 
+Quote Post

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

 


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


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