сбой — Borland C ++ вылетает без сообщения

Я не уверен, что кто-то использует Borland c ++ 3.1, но я должен это сделать.

У меня есть программа, которая реализует простые потоки и изменяет контекст этих потоков с помощью прерывания по таймеру.

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

Иногда это работает на полминуты и просто перестает писать то, что должно. Запись просто останавливается, ошибки нет, и borland не падает.
Иногда это останавливается, и Borland падает без сообщения.
Иногда он останавливается, и Borland вылетает с сообщением «недопустимая инструкция». Иногда в последней строке записывается, прежде чем он останавливается, какие-то странные символы, которые не должны выводиться.

Это консоль, которая «полна» и borland действует странно?
В чем может быть проблема?

1

Решение

Если я правильно помню, было небезопасно писать на консоль (или использовать файловый ввод / вывод) под DOS при вызове из прерывания. Чтобы сделать это правильно, вы должны проверить что-то под названием «Флаг повторного входа DOS» и записывать в консоль только в том случае, если оно равно нулю (см. http://cs.smith.edu/~thiebaut/ArtOfAssembly/CH18/CH18-3.html или поиск в Интернете для получения дополнительной информации)

1

Другие решения

В реальном и виртуальном режимах 8086 программы не защищены друг от друга. Итак, если ваша программа что-то испортила, например:

  1. перезаписывает память, которая не принадлежит ему (или соответствующему потоку сама по себе), включая повреждения памяти из-за переполнения стека в программе или ее ISR
  2. не в состоянии сохранить (= сохранить, затем восстановить) регистры процессора в любом из его ISR
  3. меняет состояние оборудования на что-то неожиданное для остальной системы
  4. изменяет частоту таймера очевидным для остальных системных способов

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

Я предполагаю, что у вас есть проблемы 1 и / или 2 выше. Вы также можете участвовать в гонке.

К сожалению, не видя ни одного вашего кода, мы не можем больше помочь. Подумайте об этом, это все равно что лечить нового пациента по телефону.

0