고해상도(정밀) 타이머를 사용하고 싶습니다..

sadtale의 이미지

최소한 1ms 정도의 신뢰도를 갖는 타이머를 쓰고 싶은데요..
도대체.. 어떻게 해야 할 지 모르겠네요..

기껏해야 alarm 이니 setitimer 니 하는 것들은 1초 단위인거 같고..
나노세컨드나 마이크로세컨드는 바라지도 않구요..
밀리세컨드 단위로만이라도 타이머를 쓰고 싶어요...

PC 에서 하드웨어를 제어해야 하는게 있는데 8ms 마다 제어를 해야 하거든요...
그런데 고해상도 타이머를 어떻게 꾸며야 할 지 도저히 감이 안잡히네요..

옛날에 sourceforge 에 High Res POSIX timers 프로젝트가 있었는데 이것도 보니
무슨 2.6.21 커널부텀인가? 포함됐다는거 같은데 들어있긴 한건지.. 어떻게 쓰는지도 모르겠고..

아.. 정말 하루 종일 뒤지고 다녔는데 못찾겠네요..
좀 도와주세요...

danskesb의 이미지

sadtale의 이미지

두 분 답변 감사합니다. ^^

HPET 참고해서 예제 컴파일 해 돌려보니.. freq 를 128 로 했을 때 대략 8msec 나오는데..
어떨 때는 20ms 가 넘어가기도 하고.. 어떨 때는 2ms 가까이 내려가기도 하고..
들쑥날쑥 하네요.. 에효.. 로드가 많이 걸리면 더 차이날 것 같기도 하구요..

pastime 님이 올려주신 hrtimer 는 제가 얘기한 sourceforge 의 High Res POSIX Timer 가
이래저래 들어간 건가 보네요.. 2.6.16 부텀 커널에 머징 됐다고...
근데 이것도 어케 쓰는지 모르겠지만 커널 모드에서 써야 하는거 같기도 하고..

이거 뭐.. 다다음주 월요일에 만든걸 가지고 어디 가야 하는데.. 이래서 어케 만드나 싶네요.. 흑..

haze11의 이미지

select는 us, pseslect는 ns까지 되는 것 같은데요.
고해상도라 해서 ns일가 했는데, ms를 바라시는 거였군요 =.=

sadtale의 이미지

답변 감사합니다.

이게 실제로 설정 값은 ns 까지 가능한 것들이 있습니다만.. 돌려보면 그 시간이 보장이 안됩니다.
Real-Time 성 보장이 안된다는 얘기죠..

윈도우에서도 일반 타이머는 실제 정확하지가 않아서 MultiMedia Timer 를 썼더니 그나마 좀 나았거든요..
아래 분 답변처럼 10ms 정도이하로 정확성 보장이 어렵더라구요..

그래서 정밀 타이머라고 한거죠.. 1ms 까지 보장되는 타이머가 있나 해서..

IsExist의 이미지

real-time OS가 아닌 이상 msec 단위의 timer는 OS 레벨에서 보증하기 힘들겁니다.
보통 일반 OS에서는 스케줄러가 1/10 초 단위로 스케줄링을 하는지라.
---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

sadtale의 이미지

답변 감사합니다.

그래서 RTC 도 써 보고.. 이래저래 해 보는데.. 훔.. 잘 안되네요..
gettimeofday() 로 읽어와서 간격을 비교해 보고 있는데 이 함수로 시간 값 읽어오는 것 자체도
정확도가 떨어지는 걸까요?

8ms 로 맞춰서 돌려보면 2 ~ 25ms 까지 멋대로 왔다갔다 하네요.. 에효..
하드웨어적으로 8ms 마다 신호 내보내며 오실로스코프로 찍어봐야 할런지.. 떱.....

magingax의 이미지

RDTSC
명령이 가장 정확합니다

LISP 사용자모임
http://cafe.naver.com/lisper

LISP 사용자모임
http://cafe.naver.com/lisper
방송기술 개발업체
http://playhouseinc.co.kr

sadtale의 이미지

우선 답변 감사합니다.
RDTSC 를 검색해 봤는데 어떻게 써야 할 지 잘 모르겠네요..

지금은 Kernel 이 보니 우분투 기본 커널을 썼더니 include/asm/param.h 에 보니 HZ 가 100 으로 되어 있고,
커널 .config 에 보니 250 으로 설정되어 있더라구요..

그래서 HZ 값을 1000 으로 바꿔서 커널 컴파일 해서 사용해 보니 훨씬 나아 졌습니다.
다만.. fit-PC2i 를 쓰고 있는데 디스플레이 드라이버가 안잡히는군요. ㅋ

아무튼 답변 주신 분들 모두 감사합니다.

breadncup의 이미지

Architecture 가 Intel이라면, Time Stamp Counter (TSC)는 시스템 clock signal에 따라서 증가합니다.

이것을 읽는 Assembly Instruction은, rdtsc 입니다. c 나 커널에서는 rdtsc() 함수가 이 assembly코드를 수행하여 64Bit EDX:EAX 레지스터로 리턴합니다. 이 값을 c 의 memory변수로 카피하여 리턴해 주는 것이 rdtsc() 합수입니다.

이 값이 가지는 의미는 Pentium 4인지 Duo Core 인지등에 따라서 의미가 달라집니다. (이 카운터는 local CPU 마다 있습니다.) 예를 들어, TSC 가 내부 프로세서 clock에 의해서 동작하고, 그 clock이 800MHz 라고 가정한다면, rdtsc() * 1/(800*10^6) (즉, count 하나당 1.25ns) 로 second 를 구할 수 있습니다.

magingax의 이미지

CPU에서 clock tick 을 따는 RDTSC 와 frequency 를 가져오는 asm 코드가 있을껍니다. 이걸 쓰셔도되고..
window 계열이시면 queryperformencecounter 가 이기능을 하는 함수입니다..
그런데 원하시는게 일정 주기로 수행되는 스켸쥴러 같은거 같은데..
저도 그거 때문에 여러가지를 시험해봤는데..
그냥..
priority 높은 thread 안에서 SleepEx 써서 기다리다 깨어나게 하는게 그나마 정확했습니다.
thread pool 이나 다른 방법들은 이상하게 thread 가 깨어나는게 일정하지않고 튐니다.
이 방법도 50ms 정도까지는 정확한데..그 이하로 그닥 정확하지 않습니다..

최후의 방법은..
루프로 모든 리소스를 점유하고. 위에 설명드린 카운더로
매순간 카운더값을 확인하는 방법박에 없을듯합니다.
CPU 점유율이 엄청나서..사실상 쓰기는 좀..

LISP 사용자모임
http://cafe.naver.com/lisper

LISP 사용자모임
http://cafe.naver.com/lisper
방송기술 개발업체
http://playhouseinc.co.kr

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.