저는 센서에서 데이터를 얻기 위해 매 10ms라는 함수를 사용하려고합니다.Python, Raspberry pi, 정확하게 10 밀리 초 단위로 작업을 호출합니다.
기본적으로 나는 gpio 인터럽트에서 콜백을 triggring했지만 내 센서를 변경했고 현재 콜백을 구동 할 INT 핀을 가지고 있지 않습니다.
그래서 내 목표는 타이머에 의해 생성 된 내부 인터럽트와 동일한 동작을하는 것입니다.
나는이 topicimport threading
def work():
threading.Timer(0.25, work).start()
print(time.time())
print "stackoverflow"
work()
에서이 시도하지만 그것을 실행할 때 나는 타이머가 정말 정확하지 않습니다 그것은 당신이 볼 수있는 시간이 지남에 derivating 있다고 볼 수 있습니다.
1494418413.1584847
stackoverflow
1494418413.1686869
stackoverflow
1494418413.1788757
stackoverflow
1494418413.1890721
stackoverflow
1494418413.1992736
stackoverflow
1494418413.2094712
stackoverflow
1494418413.2196639
stackoverflow
1494418413.2298684
stackoverflow
1494418413.2400634
stackoverflow
1494418413.2502584
stackoverflow
1494418413.2604961
stackoverflow
1494418413.270702
stackoverflow
1494418413.2808678
stackoverflow
1494418413.2910736
stackoverflow
1494418413.301277
stackoverflow
그래서 타이머가 몇 초 후에 매우 큰 편견은 0.2 밀리 초 10 밀리 초마다에 의해 derivating된다.
나는 파이썬이 실제로 "실시간"으로 만들어지지 않는다는 것을 알고 있지만, 그것을 할 방법이 있어야한다고 생각합니다.
누군가가 이미 파이썬으로 시간 제약 조건을 처리해야하는 경우 몇 가지 조언을 제공하게되어 기쁩니다.
감사합니다.
타이머 자체가 걸리는 시간과 인쇄를 허용하지 않기 때문에 표류합니다. 실제 시간과 다음 10ms가 끝나는 시간의 차이를 기준으로 타이머를 설정하면 타이밍이 흐트러지지 않습니다. 예를 들어 루프를 시작하고 10ms 씩 증가하는 '목표'를 유지하기 전에 시간을 확보하고 (target-currenttime) 기간 동안 타이머를 시작한 다음 타이머가 만료되면 대상에 10ms를 추가하고 다시 시작합니다 . 지터가 수용 가능한지 직접 확인해야합니다. 즉, 모든 사용 시나리오에서 평균값과 최고치를 측정하십시오. – barny
답장을 보내 주셔서 감사합니다. 타이머 스케줄링 시간을 측정하지는 않지만, 추가하지는 않을 것입니다. 그런 표류. 요점은이 10ms에 대해 매우 정확하고 싶습니다.이 방법의 문제점은 타이머 스케줄링에서 항상 드리프트가 발생한다는 것입니다. – Arkaik
처음에이 값을 한 번만 정의하고 타이머가 만료 된 후 자동으로 다시 시작되도록하는 방법이 있습니까? – Arkaik