Программные прерывания (SWI) - как?

M_K
Ник удалён за неоплаченную рекламу
Posts: 3282
Joined: 26 Feb 2000 10:01
Location: Here, there and everywhere

Программные прерывания (SWI) - как?

Post by M_K »

Такой вот вопрос - специалистам по разным BIOS-ам и прочему firmware.

Интересует, как реализуются программные прерывания - сам принцип.
Или ткните носом, где почитать в инете.

Спасибо.
При слове «Бобруйск» собрание болезненно застонало. Все соглашались ехать в Бобруйск хоть сейчас. Бобруйск считался прекрасным, высококультурным местом.
User avatar
CTAC_P
Уже с Приветом
Posts: 6789
Joined: 01 Jun 2001 09:01

Post by CTAC_P »

Та же самая подпрограмма, только вид сбоку. Вместо вызова подпрограммы MYPROG напрямую вы записываете ее адрес в таблицу векторов, а потом вызываете по номеру в этой таблице.
M_K
Ник удалён за неоплаченную рекламу
Posts: 3282
Joined: 26 Feb 2000 10:01
Location: Here, there and everywhere

Post by M_K »

Э-э, я, пожалуй, слишком обще/кратко спросил.

У меня есть хардварное прерывание, которое работает всегда (ну, если не маскировано), но на HWI есть вполне очевидное ограничение - нужно "отстреляться" как можно быстрее (и желательно за фиксированное кол-во тактов).

Для того, чтобы выполнить какие-то более комплексные действия (опять-таки, "поперек" основной процедуры), возможно, в более подходящий, но не слишком удаленный по времени момент, - я полагаю, что надо реализовать что-либо подобное механизму программных прерываний. Вот только не знаю, как. В железе какой-то явной поддержки SWI подобной HWI (типа регистров и т.п.) не предусмотрено, или я чего-то не понимаю.
При слове «Бобруйск» собрание болезненно застонало. Все соглашались ехать в Бобруйск хоть сейчас. Бобруйск считался прекрасным, высококультурным местом.
User avatar
CTAC_P
Уже с Приветом
Posts: 6789
Joined: 01 Jun 2001 09:01

Post by CTAC_P »

M_K wrote:Э-э, я, пожалуй, слишком обще/кратко спросил.

У меня есть хардварное прерывание, которое работает всегда (ну, если не маскировано), но на HWI есть вполне очевидное ограничение - нужно "отстреляться" как можно быстрее (и желательно за фиксированное кол-во тактов).

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

Если я правильно понял, Вы хотите отложить обработку прерывания на более поздний срок?
Если знакомы с тредами, то создайте тред-обработчик и повесьте в нем ожидание сигнала. А сигнал посылайте из прерывания.
M_K
Ник удалён за неоплаченную рекламу
Posts: 3282
Joined: 26 Feb 2000 10:01
Location: Here, there and everywhere

Post by M_K »

CTAC_P wrote:Если я правильно понял, Вы хотите отложить обработку прерывания на более поздний срок?

Да, примерно так - например, до выхода основной процедуры из "критической секции".
Если знакомы с тредами, то создайте тред-обработчик и повесьте в нем ожидание сигнала. А сигнал посылайте из прерывания.

Проблема в том, что поддержки тредов по умолчанию нет и надо их как-то реализовать "с нуля", а я не совсем представляю, как это следует делать в real-time системах "по-правильному" - HWI от таймера? Или как-то еще?
При слове «Бобруйск» собрание болезненно застонало. Все соглашались ехать в Бобруйск хоть сейчас. Бобруйск считался прекрасным, высококультурным местом.
User avatar
CTAC_P
Уже с Приветом
Posts: 6789
Joined: 01 Jun 2001 09:01

Post by CTAC_P »

Т.е. операционки никакой нет совсем?
Ну тогда заведите флаг и взводите его в прерывании, а в основной программе следите за этим флагом.
M_K
Ник удалён за неоплаченную рекламу
Posts: 3282
Joined: 26 Feb 2000 10:01
Location: Here, there and everywhere

Post by M_K »

CTAC_P wrote:Т.е. операционки никакой нет совсем?

Дык, в том-то и дело - нет даже BIOS-а.
Ну тогда заведите флаг и взводите его в прерывании, а в основной программе следите за этим флагом.

Это, конечно, первое, что пришло мне в голову, но, к сожалению, это не очень удобно. Конечно, если не найдется более изящный способ - придется так и сделать...
При слове «Бобруйск» собрание болезненно застонало. Все соглашались ехать в Бобруйск хоть сейчас. Бобруйск считался прекрасным, высококультурным местом.
User avatar
CTAC_P
Уже с Приветом
Posts: 6789
Joined: 01 Jun 2001 09:01

Post by CTAC_P »

M_K wrote:
CTAC_P wrote:Т.е. операционки никакой нет совсем?

Дык, в том-то и дело - нет даже BIOS-а.
Ну тогда заведите флаг и взводите его в прерывании, а в основной программе следите за этим флагом.

