Russian Qt Forum
Ноябрь 23, 2024, 04:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTEmbedded и PowerSaving  (Прочитано 7515 раз)
tohisu
Гость
« : Январь 28, 2010, 06:05 »

Добрый день.
Необходимо чтобы устройство с приложением на Qt, через некоторое время уходило в спячку (suspend).
Сам линух, на котором крутится софтина, настроен таким образом, что через 5 минут неактивности системы должен происходить auto suspend. И оно работало, пока не стали писать на Qt. С новым приложением же засыпания не происходит и батарея садится в течении нескольких часов. Грустный
Активных таймеров (явно запущенных) у меня нету, так же как и явно запущенных потоков в которых что-то происходит. Т.е. происходит событие от клавиатуры, я его обрабатываю и больше ничего лишнего не делаю, но qt похоже продолжает жить своей жизнью... Грустный
Записан
Rcus
Гость
« Ответ #1 : Январь 28, 2010, 10:37 »

Ваше описание совершенно не раскрывает деталей. Например что раньше использовалось вместо Qt, какая реализация петли используется, как именно происходит определение бездействия и отключение устройства. С Qt/Embedded и так здесь немногие работают, а с устройством работающим от батарей и еще меньше.
Записан
tohisu
Гость
« Ответ #2 : Январь 28, 2010, 20:19 »

Ваше описание совершенно не раскрывает деталей. Например что раньше использовалось вместо Qt, какая реализация петли используется, как именно происходит определение бездействия и отключение устройства. С Qt/Embedded и так здесь немногие работают, а с устройством работающим от батарей и еще меньше.
Я понимаю, что если хочешь получить нормальный ответ - задай нормальный вопрос. Улыбающийся
Но вот незнаю что нужно для постановки диагноза. Улыбающийся
Проблема в том, что пока мы сами не можем собрать ядро с которым бы наше устройство работало. Поэтому временно пришлось взять готовую прошивку и начать писать под имеющийся дистрибутив.
Знаю только, что прежняя система была написана на с++ и qt в ней точно не применялся... Все что мне удалось узнать у прежних разработчиков - для автозасыпания не надо делать ни каких лишних движений. Все настроено таким образом чтобы засыпать автоматически при бездействии. И по их версии наше приложение чем-то занимается в свободное время, потому и не спит...
К сожалению пока не имею глубоких познаний в устройстве ядра и построении даже минимальной базовой системы, но если скажите где и что посмотреть, то это запросто. Улыбающийся Еще можно попробовать спросить у разработчиков, но только надо знать что спрашивать...
Записан
Rcus
Гость
« Ответ #3 : Январь 29, 2010, 06:38 »

Что значит чем-то занимается в свободное время? Полностью использует отведенный квант? Ну можно посмотреть strace -f правда без знания о механизме засыпания мало что можно сказать.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Январь 29, 2010, 08:37 »

>>но qt похоже продолжает жить своей жизнью...
ну а главный цикл событий-то по идее крутиться
Записан

Юра.
tohisu
Гость
« Ответ #5 : Январь 30, 2010, 10:42 »

>>но qt похоже продолжает жить своей жизнью...
ну а главный цикл событий-то по идее крутиться

И это означает, что приложение всегда будет что-то делать... правильно понимаю? Грустный
А как тогда быть?
Записан
BlackTass
Гость
« Ответ #6 : Январь 30, 2010, 15:18 »

Дело я думаю не столько в том что крутится евентлуп. Ведь не в куте приложении все равно организуется что-то подобное во время ожидания новых данных, комманд и т.д. (начиная от банального цикла со слипом и заканчивая аналогами евентлупа в куте).
Записан
tohisu
Гость
« Ответ #7 : Апрель 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 режим просыпание вообще не происходит. Т.е. система явно что-то делает т.к. активно жрет батарею, но приложение больше не работает.
Записан
Rcus
Гость
« Ответ #8 : Апрель 28, 2010, 19:09 »

Фигня это - ядро пересобрать в отладочном режиме и посмотреть где останавливается засыпание, вот вывести устройство из сна уже посложнее /* третий день пытается включить FM-тюнер по I²C */
Записан
tohisu
Гость
« Ответ #9 : Апрель 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.
Apr 29 16:30:36 NSW kernel: [  716.224262] Freezing user space processes ... (elapsed 0.00 seconds) done.
Apr 29 16:30:36 NSW kernel: [  716.224785] Freezing remaining freezable tasks ... (elapsed 0.00 seconds) done.
Apr 29 16:30:36 NSW kernel: [  716.224836] Suspending console(s) (use no_console_suspend to debug)
Apr 29 16:30:37 NSW kernel: [  716.225102] sd 0:0:0:0: [sda] Synchronizing SCSI cache
Apr 29 16:30:37 NSW kernel: [  716.317777] sd 0:0:0:0: [sda] Stopping disk
Apr 29 16:30:37 NSW kernel: [  717.752344] parport_pc 00:09: disabled
Apr 29 16:30:37 NSW kernel: [  717.752520] serial 00:08: disabled
Apr 29 16:30:37 NSW kernel: [  717.752692] serial 00:07: disabled
Apr 29 16:30:37 NSW kernel: [  717.752823] ata_piix 0000:00:1f.2: PCI INT B disabled
Apr 29 16:30:37 NSW kernel: [  717.768033] ehci_hcd 0000:00:1d.7: PCI INT A disabled
Apr 29 16:30:37 NSW kernel: [  717.768042] uhci_hcd 0000:00:1d.3: PCI INT D disabled
Apr 29 16:30:37 NSW kernel: [  717.768051] uhci_hcd 0000:00:1d.2: PCI INT C disabled
Apr 29 16:30:37 NSW kernel: [  717.768060] uhci_hcd 0000:00:1d.1: PCI INT B disabled
Apr 29 16:30:37 NSW kernel: [  717.768069] uhci_hcd 0000:00:1d.0: PCI INT A disabled
Apr 29 16:30:37 NSW kernel: [  717.872083] HDA Intel 0000:00:1b.0: PCI INT A disabled
Apr 29 16:30:37 NSW kernel: [  717.920193] PM: suspend devices took 1.696 seconds
Apr 29 16:30:37 NSW kernel: [  717.920291] r8169 0000:02:00.0: PME# enabled
Apr 29 16:30:37 NSW kernel: [  717.952698] ACPI: Preparing to enter system sleep state S3
Apr 29 16:30:37 NSW kernel: [  717.968010] Disabling non-boot CPUs ...
Apr 29 16:30:37 NSW kernel: [  718.034264] kvm: disabling virtualization on CPU1
Apr 29 16:30:37 NSW kernel: [  718.136027] CPU 1 is now offline
Apr 29 16:30:37 NSW kernel: [  718.136030] SMP alternatives: switching to UP code
Apr 29 16:30:37 NSW kernel: [  718.143714] CPU0: Thermal monitoring enabled (TM2)
Apr 29 16:30:37 NSW kernel: [  718.143714] Enabling non-boot CPUs ...
Apr 29 16:30:37 NSW kernel: [  718.143714] SMP alternatives: switching to SMP code
Apr 29 16:30:37 NSW kernel: [  718.148241] Booting processor 1 APIC 0x1 ip 0x6000
Apr 29 16:30:37 NSW kernel: [  718.143465] Initializing CPU#1
Apr 29 16:30:37 NSW kernel: [  718.143465] CPU: L1 I cache: 32K, L1 D cache: 32K
Apr 29 16:30:37 NSW kernel: [  718.143465] CPU: L2 cache: 3072K
Apr 29 16:30:37 NSW kernel: [  718.143465] CPU: Physical Processor ID: 0
Apr 29 16:30:37 NSW kernel: [  718.143465] CPU: Processor Core ID: 1
Apr 29 16:30:37 NSW kernel: [  718.143465] CPU1: Thermal monitoring enabled (TM2)
Apr 29 16:30:37 NSW kernel: [  718.236077] CPU1: Intel(R) Core(TM)2 Duo CPU     E7400  @ 2.80GHz stepping 0a
Apr 29 16:30:37 NSW kernel: [  718.236091] kvm: enabling virtualization on CPU1
Apr 29 16:30:37 NSW kernel: [  718.264378] CPU1 is up
Apr 29 16:30:37 NSW kernel: [  718.264868] ACPI: Waking up from system sleep state S3
Apr 29 16:30:37 NSW kernel: [  718.356517] [drm] DAC-6: set mode 1440x900 1c
Apr 29 16:30:37 NSW kernel: [  718.376560] HDA Intel 0000:00:1b.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
Apr 29 16:30:37 NSW kernel: [  718.481347] uhci_hcd 0000:00:1d.0: PCI INT A -> GSI 23 (level, low) -> IRQ 23
Apr 29 16:30:37 NSW kernel: [  718.481372] usb usb2: root hub lost power or was reset
Apr 29 16:30:37 NSW kernel: [  718.481389] uhci_hcd 0000:00:1d.1: PCI INT B -> GSI 19 (level, low) -> IRQ 19
Apr 29 16:30:37 NSW kernel: [  718.481412] usb usb3: root hub lost power or was reset
Apr 29 16:30:37 NSW kernel: [  718.481429] uhci_hcd 0000:00:1d.2: PCI INT C -> GSI 18 (level, low) -> IRQ 18
Apr 29 16:30:37 NSW kernel: [  718.481452] usb usb4: root hub lost power or was reset
Apr 29 16:30:37 NSW kernel: [  718.481469] uhci_hcd 0000:00:1d.3: PCI INT D -> GSI 16 (level, low) -> IRQ 16
Apr 29 16:30:37 NSW kernel: [  718.481492] usb usb5: root hub lost power or was reset
Apr 29 16:30:37 NSW kernel: [  718.481510] ehci_hcd 0000:00:1d.7: PCI INT A -> GSI 23 (level, low) -> IRQ 23
Apr 29 16:30:37 NSW kernel: [  718.481536] ata_piix 0000:00:1f.2: PCI INT B -> GSI 19 (level, low) -> IRQ 19
Apr 29 16:30:37 NSW kernel: [  718.482642] r8169 0000:02:00.0: PME# disabled
Apr 29 16:30:37 NSW kernel: [  718.483240] serial 00:07: activated
Apr 29 16:30:37 NSW kernel: [  718.483763] serial 00:08: activated
Apr 29 16:30:37 NSW kernel: [  718.484282] parport_pc 00:09: activated
Apr 29 16:30:37 NSW kernel: [  718.496045] r8169: eth0: link up
Apr 29 16:30:37 NSW kernel: [  718.512136] sd 0:0:0:0: [sda] Starting disk
Apr 29 16:30:37 NSW kernel: [  718.660204] ata2.00: ACPI cmd ef/03:45:00:00:00:a0 (SET FEATURES) filtered out
Apr 29 16:30:37 NSW kernel: [  718.660209] ata2.00: ACPI cmd ef/03:45:00:00:00:a0 (SET FEATURES) filtered out
Apr 29 16:30:37 NSW kernel: [  718.660213] ata2.00: ACPI cmd ef/03:0c:00:00:00:a0 (SET FEATURES) filtered out
Apr 29 16:30:37 NSW kernel: [  718.676228] ata2.00: configured for UDMA/100
Apr 29 16:30:37 NSW kernel: [  723.520014] ata1: link is slow to respond, please be patient (ready=0)
Apr 29 16:30:37 NSW kernel: [  724.300200] ata1.00: ACPI cmd ef/03:45:00:00:00:a0 (SET FEATURES) filtered out
Apr 29 16:30:37 NSW kernel: [  724.300204] ata1.00: ACPI cmd ef/03:45:00:00:00:a0 (SET FEATURES) filtered out
Apr 29 16:30:37 NSW kernel: [  724.300208] ata1.00: ACPI cmd ef/03:0c:00:00:00:a0 (SET FEATURES) filtered out
Apr 29 16:30:37 NSW kernel: [  724.316403] ata1.00: configured for UDMA/133
Apr 29 16:30:37 NSW kernel: [  724.341511] PM: resume devices took 6.060 seconds
Apr 29 16:30:37 NSW kernel: [  724.341591] Restarting tasks ... done.

