|
|
  |
Реальное время в Linux user space, Сколько оно нереально? |
|
|
|
Jun 22 2006, 10:06
|
Группа: Новичок
Сообщений: 6
Регистрация: 19-12-05
Пользователь №: 12 389

|
Цитата(Evgeny_CD @ Jun 22 2006, 13:26)  Цитата(bigirbis @ Jun 22 2006, 11:17)  Вообще, по моему скромному мнению, следует внести опрос портов IO в kernel space с последующей записью в файл устройства. А далее из user space жрать из этого файла устройство все, что надо. Это правильно, но есть одна загвоздка - надо уметь писать программы для kernel space. В принципе, ничего сложного. Могу порекомендовать переводную книгу по этой теме: http://www.nclug.ru/wiki/index.php?page=knz_ldd2 (Linux Device Drivers 2nd edition) Если надо - приаттачу простой код Цитата(Olej @ Jun 22 2006, 13:32)  Цитата(bigirbis @ Jun 22 2006, 10:17)  Вообще, по моему скромному мнению, следует внести опрос портов IO в kernel space с последующей записью в файл устройства. А далее из user space жрать из этого файла устройство все, что надо.
... вот только в user space до этого нужно ждать (может и до бесконечности) RUNNING и доступа к этому файлу устройства  ... Тогда все нужно описывать в kernel space и уповать, что проца хватит (в должном объеме) и на эту нитку тоже... Судя по постановке задачи, жрущих процессорное время в 3 горла процессов нет, да и активируются они редко. Тогда: 1) если не очень принципиальны редкие задержки - разделить код на User и Kernel Space 2) если очень принципиально - все в kernel space. Хочу также обратить внимание на "быструю" и "долгую" обработку прерываний в Linux.
|
|
|
|
|
Jun 22 2006, 18:22
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 2 065
Регистрация: 11-01-05
Из: Москва
Пользователь №: 1 892

|
Цитата(Harbour @ Jun 22 2006, 20:00)  Нет, не надо - user space realtime это уже давно прошедший этап в RTAI. Я помню про RTAI - с Вашей подачи познакомился с этим чудом с полгода назад. Но он есть далеко не для всех процов! Для "народного" AT91RM9200 нету. Для PXA270 свободного не видел. Вот тут хотят 300 евро, причем за image - непонятно, как там насчет GPL и исходников... http://www.vollmann.ch/en/colibri/shop.html#pro_supportДля Cirrus EP93xxx RTAI есть - но не тянет меня на эти процы по ряду причин. Цитата(bigirbis @ Jun 22 2006, 14:06)  В принципе, ничего сложного. Могу порекомендовать переводную книгу по этой теме: http://www.nclug.ru/wiki/index.php?page=knz_ldd2 (Linux Device Drivers 2nd edition) Если надо - приаттачу простой код Спасибо за желание помочь - это очень приятно. LDD2, LDD3 у меня есть, с "техническим" английким проблем не испытываю. Есть даже переведенная книжка Померанца по программированию kernel module. Но как-то стремно нырять в этот омут. Цитата(bigirbis @ Jun 22 2006, 14:06)  Тогда все нужно описывать в kernel space и уповать, что проца хватит (в должном объеме) и на эту нитку тоже... Судя по постановке задачи, жрущих процессорное время в 3 горла процессов нет, да и активируются они редко. Тогда: 1) если не очень принципиальны редкие задержки - разделить код на User и Kernel Space 2) если очень принципиально - все в kernel space. Я хотел вариант lite написать в user space (при помощи всяких внешних аппаратных ухищрений доведя допустимую девиацию до 100 мс), а затем, по мере набора опыта, перетащить полностью или целиком в kernel space.
|
|
|
|
|
Jun 23 2006, 08:18
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(Evgeny_CD @ Jun 22 2006, 21:22)  Я хотел вариант lite написать в user space (при помощи всяких внешних аппаратных ухищрений доведя допустимую девиацию до 100 мс), а затем, по мере набора опыта, перетащить полностью или целиком в kernel space. Я бы так и делал, и, может оказаться, не только в lite, но и в конечном варианте... Я не скажу наверняка, как это будет в Linux (я это не проверял), но в QNX - разумно распорядившись приоритетами, можно гарантировать, что время начала операции будет плавать между 2-4 ticksize ... но всё, что касается диспетчеризации, вытеснения + деталей отработки службы времени (а там всё совсем не очевидно) - это всё регламентируется моделями POSIX, а одна и другая ОС в той или иной мере пытаются следовать POSIX. Мне кажется, что при ticksize=10мс. вы должны определённо вписаться в 100мс. интервал, если обезопаситься от всех неожиданностей + разумно распорядиться приоритетами + использовать только статические приоритеты при RR диспетчеризации (это те, кторые RT - об этом хорошо растолковывается в такой книжке "Ядро LINUX с комментариями" ... или как-то так - нет под рукой). Потом результат можно легко проверить на адекватность ... и у вас ещё остаётся возможность переопределить в ядре ticksize в сторону уменьшения. P.S. в конечном счёте, если это серьёзная нужда и не лень повозиться, я готов специально найти, вырезать и выслать из книжки: http://www.books.ru/shop/books/357604- раздельчик, где специально ставилась задача синхронизации с наименьшей дисперсией интервала, с проверкой результата (это под QNX, но GCC - может быть "в лоб" перенесено в LINUX и проверено) ... это не совсем то, но очень близкие вещи - может на что-то натолкнуть.
|
|
|
|
|
Jun 23 2006, 08:25
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 2 065
Регистрация: 11-01-05
Из: Москва
Пользователь №: 1 892

