Название: QTEmbedded и PowerSaving Отправлено: tohisu от Январь 28, 2010, 06:05 Добрый день.
Необходимо чтобы устройство с приложением на Qt, через некоторое время уходило в спячку (suspend). Сам линух, на котором крутится софтина, настроен таким образом, что через 5 минут неактивности системы должен происходить auto suspend. И оно работало, пока не стали писать на Qt. С новым приложением же засыпания не происходит и батарея садится в течении нескольких часов. :( Активных таймеров (явно запущенных) у меня нету, так же как и явно запущенных потоков в которых что-то происходит. Т.е. происходит событие от клавиатуры, я его обрабатываю и больше ничего лишнего не делаю, но qt похоже продолжает жить своей жизнью... :( Название: Re: QTEmbedded и PowerSaving Отправлено: Rcus от Январь 28, 2010, 10:37 Ваше описание совершенно не раскрывает деталей. Например что раньше использовалось вместо Qt, какая реализация петли используется, как именно происходит определение бездействия и отключение устройства. С Qt/Embedded и так здесь немногие работают, а с устройством работающим от батарей и еще меньше.
Название: Re: QTEmbedded и PowerSaving Отправлено: tohisu от Январь 28, 2010, 20:19 Ваше описание совершенно не раскрывает деталей. Например что раньше использовалось вместо Qt, какая реализация петли используется, как именно происходит определение бездействия и отключение устройства. С Qt/Embedded и так здесь немногие работают, а с устройством работающим от батарей и еще меньше. Я понимаю, что если хочешь получить нормальный ответ - задай нормальный вопрос. :)Но вот незнаю что нужно для постановки диагноза. :) Проблема в том, что пока мы сами не можем собрать ядро с которым бы наше устройство работало. Поэтому временно пришлось взять готовую прошивку и начать писать под имеющийся дистрибутив. Знаю только, что прежняя система была написана на с++ и qt в ней точно не применялся... Все что мне удалось узнать у прежних разработчиков - для автозасыпания не надо делать ни каких лишних движений. Все настроено таким образом чтобы засыпать автоматически при бездействии. И по их версии наше приложение чем-то занимается в свободное время, потому и не спит... К сожалению пока не имею глубоких познаний в устройстве ядра и построении даже минимальной базовой системы, но если скажите где и что посмотреть, то это запросто. :) Еще можно попробовать спросить у разработчиков, но только надо знать что спрашивать... Название: Re: QTEmbedded и PowerSaving Отправлено: Rcus от Январь 29, 2010, 06:38 Что значит чем-то занимается в свободное время? Полностью использует отведенный квант? Ну можно посмотреть strace -f правда без знания о механизме засыпания мало что можно сказать.
Название: Re: QTEmbedded и PowerSaving Отправлено: lit-uriy от Январь 29, 2010, 08:37 >>но qt похоже продолжает жить своей жизнью...
ну а главный цикл событий-то по идее крутиться Название: Re: QTEmbedded и PowerSaving Отправлено: tohisu от Январь 30, 2010, 10:42 >>но qt похоже продолжает жить своей жизнью... ну а главный цикл событий-то по идее крутиться И это означает, что приложение всегда будет что-то делать... правильно понимаю? :( А как тогда быть? Название: Re: QTEmbedded и PowerSaving Отправлено: BlackTass от Январь 30, 2010, 15:18 Дело я думаю не столько в том что крутится евентлуп. Ведь не в куте приложении все равно организуется что-то подобное во время ожидания новых данных, комманд и т.д. (начиная от банального цикла со слипом и заканчивая аналогами евентлупа в куте).
Название: Re: QTEmbedded и PowerSaving Отправлено: tohisu от Апрель 28, 2010, 10:32 Здравствуйте.
Стал экспериментировать с засыпанием системы. Для того чтобы перевести систему в suspend режим, использую команду: echo mem > /sys/power/state. Для начала решил провести эксперименты на обычном i386 железе. Для этого собрал две версии приложения для x и для embedded. Испытания проводил на 2х компах (подключался по ssh). Проверка под Gnome. 1) Подключился через ssh и даю команду на засыпание. По мимо моего приложения запущенно еще целая куча других. Система корректно заснула и проснулась. Все работает отлично. Проверка под embedded. 1) Убил X. И через ssh снова попробовал усыпить систему. При этом приложение запущенно не было. Опять все прошло успешно. 2) Запустил приложение и снова попробовал усыпить... и вот тут появилось кое-что интересное. Система отказалась засыпать до тех пор, пока на удаленной машине не была закрыта консоль. Как только консоль закрылась, система тут же заснула. Что-бы убедиться, что не я косячник, создал максимально простое приложение показывающее пустую форму. Результат тот же. Получается, что qt-embedded приложение как-то влияет на процес suspend/restore? PS. На ARM девайсе после перехода в suspend режим просыпание вообще не происходит. Т.е. система явно что-то делает т.к. активно жрет батарею, но приложение больше не работает. Название: Re: QTEmbedded и PowerSaving Отправлено: Rcus от Апрель 28, 2010, 19:09 Фигня это - ядро пересобрать в отладочном режиме и посмотреть где останавливается засыпание, вот вывести устройство из сна уже посложнее /* третий день пытается включить FM-тюнер по I²C */
Название: Re: QTEmbedded и PowerSaving Отправлено: tohisu от Апрель 29, 2010, 16:10 Фигня это - ядро пересобрать в отладочном режиме и посмотреть где останавливается засыпание А как его пересобрать в отладочном режиме? И где смотреть потом? В /var/log/messages ? Стал смотреть что пишет ядро во время suspend/restore. При запущенном QtEmbedded приложении делаю suspend, в логе (/var/log/messages) пишется строка: Код: PM: Syncing filesystems ... done. Код: Apr 29 16:30:36 NSW kernel: [ 716.156144] PM: Syncing filesystems ... done. Заинтересовала строка "Freezing user space processes ... (elapsed 0.00 seconds) done.". Т.е. на сколько я понял система сначала замораживает все пользовательские процессы. В этом документе http://www.mjmwired.net/kernel/Documentation/power/freezing-of-tasks.txt (http://www.mjmwired.net/kernel/Documentation/power/freezing-of-tasks.txt) вроде описанно как это должно происходит, но видимо мой инглиш совем плохой стал... Еще в результате экспериметов обнаружил, что если убрать все права на устройство tty0 и запустить приложение, то в приложении не работает клавиатура и вообще оно ведет себя неадекватно, но зато система отлично суспендится и ресторится. Название: Re: QTEmbedded и PowerSaving Отправлено: crossly от Апрель 29, 2010, 16:18 а если посмотреть как это делает qt extended??.... не помню точно .. но по моему там перед засыпанием делается processEvents(QEventLoop::AllEvents|QEventLoop::WaitForMoreEvents)
Название: Re: QTEmbedded и PowerSaving Отправлено: tohisu от Апрель 30, 2010, 08:52 а если посмотреть как это делает qt extended??.... не помню точно .. но по моему там перед засыпанием делается processEvents(QEventLoop::AllEvents|QEventLoop::WaitForMoreEvents) Отличная идея была посмотреть в QtExtended. :) Нашел код которым они усыпляют устройства и теперь у меня есть такой слот: Код: void MApplication::suspendSystem() { Устройство пролежало часов 12, а батарея разрядилась на 3% такой результат вполне устраивает. :) Но как обычно не обошлось без ложки дегтя... :((( При старте системы (на ARM, уже речь идет про реальное устройство) приложение запускается скриптом S95nulldm из /etc/rc2.d Код Но сразу после запуска приложение работает не корректно. Т.е. оно усыпляет систему, но после того как система проснется оно не работает (хотя таймер продолжает работать и через определенное время устройство снова засыпает). Если же зайти по ssh и прибить процесс myshell, то скрипт nulldm снова его перезапустит и тогда уже приложение работает отлично. Засыпает и просыпается как часы. В чем может быть проблема? |