150 likes | 367 Views
СиÑтема реального времени. QNX/Neutrino (QNX6). QNX. МикpоÑдеpÐ½Ð°Ñ CÐµÑ‚ÐµÐ²Ð°Ñ ÐœyÐ»ÑŒÑ‚Ð¸Ð·Ð°Ð´Ð°Ñ‡Ð½Ð°Ñ ÐœÐ½Ð¾Ð³Ð¾Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒcкаÑ. ОÑобенноÑти QNX6 (vs QNX4). Ð¿Ð¾Ð»Ð½Ð°Ñ cовмеcтимоcÑ‚ÑŒ c POSIX - cтандатами; планиpование идет междy потоками ( threads ); поддеpжка мyльтипpоцеccоpных аpхитектyp
E N D
Система реального времени QNX/Neutrino (QNX6)
QNX • Микpоядеpная • Cетевая • Мyльтизадачная • Многопользовательcкая
Особенности QNX6 (vs QNX4) • полная cовмеcтимоcть c POSIX - cтандатами; • планиpование идет междy потоками (threads); • поддеpжка мyльтипpоцеccоpных аpхитектyp • механизм Send-Receive-Reply теперь требует установления канала между потоками • Базовая сущность – это менеджеpы pеcypcов • гpафичеcкая оболочка Photon 2.0
Аппаратные требования • x86, PowerPC, MIPS, SH-4, ARM, StrongARM, XScale. • 64M памяти & диск 600 Мбайт • конечные cиcтемы могyт pаботать вообще без диcка. • Для разработки: • 256Mбайт RAM 1.5Гбайт диcк
Архитектура • QNX состоит из небольшого ядра и набора менеджеров ресурсов (процессов) Process manager Filesystem mgr Микро Ядро Device manager Network mgr
Синхронизация • Обмен сообщениями (MsgSend/Receive) • Мутексы(mutex) • Семафоры (semaphore) • Барьеры (barrier) • Блокировки чтения/записи (r/w locks) • Ждущие блокировки (sleepons) • Условные переменные (cond variables)
Client int coid = ConnectAttach (0, 77, 1, 0, 0); MsgSend(coid, smsg, s_len, rmsg, r_size); Server int chid = ChannelCreate(0); rid = MsgRecive(chid, m, m_size, 0); ….. MsgReply(rid, sts, m, m_len); Обмен сообщениями
Send/Recive sts = MsgSend(coid, smsg, sbytes, rmsg, rbytes) rid=MsgRecive(chid, rmsg, rbytes, 0); MsgReply(rcvid, sts, smsg, sbytes);
Семафоры (POSIX) <semaphore.h> • int sem_init(sem_t *sem, int pshared, unsigned int value);int sem_destroy(sem_t * sem);Инициализация/удаление семафора <sem>. <pshared> = 0 <value> – Начальное значение семафора. • int sem_getvalue(sem_t * sem, int * val);Возвращает текущее состояние <val> семафора <sem>. • int sem_post(sem_t * sem);Установка семафора (+1). • int sem_wait(sem_t * sem);Ожидает ненулевого значения семафора. При вызове функции значение семафора уменьшается на единицу. • int sem_trywait(sem_t * sem);Неблокирующие ожидания ненулевого значения семафора.
Мутексы (POSIX) <pthread.h> • int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);int pthread_mutex_destroy(pthread_mutex_t *mutex);Создание/удаление мутекса. • int pthread_mutex_lock(pthread_mutex_t *mutex);int pthread_mutex_unlock(pthread_mutex_t *mutex);Захват/освобождение мутекса. Если мутекс уже захвачен - поток блокируется до освобождения. • int pthread_mutex_trylock(pthread_mutex_t *mutex);Попытка захвата мутекса без блокировки Если семафор занят возвращается «BUSY».
Условные (сигнальные переменные) int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);int pthread_cond_destroy(pthread_cond_t *cond);создание/удалении условной переменной <cond>. int pthread_cond_signal(pthread_cond_t *cond);int pthread_cond_broadcast(pthread_cond_t *cond);Разблокирует один/все потоки ожидающие условную переменную • int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *time);Блокирует текущий поток на базе мутекса до изменения условной переменной <cond> с таймаутом <time>.
RW-lock • int pthread_rwlock_init(pthread_rwlock_t * lock, const pthread-rwlockattr_t * attr); • int pthread_rwlock_destroy(pthread_rwlock_t * lock); • int pthread_rwlock_rdlock(pthread_rwlock_t * lock); • int pthread_rwlock_wrlock(pthread_rwlock_t * lock); • int pthread_rwlock_tryrdlock(pthread_rwlock_t * lock); • int pthread_rwlock_trywrlock(pthread_rwlock_t * lock);
while(!data_ready) { phtread_sleepon_wait (&data_ready); } pthread_sleepon_lock(); data_ready = 1; pthread_sleepon_signa l(&data_ready); pthread_sleepon_unlock(); Ждущие блокировки
Барьеры • barrier_init(&barrier, 0, 3); • barrier_wait(&barrier);