system time이 빨리 갑니다. 조금만 느리게 가게 할 수 없을 까요?

blueblue의 이미지

임베디드 시스템에 올린 리눅스의 system time이 한국표준과학연구원(http://www.kriss.re.kr)에서 제공하는 표준시간에 비해 평균 하루 10초 정도씩 빨리 가고 있습니다. 제품에 있는 RTC는 하루 평균 1~2초 정도가 빨라지고요...
그래서 RTC는 그냥 두고, 리눅스 시스템 타임을 느리게 가도록 하고 싶습니다.
시스템 타임도 타이머로 돌아가면서 1초씩 시간을 업데이트 할 것 같은데... 타이머 간격을 늘리면 되지 않을까요?
어디서 늘리는 지도 잘 모르겠지만...
시스템 타임을 느리게 가게하는 것이 가능한 것인지도 알고 싶구요.
아시는 분 답변 부탁 드립니다.

vacancy의 이미지


느리게 가게 하는 것은 아무래도 불가능한 것 같네요.
들어가는 클럭이 아무래도 정상적인 주기를 갖지 않은 것 같습니다.

ntp 등을 cron 등록해서 주기적으로 시간을 서버와 맞추거나
주기적으로 시간을 (규칙을 갖고) 조정하는 수밖에 없을 것 같네요.

후자는 그나마도 정확히 된다고 보장은 못하겠죠.

blueblue의 이미지

cron 등록하는 방법 말고 직접 시스템 타임을 느리게 가는 방법은 정말 없는 건가요?
시스템 타임이 cpu의 클럭을 가지고 계산되는 거라면 안될 거같기는 한데...
시스템 타임은 직접 cpu클럭을 알아내서 hz만큼 지나면 1초가 지났다고 표시해 주는 건가요?
timer가 돌면서 timer intterupt에 의해 셋팅되는 거라면 interrupt 주기를 조정하면 되지 않을 까요?

blueblue의 이미지

CPU clock으로 연산하여 1씩 더하는 거라면 연산하는 부분을 수정하면 느리거나 빠르게 조정할 수 있지 않을까요?
현재 kernel/time.c를 보고있기는 한데...
혹시 연산하는 code가 있는 곳을 아시는 분은 알려 주시기 바랍니다.

lugi의 이미지

임베디드 시스템에서 그정도 오차가 나는건 오실레이터나 크리스털이 불량일 가능성이 큽니다.
하드웨어 엔지니어에게 바꿔달라고 하세요, 저가 부품일경우 제품별 편차가 꽤 있을수 있습니다.

만일 파트별 편차가 없는데도 모든 보드에서 동일하게 느리게 동작한다면.. BSP등의 설정 오류입니다.
--------------------------------------------------------------------------------------
조금씩이라도 전진한다.

--------------------------------------------------------------------------------------
조금씩이라도 전진한다.

ktd2004의 이미지

adjtimex 명령어를 사용해 보시면 어떨까요?

blueblue의 이미지

소스를 뒤져본 결과 kernel/time/timekeeping.c 에 있는 update_wall_time() 함수에서 offset 변수와 clock->cycle_interval을 비교하여 증가된 offset이 clock->cycle_interval 보다 크면 xtime.tv_sec를 하나씩 증가시켜 시간을 업데이트하는 것 같습니다.
clock->cycle_interval을 print문으로 찍어 본 결과 13,500,000이라는 값을 갖고 있습니다.
이 값을 변경하면 시간 업데이트 주기를 바꿀 수 있을 것 같습니다.
그런데 문제는 clock->cycle_interval을 셋팅하는 부분을 못찾겠다는 겁니다.
grep으로 아무리 뒤져도 사용되는 부분만 나오지 셋팅하는 부분은 못찾겠네요.
혹시 아시는 분 계신가요? 아니면 다른 아이디어가 있으신 분은?
거의 다 온거 같은데 마지막에서 또 막히네요..

Hyun의 이미지

예전 경험으로 bootloader에서 부팅할 때 커널쪽에 타이머의 클럭속도랑 CPU 클럭속도 등을 구조체로 넘겨주는부분이 있었는데, 거기서 타이머쪽 클럭을 적당히 조정하면 되지 않을까 “생각만” 해봅니다.


나도 세벌식을 씁니다
bushi의 이미지

tick 이 10ms 고정이라고 했을 때,
하루에 24*60*60*100=8640000 번의 tick 이 발생해야 정확합니다.

하루 10초 빨리간다는 것은 8640000 + 1000 번의 tick 이 발생한다는 얘기고,
다시말하면 tick 당 대략 0.000115741 초의 오차를 가진다는 얘기고,
즉 10ms 간격이 아니라 9.884259259 ms 정도의 간격으로 tick 이 발생한다는 얘기죠.

커널에서 CPU 의 어떤 놈을 OS timer 로 사용하는 지 모르겠지만,
그 타이머에 공급되는 peripheral 클럭과 타이머 레지스터의 설정값만을 사용해서
정확한 10ms 주기의 인터럽트를 만들어내지 못한다면... 이런 오차는 어쩔 수 없습니다.
수십us ~ 수백us 의 오차라 할지라도 계속 누적되겠죠.

커널은 내부적으로 RTC 와 동기화 시키려는 시도를 합니다(최소한 2년 전에는 그랬습니다).
단, 사용자에 의해 시스템 시간이 바뀐다면 그 시점 이후론 시도를 하지 않습니다.
그러므로, 어플리케이션이 주기적으로 RTC를 참조해서 동기를 맞추던가,
외부 time 서버를 참조해서 동기를 맞추는 방법 밖엔 없습니다.

CPU 의 내장 RTC 도 100% 신뢰할 만한 것은 아니지만,
하루에 1초 이상이라면 CPU 에 버그가 있거나 RTC 에 공급되는 클럭이 비정상입니다.

외부 time 서버... 꼭 네트웍을 통하는 것만을 말씀드리는 것이 아닙니다.
CDMA 기지국이나 GPS 위성에서 보내주는 정보에도 시각정보는 들어있습니다.

아무 것도 기댈 곳이 없다면, 통계를 내서 주기적으로 강제 설정을 시도하는 수 밖에 없습니다.
CPU sleep/wakeup 까지 고려한다면,
시스템 시간 뿐만 아니라 RTC 도 통계를 근거로 강제설정하는 것을 병행해야 합니다.
얼마동안이나 sleep 상태에 있었는 지 알아낼 수 있는 방법은 RTC 가 유일하기 때문인데요,
wakeup 후 누적오차를 계산해서 일괄적용하려면 어쩔 수 없습니다.

OTL

blueblue의 이미지

음~ 자세한 설명 감사드립니다.
일단은 CPU datasheet를 좀더 살펴보고 타이머 인터럽트 주기 셋팅하는 부분이 있는 지 확인해 보아야겠네요.
이걸로 해결이 됐으면 좋겠읍니다.

송효진의 이미지

blueblue의 이미지

좋은 정보 감사합니다.
하지만 적용되는 것이 임베디드 제품인지라 몇달씩 보정을 하고서 제품 출하를 하기는 어렵구요, 제품이 나간곳에 네트웍이 안되는 곳도 있을 것이기에 적용하기는 어려울 것 같네요.

댓글 달기

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