Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 22:56

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Как организовать прерывания в Форте?
Автор Сообщение
  Заголовок сообщения:   Ответить с цитатой
MrYuran писал(а):
Например, хочу ввести слово
INTERRUPT{
и
}INTERRUPT
Первое должно сохранить необходимый контекст и регистры, которые будут испорчены внутри прерывания. Кроме того, на этапе компиляции оно должно определить вектор и записать его в таблицу векторов.
Второе соответственно всё восстановить и в конце вставить команду RETI.
Вопрос такого плана:
как определить список регистров, которые нужно сохранять?
Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой

Собственно говоря, существуют три способа:
1) сохранять все регистры процессора
2) сохранять все регистры, которые используются в реализации Форт-машины
3) сохранять все регистры, которые задействованы в реализации конкретного слова, но
это имеет смысл делать только если этот форт компилирует слова в native code, иначе вариант 3 совпадет с вариантом 2 почти всегда
Чтобы преодолеть предубеждение против варианта 1, следует оценить не только частоту прерываний, но и время их обработки - подозрореваю, что все не так страшно при килогерцевой частоте прерываний на мегагерцевом процессоре. А если все-таки "страшно", то, видимо, были сделаны неточные оценки и приняты неверные решения на более ранних этапах проектирования системы.
Вариант 2 - заведомо рабочий, при условии что внутри слов-обработчиков не вызываются нефортовские фрагменты кода.
Далее, при вылизывании программы (или ее участков) на предмет ее быстродействия, больший эффект дает не применение оптимизаторов форт-кода, а его анализ с выявлением критических участков и переписыванием их ручками в машкоде (на ассемблере). Как правило, это небольшие участки и их немного.
Это же применимо и к обработчикам прерываний - там часто участки кода сохраняющие восстанавливающие контекст и обеспечивающие работу именно фортовского кода будут больше чем "содержательные" участки.
И наконец, анализ самой обработки прерываний: разделение "очевидного" обработчика на два фрагмента - тот который необходимо вполнять в реальном времени, и тот, который можно передать на обслуживание другим потокам. Т.е. построение дисциплины диспетчеризации заданий в соответствии с реальными потребностями - быстродействие должно не максимальным, а минимально необходимым. Но это уже требует знания специфики задачи.
Сообщение Добавлено: Вс июл 26, 2009 06:44
  Заголовок сообщения:   Ответить с цитатой
Хищник писал(а):
А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями.

Это у вас гигагерцы, а у меня на MSP430 4,8 MГц тактовая.
На PC c прерываниями и так всё ясно, операционка к ним и близко не подпустит
Сообщение Добавлено: Сб июл 25, 2009 18:04
  Заголовок сообщения:   Ответить с цитатой
Хищник писал(а):
А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями.

обработка прерывания при неправильном проектировании может затягиваться на слишком длительное время, и следующее прерывание будет проигнорировано :)
Сообщение Добавлено: Сб июл 25, 2009 17:32
  Заголовок сообщения:   Ответить с цитатой
MrYuran писал(а):
Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой

А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями.
Сообщение Добавлено: Сб июл 25, 2009 17:26
  Заголовок сообщения:   Ответить с цитатой
Mihail писал(а):
Такие прерывания пишутся на ассемблере.

вообще не обязательно на ассемблере, НО
по крайней мере в современных ОС исходя из требований реентерабельности кода и желания не пропускать возникшие прерывания пишется
специальный обработчик, который ловит все возможные прерывания, отправляет сообщение о возникшем прерывании потребителю и отменяет режим прерывания. То есть стараюстя сделать всего одну процедуру с минимальным временем реакции, а вызов кода обработчика конкретного прерывания происходит уже в обычном режиме.
Сообщение Добавлено: Сб июл 25, 2009 16:43
  Заголовок сообщения:   Ответить с цитатой
MrYuran писал(а):
Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой


Такие прерывания пишутся на ассемблере.
Если вызывается подпрограмма, сохраняется заранее назначенный набор регистров,
согласно принятой дисциплине.
Сообщение Добавлено: Сб июл 25, 2009 16:35
  Заголовок сообщения:   Ответить с цитатой
MrYuran писал(а):
Например, хочу ввести слово
INTERRUPT{
и
}INTERRUPT
Первое должно сохранить необходимый контекст и регистры,

во-первых, конкретно в какой системе и на каком процессоре?
во-вторых, то, что вы говорите сильно завязано на архитектуру, и смотреть надо внимательно в первую очередь в документацию, либо, как вариант, сделать кусок кода на сях и его декомпилировать.
Сообщение Добавлено: Сб июл 25, 2009 15:53
  Заголовок сообщения:   Ответить с цитатой
вопрос писал(а):
путём анализа, какими регистрами пользуется (изменяет) подпрограмма прерывания

вот в этом собственно и вопрос - как?
Трассировать слова вплоть до примитивов, дизассемблировать и искать характерные сигнатуры?
Слишком сложно.
Другой вариант - при целевой компиляции формировать для каждого слова маску испорченных регистров, а потом их сложить и получить список.
Сообщение Добавлено: Сб июл 25, 2009 13:28
  Заголовок сообщения:   Ответить с цитатой
логика подсказывает, что никак иначе нельзя понять, какие из регистров нужно сохранить, кроме путём анализа, какими регистрами пользуется (изменяет) подпрограмма прерывания. :?
Сообщение Добавлено: Сб июл 25, 2009 12:59
  Заголовок сообщения:   Ответить с цитатой
Ладно, господа, возвращаемся к нашим баранам (см. название темы)
Как организовать обработку прерывания на форте?
Например, хочу ввести слово
INTERRUPT{
и
}INTERRUPT
Первое должно сохранить необходимый контекст и регистры, которые будут испорчены внутри прерывания. Кроме того, на этапе компиляции оно должно определить вектор и записать его в таблицу векторов.
Второе соответственно всё восстановить и в конце вставить команду RETI.
Вопрос такого плана:
как определить список регистров, которые нужно сохранять?
си как-то это делает
Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой
Сообщение Добавлено: Сб июл 25, 2009 12:46

Часовой пояс: UTC + 3 часа [ Летнее время ]


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB