3c05a905

Сторожевой таймер


Ситуация, когда единственный RTSS-поток полностью владеет CPU, чаще всего возникает в результате логической ошибки в программе (что бывает на стадии разработки). Когда единственный RTSS-поток полностью владеет CPU на однопроцессорной системе функционирование Windows NT прекращается. В системе с несколькими процессорами Windows NT продолжает работь, но не может остановить RTSS-поток, владеющий CPU, из-за того, что потоки Service Request Interrupt (SRI) менеджера, имеющие более низкий приоритет, не запустятся.

Работа со сторожевым таймером

Для вышеописанной ситуации можно использовать сторожевой таймер RTX (watchdog timer). При каждом прерывании от таймера (обычно такие прерывания разрешены) этот таймер проверяет, не исполняется ли один и тот же поток (за исключением Windows NT idle thread). При срабатывании сторожевого таймера поток-нарушитель будет остановлен, появится окошко с сообщением о возникшей ошибке, и возобновится нормальная работа Windows NT. Для выгрузки остановленного процесса можно использовать утилиту RTSSkill.

Установка периода сторожевого таймера

Можно устанавливать т.н. Starvation Time Out период (период сторожевого таймера) из контрольной панели RTX или с помощью ключа

HKLM\System\CurrentControlSet\Control\RTX\StarvationTimeOut

в регистре и последующей перезагрузки.

Значения для ключа:

0 – запрет сторожевого таймера


N – (миллисекунд) разрешает сторожевой таймер и устанавливает период (обычно период составляет несколько секунд или десятков секунд).

Замечания по программированию

Программа может вести себя правильно, но все же иметь один или несколько потоков, которые на определенные промежутки времени занимают CPU. В таких случаях, в этих промежутках Вы можете периодически выделять небольшие отрезки времени для работы Windows NT. Это может потребоваться, например, для того, чтобы Windows NT очистила буфер RS232 UART, обслужила сетевые запросы, совершила дисковые операции, переместила указатель мыши или отобразила что-либо в GUI. Т.к. реально требуемое поведение может быть очень сложным, бессмысленно требовать, чтобы RTX непосредственно управлял выделением Windows NT временных отрезков.

Можно легко справиться с этой ситуацией, создав обработчик таймера, который периодически подвешивает владеющие CPU поток(и) на короткий промежуток времени. Рассиотрим, например, приложение, запускающее каждую секунду поток продолжительностью 100 миллисекунд. Можно подвешивать этот поток на 0.5 миллисекунд каждые 10 миллисекунд. Вообще, можно создать сколь угодно сложный или простой алгоритм для предотвращения перегрузки системы. Обычно пять процентов времени на работу системы является разумной начальной величиной. Затем можно измерять перегрузку и изменять алгоритм.

Другой подход заключается в простом включении вызовов Sleep, что должно дать небольшое количество времени Windows NT в процессе работы Вашего приложения.



Содержание раздела