Forth http://fforum.winglion.ru/ |
|
Как организовать прерывания в Форте? http://fforum.winglion.ru/viewtopic.php?f=39&t=2277 |
Страница 1 из 1 |
Автор: | MrYuran [ Сб июл 25, 2009 12:46 ] |
Заголовок сообщения: | |
Ладно, господа, возвращаемся к нашим баранам (см. название темы) Как организовать обработку прерывания на форте? Например, хочу ввести слово INTERRUPT{ и }INTERRUPT Первое должно сохранить необходимый контекст и регистры, которые будут испорчены внутри прерывания. Кроме того, на этапе компиляции оно должно определить вектор и записать его в таблицу векторов. Второе соответственно всё восстановить и в конце вставить команду RETI. Вопрос такого плана: как определить список регистров, которые нужно сохранять? си как-то это делает Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой |
Автор: | вопрос [ Сб июл 25, 2009 12:59 ] |
Заголовок сообщения: | |
логика подсказывает, что никак иначе нельзя понять, какие из регистров нужно сохранить, кроме путём анализа, какими регистрами пользуется (изменяет) подпрограмма прерывания. |
Автор: | MrYuran [ Сб июл 25, 2009 13:28 ] |
Заголовок сообщения: | |
вопрос писал(а): путём анализа, какими регистрами пользуется (изменяет) подпрограмма прерывания
вот в этом собственно и вопрос - как? Трассировать слова вплоть до примитивов, дизассемблировать и искать характерные сигнатуры? Слишком сложно. Другой вариант - при целевой компиляции формировать для каждого слова маску испорченных регистров, а потом их сложить и получить список. |
Автор: | mOleg [ Сб июл 25, 2009 15:53 ] |
Заголовок сообщения: | |
MrYuran писал(а): Например, хочу ввести слово
INTERRUPT{ и }INTERRUPT Первое должно сохранить необходимый контекст и регистры, во-первых, конкретно в какой системе и на каком процессоре? во-вторых, то, что вы говорите сильно завязано на архитектуру, и смотреть надо внимательно в первую очередь в документацию, либо, как вариант, сделать кусок кода на сях и его декомпилировать. |
Автор: | Mihail [ Сб июл 25, 2009 16:35 ] |
Заголовок сообщения: | |
MrYuran писал(а): Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой
Такие прерывания пишутся на ассемблере. Если вызывается подпрограмма, сохраняется заранее назначенный набор регистров, согласно принятой дисциплине. |
Автор: | mOleg [ Сб июл 25, 2009 16:43 ] |
Заголовок сообщения: | |
Mihail писал(а): Такие прерывания пишутся на ассемблере.
вообще не обязательно на ассемблере, НО по крайней мере в современных ОС исходя из требований реентерабельности кода и желания не пропускать возникшие прерывания пишется специальный обработчик, который ловит все возможные прерывания, отправляет сообщение о возникшем прерывании потребителю и отменяет режим прерывания. То есть стараюстя сделать всего одну процедуру с минимальным временем реакции, а вызов кода обработчика конкретного прерывания происходит уже в обычном режиме. |
Автор: | Hishnik [ Сб июл 25, 2009 17:26 ] |
Заголовок сообщения: | |
MrYuran писал(а): Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой
А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями. |
Автор: | mOleg [ Сб июл 25, 2009 17:32 ] |
Заголовок сообщения: | |
Хищник писал(а): А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями.
обработка прерывания при неправильном проектировании может затягиваться на слишком длительное время, и следующее прерывание будет проигнорировано |
Автор: | MrYuran [ Сб июл 25, 2009 18:04 ] |
Заголовок сообщения: | |
Хищник писал(а): А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями.
Это у вас гигагерцы, а у меня на MSP430 4,8 MГц тактовая. На PC c прерываниями и так всё ясно, операционка к ним и близко не подпустит |
Автор: | Варнак [ Вс июл 26, 2009 06:44 ] |
Заголовок сообщения: | |
MrYuran писал(а): Например, хочу ввести слово
INTERRUPT{ и }INTERRUPT Первое должно сохранить необходимый контекст и регистры, которые будут испорчены внутри прерывания. Кроме того, на этапе компиляции оно должно определить вектор и записать его в таблицу векторов. Второе соответственно всё восстановить и в конце вставить команду RETI. Вопрос такого плана: как определить список регистров, которые нужно сохранять? Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой Собственно говоря, существуют три способа: 1) сохранять все регистры процессора 2) сохранять все регистры, которые используются в реализации Форт-машины 3) сохранять все регистры, которые задействованы в реализации конкретного слова, но это имеет смысл делать только если этот форт компилирует слова в native code, иначе вариант 3 совпадет с вариантом 2 почти всегда Чтобы преодолеть предубеждение против варианта 1, следует оценить не только частоту прерываний, но и время их обработки - подозрореваю, что все не так страшно при килогерцевой частоте прерываний на мегагерцевом процессоре. А если все-таки "страшно", то, видимо, были сделаны неточные оценки и приняты неверные решения на более ранних этапах проектирования системы. Вариант 2 - заведомо рабочий, при условии что внутри слов-обработчиков не вызываются нефортовские фрагменты кода. Далее, при вылизывании программы (или ее участков) на предмет ее быстродействия, больший эффект дает не применение оптимизаторов форт-кода, а его анализ с выявлением критических участков и переписыванием их ручками в машкоде (на ассемблере). Как правило, это небольшие участки и их немного. Это же применимо и к обработчикам прерываний - там часто участки кода сохраняющие восстанавливающие контекст и обеспечивающие работу именно фортовского кода будут больше чем "содержательные" участки. И наконец, анализ самой обработки прерываний: разделение "очевидного" обработчика на два фрагмента - тот который необходимо вполнять в реальном времени, и тот, который можно передать на обслуживание другим потокам. Т.е. построение дисциплины диспетчеризации заданий в соответствии с реальными потребностями - быстродействие должно не максимальным, а минимально необходимым. Но это уже требует знания специфики задачи. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |