tag:blogger.com,1999:blog-68273632805925329572024-02-08T08:24:51.703+02:00cat **/* | grep яAkshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-6827363280592532957.post-90482667908529884512008-11-22T18:52:00.001+02:002009-02-22T16:35:31.375+02:00.ля6 месяцев назад, сделал в VirtualBox'е snapshot виртуальной машины в которой запускаю виндовые проги. Сегодня решил этот снапшот убить. И убил актуальное состояние. В результате у меня больше нет вещей спроектированных и созданных собственными руками -- схемы и разведенные печатные платы. Особенно жалко:<br />1. 1-wire датчик влажности и температуры + 1-wire интерфейс к датчику движения.<br />2. 1-wire датчик PH (ph-метр) на двух ОУ.<br />3. Библиотека использованных компонент для Altium Designer'а...<br /><br />Все это и еще многие другие схемы я планировал выложить в блог... Грустно. Несмотря на то, что все эти схемы вытравлены и реализованы в "железе", некоторые из них мне нужно будет делать повторно....<br /><br />Принимаю соболезнования.<ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com1tag:blogger.com,1999:blog-6827363280592532957.post-68035989963255122212008-08-11T19:31:00.001+03:002009-02-22T16:33:45.504+02:00Зедаржки в JavaТак как для задач управление домашней автоматикой я сделал не совсем очивидный выбор - Java, то, естественно, мне было необходимо настраивать работу Java приложения под требование иметь минимальные задержки на события. В результате, для того, чтобы получить имеющийся результат, пришлось предпринять следующие действия:<br /><ad2></ad2><br />1. Пускать приложение с schedtool -n -20 -R -p 1 -e /opt/mywire/bin/mywire<br /> Данная команда позволяет запустить приложение в realtime группе с приоритетом 1. Все приложение linux имеют приоритет 0 независимо от nice level'а. Таким образом работа нашего mywire всегда приоритетнее любой задачи.<br /><br />2. В некоторых критичных нитях, с помощью обращения к native методу происходит установка приоритета в значение 40. Таким образом внутри самого приложения нити имеют разные приоритеты. Это опасно и может привести к блокировкам!<br /><br />3. Для того, чтобы ни в коем случае mywire не оказался в свопе, память лочится с помощью обращения к native методу mlockall.<br /><br />4. Сам java процесс пускается со следующими опциями:<pre><br /> -Xms30m -Xmx64m -XX:PermSize=15m -XX:MaxPermSize=30m<br /> -XX:+UseTLAB -jvm server<br /> -XX:MaxGCPauseMillis=20 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode<br /> -XX:+CMSClassUnloadingEnabled<br /> -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses<br /> -XX:+BackgroundCompilation</pre><br /> Количество памяти, которое я отдаю под heap выбранно таким образом, чтобы сразу после сборки мусора (full gc), свободной памяти было где-то 60%.<br /><br />Надеюсь ничего не забыл. Как результат мы имеем задержки порядки 10-16мс. При том, что библиотека quartz сама работает с дискретеностью в 10мс. Тоесть если ей сказать, что таску нужно запустить через 5мс, она ее все равно запустить через 10.<br /><br />К сожалению раз в час происходит full gc или что-то типа того и это влечет за собой неожиданные задержки. Величина зависит от того, как совпадут время срабатывания и начало сборки мусора. В среднем это 200мс. Бывает и 500мс и 700мс. Будем думать как это побороть.<br /><br />Вот графики:<br />Latency:<br /><img src="http://toril.ru/lj/hour.rrd.png"><br /><br />Память.<br /><img src="http://toril.ru/lj/phour.rrd.png"><br /><ad></ad><br />Видно, что в момент сборки мусора был всплеск задержек.<br /><br />Предугадывая вопросы:<br /> Java - чтобы писать быстрее.<br /><br /> Latency - в данном случае, это разница времени момента срабатывания таймера и времени, в которое данный таймер должен был сработать. Тоесть, например, если было сказано спать 100мс, а таймер проспал 120мс, то задержка 20мс.<br /><br /> Важность Latency заключается в том, что опрашивать некоторые датчики необходимо весьма часто, скажем датчик движения 2 раза в секунду. В моем варианте датчик движения замыкает размыкает контакты конденсатора давая ему зарядится, таким образом датчик напряжения 1-wire успеет заметить какой-нибудь заряд, даже если он пропустит сам импульс. Так вот если Latency будет слишком высокой (скажем 2-3 секунды), то срабатывания датчик может просто остаться незамеченным.<br /><br /> Кто озадачился вопросом, почему датчик движения не может сам сообщить о срабатывании, отвечу: 1-wire сеть может иметь только одного master'а, все остальные slave'ы.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-32937817545952371742008-08-11T11:35:00.002+03:002009-02-22T16:32:34.122+02:00Home PortalДомашний портал. Эта та страничка, что стоит в браузере как home page. Отсюда я/жена читаю новости, смотрю погоду за окном (графики влажности, температуры), наблюдаю за работой сервера и т.д. Предназначен он для home automation (ну там энергосберегающий умный дом (smarthouse) и т.д.). Работа в свободное время. Сбор информации и управление 1-wire, в будущем будет еще X-10 (управление светом), камеры и т.д.. Много всего написано, но на сервере на production сервере еще не выложено. Сам портал напроч AJAX'ный, перегрузок страниц не требует. В качестве платформы Jboss Portal + DOJO (следующие портлеты будут без dojo, но на GWT). В качестве ядра, standalone java process со стеком spring + termware + quartz и т.д.<br /><br />Но вообще пост не об этом, а о двух подряд идущих анонсах в ленте torrent.net.ua (см. скриншоты).<br /><ad></ad><br /><a href="http://toril.ru/lj/homeportal.png">Картинка 1</a><br /><a href="http://toril.ru/lj/homeportal2.png">Картинка 2</a><br /><a href="http://toril.ru/lj/homeportal3.png">Картинка 3</a>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-48750551048445689372008-05-19T13:18:00.001+03:002009-02-22T15:46:45.681+02:00OWFS 2.7p4Нашел багу в OWFS 2.7p4. Немного криво написанная блокировка приводила к обращению к уже освобожденному участку памяти. Проявлялось через 1сек-5мин (как повезет) при паралелльном обращении к датчикам: owfs выключалась либо молча либо с сообщением функции tsearch из glibc о поврежденном списке. GDB помог не сильно. Valgrind помог весьма - отличная тулзень, давно ей пользуюсь.<br /><pre>==16965== Thread 9:<br />==16965== Invalid read of size 4<br />==16965== at 0x405F7A5: LockGet (ow_locks.c:142)<br />==16965== by 0x4066195: FS_r_given_bus (ow_read.c:229)<br />==16965== by 0x40663B2: FS_read_distribute (ow_read.c:191)<br />==16965== by 0x40668AD: FS_read_postparse (ow_read.c:106)<br />==16965== by 0x4066AEA: FS_read (ow_read.c:58)<br />==16965== by 0x409E26D: fuse_fs_read (in /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A2A12: (within /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A5F48: (within /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A6EAF: (within /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A86D5: fuse_session_process (in /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A4AD4: (within /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40C8382: start_thread (in /lib/libpthread-2.7.so)<br />==16965== Address 0x43b8dc8 is 0 bytes inside a block of size 16 free'd<br />==16965== at 0x402465C: free (vg_replace_malloc.c:323)<br />==16965== by 0x41B281A: tdelete (in /lib/libc-2.7.so)<br />==16965== by 0x405F62B: LockRelease (ow_locks.c:164)<br />==16965== by 0x40662AD: FS_r_given_bus (ow_read.c:236)<br />==16965== by 0x40663B2: FS_read_distribute (ow_read.c:191)<br />==16965== by 0x40668AD: FS_read_postparse (ow_read.c:106)<br />==16965== by 0x4066AEA: FS_read (ow_read.c:58)<br />==16965== by 0x409E26D: fuse_fs_read (in /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A2A12: (within /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A5F48: (within /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A6EAF: (within /usr/lib/libfuse.so.2.7.3)<br />==16965== by 0x40A86D5: fuse_session_process (in /usr/lib/libfuse.so.2.7.3)</pre><ad></ad><br />Пропатченная версия работает уже 2 часа без проблем. Если до вечера доработает без ошибок напишу в mailing list owfs.<br /><br /><a href="http://toril.ru/soft/owfs-2.7p4-locksfix.patch.gz">Патч.</a><br /><br />P.S. Valgrind показал мемори ликов на 4кб. Надо будет глянуть.. это конечно не 4мб, но если там не дебри, то почему бы не пофиксить...<ad2></ad2>Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0tag:blogger.com,1999:blog-6827363280592532957.post-36885100924186396362008-04-18T18:44:00.005+03:002009-02-22T15:49:32.192+02:001-WireВ понедельник пришли датчики и адаптеры для организации 1-wire сети. Сегодня протестил датчик температуры - работает :). Правда я вначале протупил и подключил у DS18S20 только две ноги - землю и данные, а оно мне сообщает температуру 85 градусов и не грама больше или меньше. Проипался минут 30, пока случайно в спецификации не заметил, что если дополнительное питание на DS18S20 не подается, то ногу питания надо на землю кидать, а не оставлять болтаться в воздухе. OWFS завелся с пол пинка, приятная софтина и продуманная.<ad></ad><br /><br />На правах рекламы. Термодатчики покупал на радиорынке - это единственное, что там было. А потом USB адаптер и прочие датчики заказал на <a href="http://www.hobby-boards.com">http://www.hobby-boards.com</a> очень рад. Хороший магазин, занимающийся продажей элеметнов для умного дома: цены НИЖЕ чем если брать у местных поставщиков (мне вообще только один отозвался), достаточно оперативный и приятный магазин.Akshaalhttp://www.blogger.com/profile/05677582369584740657noreply@blogger.com0