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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Сб июл 25, 2009 12:46 
Не в сети

Зарегистрирован: Вс июн 21, 2009 19:11
Сообщения: 81
Откуда: Н.Новгород
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Ладно, господа, возвращаемся к нашим баранам (см. название темы)
Как организовать обработку прерывания на форте?
Например, хочу ввести слово
INTERRUPT{
и
}INTERRUPT
Первое должно сохранить необходимый контекст и регистры, которые будут испорчены внутри прерывания. Кроме того, на этапе компиляции оно должно определить вектор и записать его в таблицу векторов.
Второе соответственно всё восстановить и в конце вставить команду RETI.
Вопрос такого плана:
как определить список регистров, которые нужно сохранять?
си как-то это делает
Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб июл 25, 2009 12:59 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
логика подсказывает, что никак иначе нельзя понять, какие из регистров нужно сохранить, кроме путём анализа, какими регистрами пользуется (изменяет) подпрограмма прерывания. :?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб июл 25, 2009 13:28 
Не в сети

Зарегистрирован: Вс июн 21, 2009 19:11
Сообщения: 81
Откуда: Н.Новгород
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
вопрос писал(а):
путём анализа, какими регистрами пользуется (изменяет) подпрограмма прерывания

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб июл 25, 2009 15:53 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
MrYuran писал(а):
Например, хочу ввести слово
INTERRUPT{
и
}INTERRUPT
Первое должно сохранить необходимый контекст и регистры,

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб июл 25, 2009 16:35 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
MrYuran писал(а):
Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой


Такие прерывания пишутся на ассемблере.
Если вызывается подпрограмма, сохраняется заранее назначенный набор регистров,
согласно принятой дисциплине.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб июл 25, 2009 16:43 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Mihail писал(а):
Такие прерывания пишутся на ассемблере.

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб июл 25, 2009 17:26 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
MrYuran писал(а):
Сохранять всё подряд не хочется, ибо некоторые прерывания могут вызываться с килогерцовой частотой

А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб июл 25, 2009 17:32 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Хищник писал(а):
А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями.

обработка прерывания при неправильном проектировании может затягиваться на слишком длительное время, и следующее прерывание будет проигнорировано :)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб июл 25, 2009 18:04 
Не в сети

Зарегистрирован: Вс июн 21, 2009 19:11
Сообщения: 81
Откуда: Н.Новгород
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Хищник писал(а):
А чем так страшна килогерцовая частота для процессора с тактовой, измеряемой гигагерцами? Это по миллиону тактов между прерываниями.

Это у вас гигагерцы, а у меня на MSP430 4,8 MГц тактовая.
На PC c прерываниями и так всё ясно, операционка к ним и близко не подпустит


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс июл 26, 2009 06:44 
Не в сети

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

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

_________________
And so forth ...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

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


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

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