Это, конечно, первое, что пришло мне в голову, но, к сожалению, это не очень удобно. Конечно, если не найдется более изящный способ - придется так и сделать...

Написать свою простенькую операционку. Самое простое когда треды сами друг другу передают управление и у всех приоритеты равные.
User avatar
Tango
Уже с Приветом
Posts: 2099
Joined: 30 Jan 2004 07:55
Location: Orange County, CA

Post by Tango »

CTAC_P wrote:Т.е. операционки никакой нет совсем?
Ну тогда заведите флаг и взводите его в прерывании, а в основной программе следите за этим флагом.


Так наверное самое простое будет сделать... если основная программа представляет собой периодический цикл где етот флаг можно проверять (типа, state machine). Иногда такого может не быть, тогда идея с SW interrupt, сгенерированного из HW interrupt обработчика может сработать. Но воплощение тут сильно зависит от платформы. А иногда можно прямо в обработчике HW interrupt выключить то что является критическим, и ограничевает время обработки (типа, enable interrupts, или что еще там держит critical/exclusive section...) Но, (а) ето очень похоже на SW interrupt, (б) потенциально может привести к куче проблем с новыми interrupt'ами, которые могут случится во время обработки ("nested" interrupts).

Короче, одного универсального решения наверное нет, зависит от вашей системы...
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

Отложенная обработка прерывания является распространенной практикой Делаете очередь и обработчик прерывания складывает туда информацию, это пару тактов и занимает
Далее надо определиться какие моменты времени являются подходящими для разгребания очереди
Вообще-то не биосное это дело, получается что то вроде мини операционки. Потоки, объекты синхронизации, очереди задач...
Никакой разрухи нет. (с) Проф. Преображенский.
M_K
Ник удалён за неоплаченную рекламу
Posts: 3282
Joined: 26 Feb 2000 10:01
Location: Here, there and everywhere

Post by M_K »

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

А все-таки, как обычно работают SW interrupts во всяких BIOS-ах?
При слове «Бобруйск» собрание болезненно застонало. Все соглашались ехать в Бобруйск хоть сейчас. Бобруйск считался прекрасным, высококультурным местом.
User avatar
Tango
Уже с Приветом
Posts: 2099
Joined: 30 Jan 2004 07:55
Location: Orange County, CA

Post by Tango »

M_K wrote:Да, тут проблема еще такого рода, что в основном цикле дергается за хвост библиотечная ф-я, которая в некоторых случаях может исполняться дольше, чем период между прерываниями. Проверить флаг внутри этой ф-ии - нет никакой возможности. А выполнить процедурку надо до прихода следующего аппаратного прерывания. Так что, самым простым способом отделаться не удастся.

А все-таки, как обычно работают SW interrupts во всяких BIOS-ах?


Как СТАС_Р писал выше, SW interrupts это нечто очень похожее на простой function call (типа, call или jmp). Оснвные отличия: (1) адрес jump'a хранится в определенном (всем заранее известном) месте, (2) часто существует HW поддержка очереди (или счетчик) количества вызовов (но не всегда), так что interrupt handler может правильно обрабатывать multiple events, (3) часто (но опять не всегда) существует HW поддержка для всякого рода защит (например, SWI может выполняться в особой моде процессора, поетому ее нельзя bypass обычным function call. В результате, (в теории) существует только одно место входа в процедуру, где можно реализовыват' access control на OS уровне, итд).

Теперь, по сути вашего вопроса, если "процедурку" из HW interrupt обработчика выполнять не хочется, можно сделать так: (1) оформить "процедурку" как SW interrupt: написать обработчик и прописать его адрес в таблице векторов. Детали зависят от типа CPU, но, как правило, все очень похоже на обработку HW interrupt. Обратите внимание на правильное сохранение регистров и выход (возвращение) из обработчика. (2) Внутри SW interrupt обработчика первым делом надо разрешит'ь HW interrupts (если они запрещены), чтобы система могла обрабатывать ваши HW events. SW interrupts, как правило, будут (и должны быть) запрещены, чтобы новый HW event не сгенерил новый SW interrupt пока вы в его обрабатываете. (Тут также неплохо было проверить, сколько раз SW interrupt был вызван и правильно на это отреагировать). На самом деле, детали (деление на HW/SW interrupts, их приоритеты, маски запрещения, и тд) очень различны для разных CPU, так что детали могут отличаться для вас (Что там за платформа у вас то? :) ). (3) Из вашего HW interrupt обработчика вы вызываете (генерируете) ваш SW interrupt. Обычно это специальная CPU инструкция (int или swi, функционально типа call или jmp).

Ну вот наверное и все. Ваша система будет быстро обрабатывать HW interrupts немедленно по мере поступления, потом делать более длинные interrupt-triggered действия внутри SW interrupt, а в оставшееся время- крутить "основную" програму.
DMG
Новичок
Posts: 57
Joined: 05 May 2001 09:01
Location: SPb -> Michigan

Post by DMG »

