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

 
 
> Прерывания (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 27 2005, 05:01
Сообщение #2





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



На самом деле енавле и дизабле хоть ставь хоть нет эффект тотже. Сначала их не было, потом начал всякие эксперименты ставить. Так что проблема не в этом sad.gif
Go to the top of the page
 
+Quote Post
-Tумблер-
сообщение Apr 27 2005, 11:38
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 146
Регистрация: 4-11-04
Из: Московская область
Пользователь №: 1 040



Цитата(rmihail @ Apr 27 2005, 08:01)
На самом деле енавле и дизабле хоть ставь хоть нет эффект тотже. Сначала их не было, потом начал всякие эксперименты ставить. Так что проблема не в этом  sad.gif


Эффект все-таки "не тот же".
По крайней мере процедура выполняется медленнее.
Кроме того, результат в таких случаях носит вероятностный
характер.
"Это надо знать точно". Ни понять, не заосциллографировать
(чуть язык не сломал smile.gif ) тут ничего не удасться.

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

enable(); // востановление прерываний

Это не будет работать потому, что энейбл и дизэйбл - это
разрешение/запрещение прерываний центральному процессору.
Кстати, лучше делать так:

asm sti; // enable
asm cli; // disable

Но система прерываний (в Вашей программе) не приведена в исходное
состояние. Это значит, никаких прерываний не будет .Независимо
от их разрешения.

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

А вот это, видимо, Ваша проблема.
Дело в том, что прерывания "активизируются" командой INTx.
Вот как она работает:
asm pushf; !!
asm cli;
asm call dword ptr [4*x]

А заканчивается прерывание командой IRET, которая:
asm pop ip
asm pop cs
asm popf

Точнее вы и сами можете почитать. <_<

Поэтому нельзя просто так вызвать старый обработчик.
надо что-то вроде:
asm pushf;
OldVector ();

При этом надо быть уверенным, что адрес старого обработчика
спасен как (far *)

Я бы посоветовал вам сделать (для начала) прерывание по рыбе:
void interrupt some_routine (void)
{
// для начала сбросим систему прерываний:
RESET_MASTER_IC // это outportb (0x20,0x20);
// RESET_SLAVE_IC // это outportb (oxA0,0x20); - если используется слэйв
.
.
// тело обработчика
.
.
}

И фсе !
Если это будет работать устойчиво, тогда можно будет ставить
еще эксперименты.

excl.gif В любом случае, все операции с контроллерами прерываний
должны производиться когда DISABLE !!!!! excl.gif
smile.gif


--------------------

- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
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
- - rmihail   Вобще под "чистым" досом с записью работ...   Apr 21 2005, 09:53
|- - vvs157   Цитата(rmihail @ Apr 21 2005, 12:53)  ...   Apr 21 2005, 14:26
||- - rmihail   Цитата(vvs157 @ Apr 21 2005, 17:26)А зачем Вы...   May 11 2005, 10:18
|- - -Tумблер-   Цитата(rmihail @ Apr 21 2005, 12:53)void inte...   Apr 26 2005, 12:36
|- - 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 Текстовая версия Сейчас: 18th June 2025 - 01:55
Рейтинг@Mail.ru


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