time.clock()

前回試したロータリーエンコーダのプログラム、起動してしばらくはちゃんと動くのだが、30分ぐらい放置すると動かなくなってしまう事が分かった。

ソースコードを机上で確認すると、チャタリング除去に使った time.clock() の戻り値が増加せずに減少していたとすれば、発生している症状と合致する。最初はタイマの値がオーバーフローを起こしているのでは?と思ったのだが、その場合は50日間近く継続して動かさないと発生しないはずで、30分ぐらいでオーバーフローするはずがない。

どうも分からないので、以下のようなテストプログラムを組んで走らせてみた。time.clock()がオーバーフローを起こしているなら、戻り値がマイナスになってプログラムが停止するはず。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import time

if __name__ == "__main__":
    print time.ctime()
    try:
        count = 1000
        while True:
            tc = time.clock()
            tt = time.time()
            if(tc < 0):
                print tc, tt
                print time.ctime()
                break
            count = count - 1
            if count <= 0:
                print tc, tt
                count = 1000
            for i in range(1, 10000):
                pass
    except KeyboardInterrupt:
        print '\nbreak'

結果はこうなった。驚いた事に、本当にtime.clock()がマイナスの値を返している。エポック秒を返すtime.time()は正しい値を返しているので、time.clock()だけおかしい理由が分からない。

$ python TimeTest.py
Sat Mar 16 17:38:15 2013
10.28 1363423105.5
20.35 1363423115.61
30.42 1363423125.71
40.49 1363423135.83
50.55 1363423145.93
60.63 1363423156.05
70.69 1363423166.15
80.76 1363423176.26
90.83 1363423186.37
100.9 1363423196.47

中略

2053.65 1363425156.1
2063.71 1363425166.19
2073.77 1363425176.29
2083.83 1363425186.38
2093.89 1363425196.47
2103.95 1363425206.56
2114.01 1363425216.65
2124.07 1363425226.75
2134.13 1363425236.84
2144.2 1363425246.94
-2147.477296 1363425250.24
Sat Mar 16 18:14:10 2013

マイナスになった瞬間の値は -2147.477296 で、これは32bit整数型の最大値 2147483647 と似た値なのが非常に気になる。time.clock()はプロセッサクロックタイムを返す関数なので、Pythonの問題ではなくRaspberry Piのハードウェアに特有の問題という気がする。

それとも何か根本的に勘違いしているのだろうか?

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中