M_K wrote:Да, тут проблема еще такого рода, что в основном цикле дергается за хвост библиотечная ф-я, которая в некоторых случаях может исполняться дольше, чем период между прерываниями. Проверить флаг внутри этой ф-ии - нет никакой возможности. А выполнить процедурку надо до прихода следующего аппаратного прерывания. Так что, самым простым способом отделаться не удастся.

А все-таки, как обычно работают SW interrupts во всяких BIOS-ах?


Sorry for English: no Russian kbd here.

You may want to learn how RSX-11 (RT-11) kernels were organized: these realtime (RT was "harder", RSX was "softer") kernels had a special hierarchy of priorities allowing for quick response to interrupts and doing their critical parts at non-interruptible level; lower priority was "forked" (delayed) interrupt processing: it might be only interrupted by HW interrupts themselves, but all forked interrupt processing was properly synchronized to use system resources (like dynamic memory - heap, system queues etc). (lower priorities were AST and regular aplication execution). Time constraints were more relaxed for delayed inerrupt processing. You need something like this.

In other words: your system may be in one of the two states: HW interrupt and SW (forked, delayed) interrupt processing. You also need a FIFO queue. Set up your interrupt vector so that upon entering the HWI handler, interrupts are disabled (or maybe enabled for higher HWI priorities). Upon completion of the "quick" non-interruptible part (like fetching data from the device that might be overwritten if not extracted timely eg a non-buffered serial line) see if the queue is empty. If it is then just enable interrupts and continue on (you are in SWI now). If the queue is not empty then create an element of that queue with continuation address and append it to the queue's tail. When you are done with your SWI processing for this HW interrupt inspect the queue. If it is empty (no other HWIs arrived while you were in SWI) then you may return to the application level (if any) or just halt the processor until the next HWI comes. If the queue is not empty then fetch the head element and jump to the continuation address.

Thus you may minimize the time when interrupts are completely disabled (you definitely need this also when manipulating the queue), and properly synchronize all SWI processing.

PS This is a rather simplified scheme (but may be sufficient for you needs); I omitted context save-restore when transitioning from HWI to SWI. I also omitted the I/O completion mechanism. But these are not that hard to figure out. You may want to read more about PDP kernels: dig through old computer publications.

And sources for RSX/RT kernels were available (to understand them, you need to learn the PDP assembly lang Macro-11, but it is much clearer and looks more pleasant than x86 asm).

PPS RSX/RT are "classics" now, but I doubt anybody designed anything significantly better since then.
Dimitry
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

M_K wrote:Да, тут проблема еще такого рода, что в основном цикле дергается за хвост библиотечная ф-я, которая в некоторых случаях может исполняться дольше, чем период между прерываниями. Проверить флаг внутри этой ф-ии - нет никакой возможности. А выполнить процедурку надо до прихода следующего аппаратного прерывания. Так что, самым простым способом отделаться не удастся.

А все-таки, как обычно работают SW interrupts во всяких BIOS-ах?

Ето только название - на самом деле ето ничего больше чем обычная таблица для вызова подпрограмм. Единственное, что делает его общего с хардверными прерываниями - таблица переходов леххит в той же самой таблице с хардверными.
Идея бихайнд тхис я думаю - чтоб разные версии конкретно знали какое прерывание(функцию) вызывать и абстрагировались от имплементации и изменений в версиях.
Верить нельзя никому - даже себе. Мне - можно!
User avatar
Sergunka
Уже с Приветом
Posts: 34164
Joined: 03 Dec 2000 10:01
Location: Vladivostok->San Francisco->Los Angeles->San Francisco

Post by Sergunka »

DMG wrote:PPS RSX/RT are "classics" now, but I doubt anybody designed anything significantly better since then.


Concur
User avatar
Tango
Уже с Приветом
Posts: 2099
Joined: 30 Jan 2004 07:55
Location: Orange County, CA

Post by Tango »

Sergunka wrote:
DMG wrote:PPS RSX/RT are "classics" now, but I doubt anybody designed anything significantly better since then.


Concur


Вы бы ему еще Solaris туда посадить присоветовали! (Шутка :) )

А если серьезно, кстати RedHat'овский eCos имеет похожую имплементацию своего кернела.

И еще, мы так и не знаем что за железо у человека... Мы все "таблица да таблица (векторов)", а может там какой ARM с одним единственным SWI.... :)
User avatar
theukrainian
Уже с Приветом
Posts: 2506
Joined: 13 Jan 2003 22:34
Location: Kiev :: Los Angeles, CA

Post by theukrainian »

M_K - а чем ваше упражнение с software interrupts закончилось, если не секрет?

спасибо,

денис
User avatar
Tango
Уже с Приветом
Posts: 2099
Joined: 30 Jan 2004 07:55
Location: Orange County, CA

Post by Tango »

theukrainian wrote:M_K - а чем ваше упражнение с software interrupts закончилось, если не секрет?

спасибо,

денис


...и вечное молчание было ему ответом. :)

Return to “Вопросы и новости IT”