c 언어 수~수십 ms 주기로 정확하게 루프 타이밍 제어하는 법 문의드립니다.ㅜㅠ

pasyati의 이미지

안녕하세요.!
C code로 정확한 주기를 갖는 루프를 구현하려는데,
잘 안되어 고수님들께 문의를 드리고 싶습니다.

일단 제가 LabVIEW에서 루프를 타이밍 제어할 때 "다음 ms 배수까지 기다림 함수" 를 사용하고 있습니다.
다음 ms 배수까지 기다림 함수: http://zone.ni.com/reference/ko-XX/help/371361L-0129/glang/wait_till_next_ms_multiple/

상기 함수는 유저가 정한 시간 [ex: 3 ms] 보다 루프(while 또는 for) 한 바퀴가
1. 빨리 끝날 경우 정해진 3 ms 까지 루프를 돌지 않고 기다리고 3 ms가 되면 다음 루프를 진행,
2. 늦게 끝날 경우 다음 번 6 (3x2) ms까지 기다렸다가 다음 루프를 진행합니다.

이 중 1.기능을 c code로 작성할 일이 생겼습니다.

찾아보니 sleep, usleep, delay, 같은 함수들은 단지 기다리기만 하고
루프 횟수가 증가하거나(100회 이상) 코드 실행시키는 타이밍에 따라서도
오차도 상당히 발생시키는 것을 확인했습니다....

clock()을 이용해서 시간을 측정한 후에 제가 원할 때 루프를 빠져나오게 하려니까
루프안에 또 clock()을 이용한 시간 측정용 루프를 넣어야 해서, 이건 아니다 싶습니다...

GUI 기반 LabVIEW 보다 C code가 이런 정밀한 타이밍 제어를 더 잘 할 것 같은데,
저 기능이 널리 알려져 있는데, 제가 찾지 못하는 것인지요...?

무지한 제게 힌트라도 주신다면 감사하겠습니다.!!!

라스코니의 이미지

동작 환경이 PC 환경인지, 클럭 소스가 있는 임베디드 보드인지 모르겠지만

PC 환경이라면 내부 클럭을 쓸수 밖에 없습니다. wall time 이라고도 하고 Zulu time 이라고도 합니다.
임베디드 보드에는 보통 리얼 타임 클럭이 있으니 그것을 사용하게 되실 것이고

ms 단위로 제어하려면 타이머 이벤트를 쓰는 것이 한 방법입니다.
while(), for() 루프는 정확하게 제어가 안됩니다. OS 또는 개발환경 라이브러리에서 제공하는 타이머 callback 이벤트를 쓰는게 젤루 속시원합니다.
이것도 아주 정확하지는 않습니다. 아주 정확하게 할려면 VxWorks 같은 실시간 OS를 써야 합니다.

C 코드가 그런 것을 지원하는 것이 아니라 OS 나 개발환경 라이브러리가 지원해야 합니다.

익명 사용자의 이미지

개발환경은 라즈베리파이2에 설치된 라즈비안os입니다.
임베디드보드가 아닌 경우 os에 따라 타이밍에 제약이 많다는 것을 알게 되었습니다.
콜백을 공부해보고 있습니다. 감사합니다

라스코니의 이미지

구글링 해보니 라즈비안이 Linux 계열인 OS 인 것 같네요.

RTEMS를 올려 보세요. 라즈베리파이2에 올리는 관련 자료도 많고 OS 자체가 RTOS 이기 때문에 Timer 관련 API 도 많습니다.
근데 OS가 좀 크고 복잡합니다.

아래 참고하세요.

https://www.socallinuxexpo.org/sites/default/files/presentations/Steven_Doran_SCALE_13x.pdf

shint의 이미지

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

익명 사용자의 이미지

참고해서 잘 읽어보겠습니다. 답변 감사드려요

thinxs의 이미지

이건 Windows 환경에서만 사용할 수 있는 함수들이고, 다른 플랫폼을 사용하신다면 접근 방법을 달리 해야 합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.