Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО кр.DOC
Скачиваний:
32
Добавлен:
26.05.2014
Размер:
117.25 Кб
Скачать

Rtx – расширение реального времени для Windows nt. Возможность использования Windows nt в качестве ос реального времени.

В Windows NT доступ к прерываниям осуществляется из драйвера ядра, а сами прерывания обрабатываются в два этапа: сначала вызывается очень короткая Interrupt Service Routine (ISR), осуществляющая критическую обработку, основная обработка прерывания происходит в Deferred Procedure Call (DPC). Все DPC выполняются с одинаковым уровнем приоритета в порядке поступления (FIFO).

Bремя окончания обработки DPC оказывается зависимым непредсказуемым образом от наличия в системе других драйверов и их активности. Для систем с жестким детерминизмом необходимо точно знать максимальное время от момента возникновения прерывания до входа в процедуру обработки и гарантировать его не превышенее.

Rtx - real-time расширение для Windows nt.

Одним из возможных решений является использование совместно с Windows NT подсистемы реального времени, исполняющейся на том же процессоре (если процессор один) или на выделенном процессоре(-ах) (если их несколько). Этот подход использован фирмой VenturCom в продукте RTX (Real Time Extension). Сущность подхода заключается в использовании модифицированного HAL (Hardware Abstraction Level). Изменять kernel Microsoft не разрешает, а исходный код HAL предоставляет своим партнерам, одним из которых является VenturCom.

После установки RTX стандартная NT Workstation или Server превращается в операционную систему реального времени с жестким детерминизмом (hard real-time). Сама NT об этом, правда, не подозревает. Ни ядро, ни исполняющая подсистема NT не были изменены. Подсистема реального времени видна из Windows NT, как еще один драйвер устройства. Схема функционирования RTX в составе Windows NT представлена на рисунке.

В системе появляется планировщик задач реального времени. Новый HAL по прерыванию от часов реального времени передает управление этому планировщику, который следит за очередью задач реального времени, находящихся в системе и выделяет им время в соответствии с приоритетом. В RTX существует 128 фиксированных приоритетов для задач реального времени. Если в очереди таких задач нет, то управление передается стандартному планировщику NT. При этом времена исполнения кодов модифицированного и оригинального HAL совпадают, т.е. присутствие RTX не сказывается на производительности Windows в отсутствие real-time процессов. Однако, если real-time процессы будут занимать все процессорное время, то Windows NT не получит управления и окажется подвешенной. В принципе, если данная ситуация не входит в планы разработчика, ее можно предупредить, установив в опциях настройки RTX "сторожевой" таймер, срабатывающий, если один поток занимает CPU больше определенного времени.

Управление памятью. Выделение системной памяти.

Часто процессу требуется выделить дополнительную память. Функции выделения памяти, существующие в RTX, всегда выделяют блокированную (locked) память, исключая, таким образом, задержки, связанные с ошибками страниц (page faults).

API выделения памяти

Следующие функции служат для доступа к системе выделения памяти RTX:

RtAllocateLockedMemory –

выделяет блокированную память, которой соответствует физическая память, затем проецирует память в виртуальное адресное пространство процесса.

RtFreeLockedMemory –

высвобождает предварительно выделенный блокированный участок памяти.

Замечания по выделению памяти

Блокированная память всегда выделяется из non-paged пула памяти Windows NT. Этот пул памяти сравнительно мал и вскоре после загрузки системы становится фрагментированным в результате выделения памяти драйверам и другим подсистемам Windows NT. Чтобы избежать неудач при попытках выделить большой участок памяти, надо делать это сразу после загрузки и/или вообще минимизировать такие выделения.

Использование функции выделения блокированной памяти:

#include <windows.h>

#include <stdio.h>

#include <rtapi.h>

static PVOID vAddress; // virtual memory address returned by

RtAllocateLockedMemory

void main(void) {

// Allocate memory

vAddress = RtAllocateLockedMemory(size);

if (!vAddress) {

printf("\nFailure on RtAllocateLockedMemory\t");

printf("Error=%d\n", GetLastError());

break; // if this fails - no use to continue

}

else {

printf("\nSuccess on RtAllocateLockedMemory\n");

printf("Virtual memory address = 0x%08X\n", vAddress);

// Write to the memory

*vAddress= 0;

}

// Free memory

if (!RtFreeLockedMemory(vAddress)) {

printf("\nFailure on RtFreeLockedMemory(0x%08X).\t",

vAddress);

printf("Error Code = %d\n", GetLastError());

}

else {

printf("Success on RtFreeLockedMemory(0x%X).\n",

vAddress);

}

ExitProcess(0);

}