В этом разделе обсуждается следующие темы:
Процесс, исполняющийся в RTSS, состоит из набора хэндлов объектов, адресного пространства процесса, по меньшей мере одного потока и исполняемого файла. При создании процесса RTSS выполняет следующие действия:
Процессы, выполняющиеся подсистеме
Win32, начинают взаимодействовать с RTX, когда они вызывают функции RTAPI.
Такой вызов связывает процесс с rtapi_w32.dll. После этого RTX может выделять
ресурсы для этого процесса, изменять его приоритет и т.д. Число Win32 процессов,
которое может взаимодействовать с RTX, непостоянно – оно зависит от конфигурации
системы и свободных ресурсов.
Функция CreateThread создает либо RTSS, либо Win32 поток, в зависимости от текущей исполняющей подсистемы процесса. Возвращаемый хэндл и ID потока действителен только в окружении, вызвавшем CreateThread. Например, Win32 процесс не может управлять приоритетом RTSS потока, потому что хэндл этого потока действителен только в RTSS подсистеме. Вы можете, однако, использовать средства межпроцессного взаимодействия (Inter-Process Communication,IPC), предоставляемые RTX – такие как mutex, semaphore, events и shared memory – для синхронизации и коммуникации между Win32 и RTSS процессами и потоками. См. раздел “Межпроцессное взаимодействие”.
Объекты таймеры и прерывания
Объекты-таймеры и прерывания происходят от потоков, следовательно, хэндлы этих объектов действительны только в их собственной (Win32 или RTSS) среде. Аналогично, этими объектами можно управлять только из процессов в их собственной среде.
RTSS подсистема
Единицей исполнения в подсистеме RTSS является поток. Готовый к исполнению RTSS-поток получает приоритет над всеми Win32 потоками. RTSS-поток исполняется до тех пор, пока он не освободит CPU. Поток освобождает CPU, когда он:
RTSS подсистема
RTSS подсистема не имеет понятия классов приоритетов, поэтому потоки всех RTSS-процессов состязаются за процессорное время только на основании приоритетов потоков. Поток в RTSS может иметь один из 128 уровней приоритета. Потоки выполняются в соответствии с приоритетом, а потоки одного приоритета – по принципу FIFO (first in-first out). Потоки не квантуются по времени. Это означает, что исполняющийся поток будет выполняться, до тех пор, пока не освободит CPU или внешнее событие не подготовит поток с более высоким приоритетом. Планировщик RTSS использует протокол продвижения приоритета для предотвращения инверсии приоритетов.
Win32 подсистема
Win32 RTX программа начинает исполняться в real-time классе приоритета. RTX обеспечивает соответствие между приоритетами в Win32 и RTSS. Однако, планировщик Win32 не исключает инверсии приоритетов.
В таблице 1 показано, как имена приоритетов RTSS транслируются в приоритеты Win32 при вызове функции RtSetThreadPriority из Win32 программы.
Таблица 1.
RTSS Symbolic Priority Name | RTSS Value | Windows NT Symbolic Priority Name for Real-Time Priority Class | Win32 Value |
RT_PRIORITY_MIN | 0 | THREAD_PRIORITY_IDLE | 16 |
RT_PRIORITY_MIN + 1 | 1 | THREAD_PRIORITY_LOWEST | 22 |
RT_PRIORITY_MIN + 2 | 2 | THREAD_PRIORITY_BELOW_NORMAL | 23 |
RT_PRIORITY_MIN + 3 | 3 | THREAD_PRIORITY_NORMAL | 24 |
RT_PRIORITY_MIN + 4 | 4 | THREAD_PRIORITY_ABOVE_NORMAL | 25 |
RT_PRIORITY_MIN+ 5 …+ 126 | 5…126 | THREAD_PRIORITY_HIGHEST | 26 |
RT_PRIORITY_MAX | 127 | THREAD_PRIORITY_TIME_CRITICAL | 31 |
Например, вызов RtSetThreadPriority(Thread,RT_PRIORITY_MIN+1) преобразуется в SetThreadPriority(Thread, THREAD_PRIORITY_LOWEST)
Если Win32 программа вызывает RtGetThreadPriority(), возвращается real-time приоритет, указанный в вызове RtSetThreadPriority().
В таблице 2 показано, как преобразуются вызовы Win32 “set” и “get” в RTSS подсистеме.
Таблица 2.
Windows NT Symbolic Priority Name for Real-Time Priority Class | Win32 Value | RTSS Symbolic Priority Name | Value |
THREAD_PRIORITY_IDLE | 16 | RT_PRIORITY_MIN | 0 |
THREAD_PRIORITY_LOWEST | 22 | RT_PRIORITY_MIN + 1 | 1 |
THREAD_PRIORITY_BELOW_NORMAL | 23 | RT_PRIORITY_MIN + 2 | 2 |
THREAD_PRIORITY_NORMAL | 24 | RT_PRIORITY_MIN + 3 | 3 |
THREAD_PRIORITY_ABOVE_NORMAL | 25 | RT_PRIORITY_MIN + 4 | 4 |
THREAD_PRIORITY_HIGHEST | 26 | RT_PRIORITY_MIN + 5 | 5 |
THREAD_PRIORITY_TIME_CRITICAL | 31 | RT_PRIORITY_MAX | 127 |
Между THREAD_PRIORITY_IDLE и THREAD_PRIORITY_HIGHEST нет других уровней приоритетов. Если необходим более широкий набор приоритетов в этом диапазоне, надо использовать спектр приоритетов RTSS.
Назад | Содержание | Вперед