Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
MrYuran писал(а): Например, хочу ввести слово INTERRUPT{ и }INTERRUPT Первое должно сохранить необходимый контекст и регистры, которые будут испорчены внутри прерывания. Кроме того, на этапе компиляции оно должно определить вектор и записать его в таблицу векторов. Второе соответственно всё восстановить и в конце вставить команду RETI. Вопрос такого плана: как определить список регистров, которые нужно сохранять? Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой
Собственно говоря, существуют три способа:
1) сохранять все регистры процессора
2) сохранять все регистры, которые используются в реализации Форт-машины
3) сохранять все регистры, которые задействованы в реализации конкретного слова, но
это имеет смысл делать только если этот форт компилирует слова в native code, иначе вариант 3 совпадет с вариантом 2 почти всегда
Чтобы преодолеть предубеждение против варианта 1, следует оценить не только частоту прерываний, но и время их обработки - подозрореваю, что все не так страшно при килогерцевой частоте прерываний на мегагерцевом процессоре. А если все-таки "страшно", то, видимо, были сделаны неточные оценки и приняты неверные решения на более ранних этапах проектирования системы.
Вариант 2 - заведомо рабочий, при условии что внутри слов-обработчиков не вызываются нефортовские фрагменты кода.
Далее, при вылизывании программы (или ее участков) на предмет ее быстродействия, больший эффект дает не применение оптимизаторов форт-кода, а его анализ с выявлением критических участков и переписыванием их ручками в машкоде (на ассемблере). Как правило, это небольшие участки и их немного.
Это же применимо и к обработчикам прерываний - там часто участки кода сохраняющие восстанавливающие контекст и обеспечивающие работу именно фортовского кода будут больше чем "содержательные" участки.
И наконец, анализ самой обработки прерываний: разделение "очевидного" обработчика на два фрагмента - тот который необходимо вполнять в реальном времени, и тот, который можно передать на обслуживание другим потокам. Т.е. построение дисциплины диспетчеризации заданий в соответствии с реальными потребностями - быстродействие должно не максимальным, а минимально необходимым. Но это уже требует знания специфики задачи.
[quote="MrYuran"] Например, хочу ввести слово INTERRUPT{ и }INTERRUPT Первое должно сохранить необходимый контекст и регистры, которые будут испорчены внутри прерывания. Кроме того, на этапе компиляции оно должно определить вектор и записать его в таблицу векторов. Второе соответственно всё восстановить и в конце вставить команду RETI. Вопрос такого плана: как определить список регистров, которые нужно сохранять? Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой[/quote]
Собственно говоря, существуют три способа:
1) сохранять все регистры процессора
2) сохранять все регистры, которые используются в реализации Форт-машины
3) сохранять все регистры, которые задействованы в реализации конкретного слова, но
это имеет смысл делать только если этот форт компилирует слова в native code, иначе вариант 3 совпадет с вариантом 2 почти всегда
Чтобы преодолеть предубеждение против варианта 1, следует оценить не только частоту прерываний, но и время их обработки - подозрореваю, что все не так страшно при килогерцевой частоте прерываний на мегагерцевом процессоре. А если все-таки "страшно", то, видимо, были сделаны неточные оценки и приняты неверные решения на более ранних этапах проектирования системы.
Вариант 2 - заведомо рабочий, при условии что внутри слов-обработчиков не вызываются нефортовские фрагменты кода.
Далее, при вылизывании программы (или ее участков) на предмет ее быстродействия, больший эффект дает не применение оптимизаторов форт-кода, а его анализ с выявлением критических участков и переписыванием их ручками в машкоде (на ассемблере). Как правило, это небольшие участки и их немного.
Это же применимо и к обработчикам прерываний - там часто участки кода сохраняющие восстанавливающие контекст и обеспечивающие работу именно фортовского кода будут больше чем "содержательные" участки.
И наконец, анализ самой обработки прерываний: разделение "очевидного" обработчика на два фрагмента - тот который необходимо вполнять в реальном времени, и тот, который можно передать на обслуживание другим потокам. Т.е. построение дисциплины диспетчеризации заданий в соответствии с реальными потребностями - быстродействие должно не максимальным, а минимально необходимым. Но это уже требует знания специфики задачи.
|
|
|
|
Добавлено: Вс июл 26, 2009 06:44 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Хищник писал(а): А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями.
Это у вас гигагерцы, а у меня на MSP430 4,8 MГц тактовая.
На PC c прерываниями и так всё ясно, операционка к ним и близко не подпустит
[quote="Хищник"]А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями.[/quote]
Это у вас гигагерцы, а у меня на MSP430 4,8 MГц тактовая.
На PC c прерываниями и так всё ясно, операционка к ним и близко не подпустит
|
|
|
|
Добавлено: Сб июл 25, 2009 18:04 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Хищник писал(а): А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями.
обработка прерывания при неправильном проектировании может затягиваться на слишком длительное время, и следующее прерывание будет проигнорировано
[quote="Хищник"]А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями.[/quote]
обработка прерывания при неправильном проектировании может затягиваться на слишком длительное время, и следующее прерывание будет проигнорировано :)
|
|
|
|
Добавлено: Сб июл 25, 2009 17:32 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
MrYuran писал(а): Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой
А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями.
[quote="MrYuran"]Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой[/quote]
А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями.
|
|
|
|
Добавлено: Сб июл 25, 2009 17:26 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Mihail писал(а): Такие прерывания пишутся на ассемблере.
вообще не обязательно на ассемблере, НО
по крайней мере в современных ОС исходя из требований реентерабельности кода и желания не пропускать возникшие прерывания пишется
специальный обработчик, который ловит все возможные прерывания, отправляет сообщение о возникшем прерывании потребителю и отменяет режим прерывания. То есть стараюстя сделать всего одну процедуру с минимальным временем реакции, а вызов кода обработчика конкретного прерывания происходит уже в обычном режиме.
[quote="Mihail"]Такие прерывания пишутся на ассемблере.[/quote]
вообще не обязательно на ассемблере, НО
по крайней мере в современных ОС исходя из требований реентерабельности кода и желания не пропускать возникшие прерывания пишется
специальный обработчик, который ловит все возможные прерывания, отправляет сообщение о возникшем прерывании потребителю и отменяет режим прерывания. То есть стараюстя сделать всего одну процедуру с минимальным временем реакции, а вызов кода обработчика конкретного прерывания происходит уже в обычном режиме.
|
|
|
|
Добавлено: Сб июл 25, 2009 16:43 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
MrYuran писал(а): Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой
Такие прерывания пишутся на ассемблере.
Если вызывается подпрограмма, сохраняется заранее назначенный набор регистров,
согласно принятой дисциплине.
[quote="MrYuran"]Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой[/quote]
Такие прерывания пишутся на ассемблере.
Если вызывается подпрограмма, сохраняется заранее назначенный набор регистров,
согласно принятой дисциплине.
|
|
|
|
Добавлено: Сб июл 25, 2009 16:35 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
MrYuran писал(а): Например, хочу ввести слово INTERRUPT{ и }INTERRUPT Первое должно сохранить необходимый контекст и регистры,
во-первых, конкретно в какой системе и на каком процессоре?
во-вторых, то, что вы говорите сильно завязано на архитектуру, и смотреть надо внимательно в первую очередь в документацию, либо, как вариант, сделать кусок кода на сях и его декомпилировать.
[quote="MrYuran"]Например, хочу ввести слово INTERRUPT{ и }INTERRUPT Первое должно сохранить необходимый контекст и регистры,[/quote]
во-первых, конкретно в какой системе и на каком процессоре?
во-вторых, то, что вы говорите сильно завязано на архитектуру, и смотреть надо внимательно в первую очередь в документацию, либо, как вариант, сделать кусок кода на сях и его декомпилировать.
|
|
|
|
Добавлено: Сб июл 25, 2009 15:53 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
вопрос писал(а): путём анализа, какими регистрами пользуется (изменяет) подпрограмма прерывания
вот в этом собственно и вопрос - как?
Трассировать слова вплоть до примитивов, дизассемблировать и искать характерные сигнатуры?
Слишком сложно.
Другой вариант - при целевой компиляции формировать для каждого слова маску испорченных регистров, а потом их сложить и получить список.
[quote="вопрос"]путём анализа, какими регистрами пользуется (изменяет) подпрограмма прерывания[/quote]
вот в этом собственно и вопрос - как?
Трассировать слова вплоть до примитивов, дизассемблировать и искать характерные сигнатуры?
Слишком сложно.
Другой вариант - при целевой компиляции формировать для каждого слова маску испорченных регистров, а потом их сложить и получить список.
|
|
|
|
Добавлено: Сб июл 25, 2009 13:28 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
логика подсказывает, что никак иначе нельзя понять, какие из регистров нужно сохранить, кроме путём анализа, какими регистрами пользуется (изменяет) подпрограмма прерывания.
логика подсказывает, что никак иначе нельзя понять, какие из регистров нужно сохранить, кроме путём анализа, какими регистрами пользуется (изменяет) подпрограмма прерывания. :?
|
|
|
|
Добавлено: Сб июл 25, 2009 12:59 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Ладно, господа, возвращаемся к нашим баранам (см. название темы)
Как организовать обработку прерывания на форте?
Например, хочу ввести слово
INTERRUPT{
и
}INTERRUPT
Первое должно сохранить необходимый контекст и регистры, которые будут испорчены внутри прерывания. Кроме того, на этапе компиляции оно должно определить вектор и записать его в таблицу векторов.
Второе соответственно всё восстановить и в конце вставить команду RETI.
Вопрос такого плана:
как определить список регистров, которые нужно сохранять?
си как-то это делает
Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой
Ладно, господа, возвращаемся к нашим баранам (см. название темы)
Как организовать обработку прерывания на форте?
Например, хочу ввести слово
INTERRUPT{
и
}INTERRUPT
Первое должно сохранить необходимый контекст и регистры, которые будут испорчены внутри прерывания. Кроме того, на этапе компиляции оно должно определить вектор и записать его в таблицу векторов.
Второе соответственно всё восстановить и в конце вставить команду RETI.
Вопрос такого плана:
как определить список регистров, которые нужно сохранять?
си как-то это делает
Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой
|
|
|
|
Добавлено: Сб июл 25, 2009 12:46 |
|
|
|
|