реклама на сайте
подробности

 
 
> Прерывания (help)
rmihail
сообщение Apr 21 2005, 03:45
Сообщение #1





Группа: Новичок
Сообщений: 10
Регистрация: 20-04-05
Пользователь №: 4 305



Пишу прогу на c++, переопределяю прерывание от системного таймера на функцию например NewInt08(...). Устанавливаю частоту таймера
( outportb( 0x40, (char) cnt );
outportb( 0x40, (char)( cnt >> 8 ) ); ).
Т.е. функция обработчик прерывания NewInt08(...) вызывается с той частотой с которой мне нужно (например 160 Hz). В обработчике снимаются данные и записываются на диск.
Всё вродеб хорошо, но возникает проблема. Например при 160Hz после 100минут всё виснет наглухо. cranky.gif Если убрать запись на диск, то программа проработала 5 часов без сбоев, далее просто выключил.
Вопрос, в чём проблема? Не успевают обрабатыватся и записыватся данные и стек прерываний со временем переполняется? тогда можно ли его очищать?
Или недопустимо записывать данные из прерываний? Тогда почему и какие могут быть решения проблемы?
Пробовал уменьшать частоту при 150hz работает минут 140, при 100hz жадл 3 часа потом выключил.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rmihail
сообщение Apr 21 2005, 09:53
Сообщение #2





Группа: Новичок
Сообщений: 10
Регистрация: 20-04-05
Пользователь №: 4 305



Вобще под "чистым" досом с записью работает гораздо меньше времени, чем под виндой. Без записи работает отлично.
"Точно знаю, что запись как таковая всегда откладывается до заполнения некоего буфера - отсюда и тормоза." Так и есть, даже судя по диоду обращения к жёсткому диску. Т.е. стоит попробовать заставить данные записыватся на диск каждые 160hz?

Скомпилял под Borland C++ v5.02, эффект примерно такойже.

"Старый вектор обрабатываете до или после своего модуля?"
Старый вектор обрабатывается после моей процедуры.
Вот урезанный код обработки прерывания.
void interrupt NewInt08(...)
{
static cnt = 0;
disable(); // запрет прерываний

cnt++; // считаем сколько пропускать до вызова старого обработчика

readallchannel(); // функция считывания и записи данных с АЦП

if ( cnt >= BIOSTimerSpeed ) // true => вызвать старый обработчик
{

gettime (&t); // читаем текущее время
docommonwrite( (char *) &t,4,'t'); // запись текущего времени
cnt = 0;

enable(); // востановление прерываний
SvInt08(); // вызов старого обработчика прерывания

}
else
{
enable(); // востановление прерываний
outportb(0x20,0x20); //конец прерывания
}

}

Возникла идея обрабатывать повешать флаг на считывание новых данных и старый обработчик вызывать раньше. В этом случаем новые прерывания по идеи должны пропускатся, либо вызыватся только старый обработчик.
Go to the top of the page
 
+Quote Post
vvs157
сообщение Apr 21 2005, 14:26
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(rmihail @ Apr 21 2005, 12:53)
      enable();                      // востановление прерываний
      outportb(0x20,0x20);      //конец прерывания
    }

}

*


А зачем Вы контроллер превываний дергаете перед выходом?. Это же уже сделано в старом обработчике. По-моему (могу ошибаться) прерывания с диска имеют более высокий приоритет, чем таймер. Поэтому запрет прерываний в таймерной секции с последующим EOI по-моему может при определенном стечении обстоятельств вызвать потерю прерывания с диска. Попробуйте убрать обращение к контроллеру преряваний.
Go to the top of the page
 
+Quote Post
rmihail
сообщение May 11 2005, 10:18
Сообщение #4





Группа: Новичок
Сообщений: 10
Регистрация: 20-04-05
Пользователь №: 4 305



Цитата(vvs157 @ Apr 21 2005, 17:26)
А зачем Вы контроллер превываний дергаете перед выходом?. Это же уже сделано в старом обработчике. По-моему (могу ошибаться) прерывания с диска имеют более высокий приоритет, чем таймер. Поэтому запрет прерываний в таймерной секции с последующим EOI по-моему может при определенном стечении обстоятельств вызвать потерю прерывания с диска. Попробуйте убрать обращение к контроллеру преряваний.
*

Т.к. прерывания от таймера у меня возникают не 18.2 раза в секунду, а столько сколько мне нужно
(в зависимости от count:
outportb( 0x40, (char) count);
outportb( 0x40, (char)( count >> 8 ) );
задаётся частота возникновения прерываний от таймера),
то и стандартный обработчик таймера я вызываю не всегда. В переменной BIOSTimerSpeed хранится число прерываний котороые я должен пропустить прежде чем вызвать стандартный обработчик.

if ( cnt >= BIOSTimerSpeed )
{
cnt = 0;
SvInt08();

}
else
{
outportb(0x20,0x20);
}

Поэтому, если не вызван стандартный обработчик то нужно outportb(0x20,0x20);
Прерывание с диска имеют более низкий приоритет, чем от таймера. Однако возможно изменение приоритетов в рамках приоритетного кольца. Попробую поизменять приоритеты...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- rmihail   Прерывания (help)   Apr 21 2005, 03:45
- - sK0T   Куда катиться этот мир?! Программы для МК на C...   Apr 21 2005, 04:36
- - nameless   Вот так я делал...работало всегда (старый добрый B...   Apr 21 2005, 07:43
- - vvs157   Цитата(rmihail @ Apr 21 2005, 06:45)Пишу прог...   Apr 21 2005, 08:53
- - rmihail   1) о каком контроллере идёт речь в Вашем сообщении...   Apr 21 2005, 08:55
|- - vvs157   Цитата(rmihail @ Apr 21 2005, 11:55)1) о како...   Apr 21 2005, 09:16
|- - sK0T   Цитата(rmihail @ Apr 21 2005, 12:55)Куда кати...   Apr 21 2005, 10:17
|- - dxp   Цитата(sK0T @ Apr 21 2005, 16:17)Цитата(rmiha...   Apr 21 2005, 10:50
|- - -Tумблер-   Цитата(rmihail @ Apr 21 2005, 12:53)void inte...   Apr 26 2005, 12:36
- - rmihail   На самом деле енавле и дизабле хоть ставь хоть нет...   Apr 27 2005, 05:01
|- - -Tумблер-   Цитата(rmihail @ Apr 27 2005, 08:01)На самом ...   Apr 27 2005, 11:38
|- - rmihail   Цитата(-Tумблер- @ Apr 27 2005, 14:...   May 11 2005, 10:46
- - Vitёk   В своё время делал примерно такую же вещь, как у В...   May 11 2005, 11:06
- - rmihail   Да, очень интересно. Если можно выложите плизз сюд...   May 12 2005, 02:38
- - VAI   Я с такой проблемой сталкивался лет 15 назад. Задо...   May 12 2005, 04:00
- - Vitёk   Выкладываю. Там всё написано без комментариев, по...   May 12 2005, 06:49
- - rmihail   Цитата(Vitёk @ May 12 2005, 09:49)Выкладываю....   May 13 2005, 08:03


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 11:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01417 секунд с 7
ELECTRONIX ©2004-2016