Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Обработчик прерывания в DOS  (Прочитано 5944 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Tuborg
Команда клуба

ee
Offline Offline

« : 24-05-2007 11:26 » 

Помогите хотя бы основной идеей... а то мозги закипают, глаз замылился... бубен порван =)

Есть основной цикл программы, а-ля:
Код:
 while(!AppTermination){

    DataSend(buf, 512);
    outport(0x334,1);

 }

Есть обработчик прерывания от оборудования по IRQ6:

Код:
void __far interrupt BITC_ISA_Event(void){
       rcvr_state stat;
       stat.value=inport(0x324);

        if (stat.kr){
            flushBuffer(buf);
            for (i=0; i<512;i++) buf[i]=inport(0x330);
        }

        oldHandler();
}

То бишь на прерывание считываем буфер.... в основном цикле его выплёвываем по UDP (DataSend).
командой outport(0x334,1); - говорим оборудованию, что прерывание обработали (снимаем сигнал прерывания с шины).

Что происходит на практике - ловлю я эту всю красоту на другой машине Снифером Ethernet'a... В том варианте который написан выше... пакеты приходят через каждые 0.128 секунд (128 милисекунд),
Если же я DataSend и outport (0x344,1) перенесу в обработчик прерывания, то пакеты начинают приходить через каждые 10 миллисекунд. Основной цикл программы ничего кроме указанных двух комманд не содержит.

Почему DataSend в обработчике срабатывает чаще чем в основном цикле?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 24-05-2007 11:38 » 

Tuborg, подумай о синхронизации - это ведь, практически, параллельные задачи.
Если outport(0x334, 1) у тебя инициирует процесс передачи данных, то я бы поместил его в конце обработчика и перед циклом. В цикле я бы добавил что-нибудь проде halt для синхронизации с прерываниями и чтоб энергию зря не кушать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #2 : 24-05-2007 11:49 » 

спасибо попробую
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines