41 / 41 / 36
Регистрация: 23.11.2006
Сообщений: 153
|
|
1 | |
Обработка аппаратных прерываний10.01.2017, 18:07. Показов 2113. Ответов 8
Метки нет (Все метки)
Доброго вечера. Уважаемые форумчане, кто нибудь сталкивался с таким? Необходимо написать подпрограмму обработки аппаратного прерывания системного таймера для генерации звука через каждые 5 секунд. Функция Delay() не в счёт. Прошу помощи, так как сам ума не приложу, как это сделать.
0
|
10.01.2017, 18:07 | |
Ответы с готовыми решениями:
8
Обработка аппаратных прерываний по номеру IRQ [VM] Реализация аппаратных прерываний Глобальные перехваты аппаратных прерываний Критическая секция запретом аппаратных прерываний |
Модератор
|
||||||
11.01.2017, 09:22 | 2 | |||||
Сообщение было отмечено HackSign как решение
Решение
Точно аппаратное прерывание в FreePascal? Не в TurboPascal?
В FPC обработка примерно такая же, но нужно будет переходить в реальный режим. Это несколько сложнее. Уточните задачу. Для TurboPascal проверял в DOSBox.
Смысл в перехвате пользовательского прерывания от таймера 1Ch. В добавляемом обработчике все действия - декремент одной единственной переменной TimerDec и проверке её на 0. Если равна 0, то вызвать подпрограмму Speaker, в которой или включится или отключится звук, а также будут назначены новые значения переменной TimerDec. При установке нового прерывания в процедуре InitSysTimer я сразу озаботился о восстановлении исходного вектора прерывания, добавив процедуру DoneSysTimer (восстановление прежнего вектора) в список процедур выхода (которые выполняются при завершении программы). Можно это убрать и восстанавливать вектор вручную в конце программы. Добавлено через 2 минуты Почему включение и отключение звука я вынес в отдельную процедуру - там чисто паскалевская обработка с вызовом библиотечных функций (Sound/NoSound). Чтобы не думать о соглашениях о вызове этих процедур.
1
|
41 / 41 / 36
Регистрация: 23.11.2006
Сообщений: 153
|
|
11.01.2017, 10:10 [ТС] | 3 |
Премного благодарен за науку! Теперь понял в каком направлении надобно двигаться. С Ассемблером пока ещё на "Вы" и не приходилось использовать его вставки в программный код языков высокого уровня.
0
|
539 / 399 / 99
Регистрация: 18.08.2012
Сообщений: 1,024
|
|
11.01.2017, 12:52 | 4 |
Есть процедуры get_pm_interrupt() и set_pm_interrupt().
Для них имеется специальный тип данных tseginfo. Кроме того, нужно использовать внешнюю переменную external name '___v2prt0_ds_alias' для инициализации регистра DS в самом обработчике прерываний. А если программа будет работать не из под ВИНДЫ, то можно обработчик запихнуть непосредственно в IDT.
0
|
Модератор
|
|
11.01.2017, 16:32 | 5 |
Dmitrinik, я читал в документации FPC, а также в документации TMT Pascal о реализации пользовательских обработчиков аппаратных прерываний при работе в защищённом режиме (под экстендером). Но необходимости подробно изучать у меня не возникало.
Поэтому, если вы это умеете - реализуйте задание топикстартера (ТС) на FPC for DOS. Заодно и пример будет. Под DOS - т.к. под Windows только драйверы работают с аппаратными прерываниями. Не по теме: Я реализовал на TurboPascal потому, что ТС неуверенно пользуется ассемблером, прерываниями в RM, что же говорить о PM. Делаю вывод, что в раздел FreePascal вопрос попал случайно, из-за работы ТС именно в FPC, хотя по программе в учебном заведении изучается TurboPascal.
0
|
Модератор
|
||||||
11.01.2017, 21:25 | 6 | |||||
ФедосеевПавел,
строго говоря, в реальном режиме вектор $1C обработчиком аппаратного прерывания не является. Далее, в отношении обработчика аппаратного прерывания тоже возможны варианты: 1) мы зовем оригинальный обработчик, он сообщит контроллеру о завершении обработки аппаратного прерывания, 2) мы НЕ зовем оригинальный обработчик и сами сообщаем контроллеру о завершении обработки аппаратного прерывания -- помимо управления процессором (CLI/STI), не забываем пообщаться с периферией
1
|
Модератор
|
|
12.01.2017, 00:04 | 7 |
Да, спасибо. Но это уже детали.
Если возвращать управление старому обработчику, то int 08h не отличается от int 1Ch. Только, если не возвращать - тогда разница проявится. Не по теме: Я хотел взять "на слабо" Dmitrinik - поджучивает странными сообщениями, а выдать код под cwsdpmi, обрабатывающий аппаратное (08h) или пользовательское (1Ch) прерывание - сил нет.
1
|
2386 / 1298 / 1492
Регистрация: 29.08.2014
Сообщений: 4,661
|
|
12.01.2017, 12:01 | 8 |
извиняюсь за идиотский вопрос fptimer не вариант?
0
|
Модератор
|
||||||
12.01.2017, 19:34 | 9 | |||||
Судя по
и _GetTickCount в строке 225
0
|
12.01.2017, 19:34 | |
12.01.2017, 19:34 | |
Помогаю со студенческими работами здесь
9
Обработка прерываний Обработка запросов прерываний Обработка запросов прерываний Обработка прерываний таймера Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |