Armadilloフォーラム

起床原因の確認方法

y-tsuchida

2021年6月10日 20時27分

お世話になっております

root@armadillo:~# aiot-sleep

から起床したときに、何をトリガーに起床したのかを確認する手段はございますでしょうか

#!/bin/sh
case $1/$2 in
    pre/*)
        echo `date` " goodnight" $1 $2 >> /home/atmark/boot.log
    ;;
    post/*)
        echo `date` " wakeUP" $1 $2 >> /home/atmark/boot.log
    ;;
esac

のように、起床時のスクリプトを確認してみましたが、いずれの起動でも[$2 = suspend]でございます。

以上、よろしくお願いいたします。

コメント

at_shinya.koga

2021年6月21日 6時55分

アットマークテクノの古賀です。

y-tsuchihdaさん(2021年6月10日 20時27分):
>root@armadillo:~# aiot-sleep
>から起床したときに、何をトリガーに起床したのかを確認する手段はございますでしょうか

ありません。

>#!/bin/sh
>case $1/$2 in
> pre/*)
> echo `date` " goodnight" $1 $2 >>/home/atmark/boot.log
> ;;
> post/*)
> echo `date` " wakeUP" $1 $2 >>/home/atmark/boot.log
> ;;
>esac
>
>のように、起床時のスクリプトを確認してみましたが、いずれの起動でも[$2 = suspend]でございます。

/lib/systemd/system-sleep/ に配置するスリープ時・起床時のスクリプトは、systemd-suspend.service によって実行されますが、systemd-suspend.serive が、このスクリプへ起床時に渡す第二引数は、"suspend", "hibernate", "hybrid-sleep", "suspend-then-hibernate" のいずれかであり、Armadillo の場合、"suspend" しか起こり得ないのです:
https://www.freedesktop.org/software/systemd/man/systemd-suspend.servic…

Armadillo-IoT A6 で使用可能な起床要因のうち、どれで起床したのかを知るためには、CPU が起床した直後に、割り込みコントローラを見て、どの割り込みがアクティブになっているかを調べ、それを記憶する必要がありますが、Linux カーネルには、そのような仕組みがありません:
https://www.kernel.org/doc/html/latest/power/suspend-and-interrupts.html
OS としては、スリープモードから起床した際、アクティブな割り込みを通常通り応答動作するだけです。起床要因となった割り込みが何かを判別して特別処理する必要性は、特にありませんので、起床要因割り込みを記憶する仕組みが無いのだと思います。

もし、どうしても起床要因が何かを知る必要があり、Linux カーネルを改造せずに対応したい、という場合には、/lib/systemd/system-sleep/ に配置するスリープ時・起床時のスクリプトで /proc/interrupts の内容を見て、起床要因割り込みのうち、スリープ前と起床後とで割り込み発生回数が違うものを調べる、という方策で対処できるケースがあるかも知れません。
https://linuc.org/study/knowledge/462/
しかし、USB インタフェースに USB デバイスが装着されている場合、起床時に割り込みが発生するでしょうから、二つの USB インタフェース(CON5 の上段か下段)のどちらか一方を挿抜して起床した際、もう一方にも USB デバイスが装着されていると、/proc/interrupts を見ても、どちらが起床要因になったか判別することは、困難でしょう。

お力になれる回答ではなく、恐縮ですが、もし参考になりましたら幸いです。