|
Цитата(Olej @ Jun 23 2006, 12:18)  P.S. в конечном счёте, если это серьёзная нужда и не лень повозиться, я готов специально найти, вырезать и выслать из книжки: http://www.books.ru/shop/books/357604- раздельчик, где специально ставилась задача синхронизации с наименьшей дисперсией интервала, с проверкой результата (это под QNX, но GCC - может быть "в лоб" перенесено в LINUX и проверено) ... это не совсем то, но очень близкие вещи - может на что-то натолкнуть. Спасибо! Думаю, за 150р мне проще будт ее купить  QNX мне не грозит, все будет под Linux, вначале на AT91RM9200, затем на PXA270.
|
|
|
|
|
Jun 23 2006, 09:06
|

Местами Гуру
    
Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323

|
Цитата(Evgeny_CD @ Jun 22 2006, 21:22)  Цитата(Harbour @ Jun 22 2006, 20:00)  Нет, не надо - user space realtime это уже давно прошедший этап в RTAI. Я помню про RTAI - с Вашей подачи познакомился с этим чудом с полгода назад. Но он есть далеко не для всех процов! Для "народного" AT91RM9200 нету. Для PXA270 свободного не видел. Вот тут хотят 300 евро, причем за image - непонятно, как там насчет GPL и исходников... http://www.vollmann.ch/en/colibri/shop.html#pro_supportДля Cirrus EP93xxx RTAI есть - но не тянет меня на эти процы по ряду причин. Цитата(bigirbis @ Jun 22 2006, 14:06)  В принципе, ничего сложного. Могу порекомендовать переводную книгу по этой теме: http://www.nclug.ru/wiki/index.php?page=knz_ldd2 (Linux Device Drivers 2nd edition) Если надо - приаттачу простой код Спасибо за желание помочь - это очень приятно. LDD2, LDD3 у меня есть, с "техническим" английким проблем не испытываю. Есть даже переведенная книжка Померанца по программированию kernel module. Но как-то стремно нырять в этот омут. Цитата(bigirbis @ Jun 22 2006, 14:06)  Тогда все нужно описывать в kernel space и уповать, что проца хватит (в должном объеме) и на эту нитку тоже... Судя по постановке задачи, жрущих процессорное время в 3 горла процессов нет, да и активируются они редко. Тогда: 1) если не очень принципиальны редкие задержки - разделить код на User и Kernel Space 2) если очень принципиально - все в kernel space. Я хотел вариант lite написать в user space (при помощи всяких внешних аппаратных ухищрений доведя допустимую девиацию до 100 мс), а затем, по мере набора опыта, перетащить полностью или целиком в kernel space. Какой arm значения не имеет - клавное что архитектура поддерживается ядром, заточить ядро под новый камень (их в за год с десяток появляется) дело одно-двух дней. Такой древний камень как AT91RM9200 работает под linux'ом давно, RTAI его держит, по памяти, с 2005 года. Если требования к задаче довольно строги - перенос в kernel space особого рояля не играет. Цитата(Olej @ Jun 23 2006, 11:18)  Цитата(Evgeny_CD @ Jun 22 2006, 21:22)  Я хотел вариант lite написать в user space (при помощи всяких внешних аппаратных ухищрений доведя допустимую девиацию до 100 мс), а затем, по мере набора опыта, перетащить полностью или целиком в kernel space.
Я бы так и делал, и, может оказаться, не только в lite, но и в конечном варианте... Я не скажу наверняка, как это будет в Linux (я это не проверял), но в QNX - разумно распорядившись приоритетами, можно гарантировать, что время начала операции будет плавать между 2-4 ticksize ... но всё, что касается диспетчеризации, вытеснения + деталей отработки службы времени (а там всё совсем не очевидно) - это всё регламентируется моделями POSIX, а одна и другая ОС в той или иной мере пытаются следовать POSIX. Мне кажется, что при ticksize=10мс. вы должны определённо вписаться в 100мс. интервал, если обезопаситься от всех неожиданностей + разумно распорядиться приоритетами + использовать только статические приоритеты при RR диспетчеризации (это те, кторые RT - об этом хорошо растолковывается в такой книжке "Ядро LINUX с комментариями" ... или как-то так - нет под рукой). Потом результат можно легко проверить на адекватность ... и у вас ещё остаётся возможность переопределить в ядре ticksize в сторону уменьшения. P.S. в конечном счёте, если это серьёзная нужда и не лень повозиться, я готов специально найти, вырезать и выслать из книжки: http://www.books.ru/shop/books/357604- раздельчик, где специально ставилась задача синхронизации с наименьшей дисперсией интервала, с проверкой результата (это под QNX, но GCC - может быть "в лоб" перенесено в LINUX и проверено) ... это не совсем то, но очень близкие вещи - может на что-то натолкнуть. А кстати как QNX, атмеловские кристаллы держит ? P.S. Вот линка на текущий порт linux на атмеловское чудо: http://maxim.org.za/AT91RM9200/2.6/
|
|
|
|
|
Aug 8 2006, 13:47
|
Участник