Заинтересовала строка "Freezing user space processes ... (elapsed 0.00 seconds) done.". Т.е. на сколько я понял система сначала замораживает все пользовательские процессы. В этом документе http://www.mjmwired.net/kernel/Documentation/power/freezing-of-tasks.txt вроде описанно как это должно происходит, но видимо мой инглиш совем плохой стал...
Еще в результате экспериметов обнаружил, что если убрать все права на устройство tty0 и запустить приложение, то в приложении не работает клавиатура и вообще оно ведет себя неадекватно, но зато система отлично суспендится и ресторится.
Записан
crossly
Гость
« Ответ #10 : Апрель 29, 2010, 16:18 »

а если посмотреть как это делает qt extended??.... не помню точно .. но по моему там перед засыпанием делается processEvents(QEventLoop::AllEvents|QEventLoop::WaitForMoreEvents)
Записан
tohisu
Гость
« Ответ #11 : Апрель 30, 2010, 08:52 »

а если посмотреть как это делает qt extended??.... не помню точно .. но по моему там перед засыпанием делается processEvents(QEventLoop::AllEvents|QEventLoop::WaitForMoreEvents)

Отличная идея была посмотреть в QtExtended. Улыбающийся
Нашел код которым они усыпляют устройства и теперь у меня есть такой слот:
Код:
void MApplication::suspendSystem() {
  qDebug() << "MApplication::suspendSystem. Invoke.";
  qDebug() << "MApplication::suspendSystem. Suspending system.";
  QFile powerStateFile("/sys/power/state");
  if( !powerStateFile.open(QIODevice::ReadWrite | QIODevice::Text | QIODevice::Truncate)) {
    qWarning()<<"File not opened";
  } else {
    QTextStream out(&powerStateFile);
    out << "mem";
    powerStateFile.close();
  }
  qDebug() << "MApplication::suspendSystem. Restoring system.";
  QApplication::instance()->processEvents(QEventLoop::AllEvents | QEventLoop::WaitForMoreEvents);

  qDebug() << "MApplication::suspendSystem. Finish.";
  // start timer again
  QTimer::singleShot(timeOut*60*1000, this, SLOT(suspendSystem()));
}

Устройство пролежало часов 12, а батарея разрядилась на 3% такой результат вполне устраивает. Улыбающийся
Но как обычно не обошлось без ложки дегтя... Грустный((

При старте системы (на ARM, уже речь идет про реальное устройство) приложение запускается скриптом S95nulldm из /etc/rc2.d
Код
Bash
#!/bin/sh
 
/media/sd/installqt.sh
 
if [ -f /etc/default/nulldm ]; then
   . /etc/default/nulldm
fi
 
PIDFILE=/var/run/nulldm.pid
echo $$ > $PIDFILE
 
while :; do
 /media/sd/myshell -qws -nomouse -btn white -fn  "unifont" 2>> /media/sd/shell.debug
done
 
Но сразу после запуска приложение работает не корректно. Т.е. оно усыпляет систему, но после того как система проснется оно не работает (хотя таймер продолжает работать и через определенное время устройство снова засыпает). Если же зайти по ssh и прибить процесс myshell, то скрипт nulldm снова его перезапустит и тогда уже приложение работает отлично. Засыпает и просыпается как часы.
В чем может быть проблема?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 23.