Группа: Новичок
Сообщений: 34
Регистрация: 8-08-06
Из: Жуковский
Пользователь №: 19 404

|
Решение есть. Появилось совсем недавно, в виде патча к последнему(или одному из последних) ядер 2.6. Собственно, страница с патчем: http://kerneltrap.org/node/6750 После патча и включения его в ядро, функции usleep и nanosleep начинают работать настолько точно, насколько позволяет ваша машина. (Насколько я понимаю, зависит это от чипсета) Мне-таки удалось получить 100 микросекундную выдержку - проверял осциллографом - на PIV с i975. А на старом компьютере (PIII c VIA Apollo Pro) минимальным временем задержки стала 1 миллисекунда вместо 20 мс, что тоже неплохо. Впрочем, судя по дате последнего сообщения, это уже неактуально. P.S. А вот интересно, под windows кто-нибудь пробовал получать задержки в порядка сотни микросекунд..?
|
|
|
|
|
Aug 8 2006, 22:18
|
Участник

Группа: Новичок
Сообщений: 34
Регистрация: 8-08-06
Из: Жуковский
Пользователь №: 19 404

|
Ой-Ой-Ой. Отписал не в ту тему, прошу меня извинить. Да-да, это те самые патчи, которые делают возможным брать задержки от другого источника... Но, насколько я понимаю(могу сильно ошибаться) например, HPET таймер реализуется именно чипсетом - однако, это уже оффтопик. По теме: если вопросы переключения задач зависят в данном случае только от ядра(причем, гарантировать нужный timeslice скорее всего, нельзя), то, быть может, само ядро стоит немного подправить?)) Насколько "немного" - уже другой вопрос. Однако сама возможность не исключается?
|
|
|
|
|
Feb 26 2013, 02:28
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Прошу прощение за поднятие старой темы. Но для меня это актуально. Т.е. я правильно понимаю, что если под linux запущу это CODE while( 1 ) { sleep( 100 ); set( portx, 1 ); sleep( 100 ); clr( portx, 1 ); } То мне не гарантируется меандр с периодом 200 мс на неком порте X, разряде 1? RT патчи особо не интересуют, отношение почему-то скептическое... Прерывания обрабатывать не нужно.
--------------------
Выбор.
|
|
|
|
|
Feb 26 2013, 04:06
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Правильно. Во-первых, sleep(100) отправит процесс спать на 100 секунд, а не на 100 мс.  Во-вторых, никто не гарантирует, что когда время сна истечет, планировщик немедленно передаст управление этой задаче. Там может оказаться много других желающих получить процессорное время...
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Feb 26 2013, 09:36
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (alx2 @ Feb 26 2013, 13:06)  Правильно. Во-первых, sleep(100) отправит процесс спать на 100 секунд, а не на 100 мс.  Во-вторых, никто не гарантирует, что когда время сна истечет, планировщик немедленно передаст управление этой задаче. Там может оказаться много других желающих получить процессорное время... Ну вообще я написал псевдокод. Поэтому у меня sleep засыпает на миллисекунды))) Ок, понятно. А если еще и приложения типа интенсивно работающего веб-сервера, то вообще труба... Спасибо!
--------------------
Выбор.
|
|
|
|
|
Feb 26 2013, 11:21
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата RT патчи особо не интересуют, отношение почему-то скептическое... Цитата Ок, понятно. А если еще и приложения типа интенсивно работающего веб-сервера, то вообще труба... C RT патчами как раз никакой нагруженный веб-сервер и даже обработчик прерываний не заставит ждать задачу с большим приоритетом - это и подразумевает детерминизм, ну а скепсис в основном от непонимания происходящего
Сообщение отредактировал sasamy - Feb 26 2013, 11:32
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|