스레드간 타이밍 동기

jkam7520의 이미지

안녕하세요 리눅스 초보 개발자입니다.

현재 제가 스레드를 2개를 사용하여

하나는 10ms 주기로 uart로 데이터를 내보내고
다른 하나는 1s 주기로 uart로 데이터를 내보내도록 코드를 아래와 같이 구현한 상태인데

Uart로 출력된 데이터를 보면
A_Tread 데이터 100개 -> B_Tread 데이터 1개의 순서로 나오는것이 이상적인데

A_Tread 데이터 180개 -> B_Tread 데이터 1개의 순서와 같이 타이밍이 맞지 않습니다.

리눅스를 많이 다뤄보지 못해 어느부분을 봐야하는지 조언 부탁드립니다.

A_Tread(){ // 10ms 주기
pthread_mutex_lock(&mutex);

//데이터 처리 로직
.....
//데이터 처리 로직

uart_write();
pthread_mutex_ulock(&mutex);

}

B_Tread(){ // 1s 주기
pthread_mutex_lock(&mutex);

//데이터 처리 로직
.....
//데이터 처리 로직

uart_write();
pthread_mutex_ulock(&mutex);

}

라스코니의 이미지

100ms 사이클은 어디에서 조정하나요?

jkam7520의 이미지

A_Tread(){ // 10ms 주기
while(){
pthread_mutex_lock(&mutex);

//데이터 처리 로직
.....
//데이터 처리 로직

uart_write();
pthread_mutex_ulock(&mutex);
usleep()//주기 조정
}
}

B_Tread(){ // 1s 주기
while(1){
pthread_mutex_lock(&mutex);

//데이터 처리 로직
.....
//데이터 처리 로직

uart_write();
pthread_mutex_ulock(&mutex);
usleep()//주기 조정

}

}

자료를 찾다보니 usleep으로하면 10ms이내의 타이밍 조절이 어렵다하여 타이머를 사용해서도 시도해보았는데도 동일한 증상입니다.

jick의 이미지

흠... usleep 앞뒤에서 gettimeofday를 불러서 현재 시간을 (마이크로초 단위로) 찍어보세요. 생각하지 않은 곳에서 시간을 보내고 있을 것 같은 느낌이 듭니다.

jkam7520의 이미지

답변 감사합니다. 참고하겠습니다.

라스코니의 이미지

요는 100회 호출되어야 하는데 180번 호출된다는 것인데요....
uart 기기에 쓰는 시간 + mutex unlock하는 시간 + usleep() < 10ms 가 안되는 이상한 상황입니다.
usleep(10ms)를 주셨으면 당연히 오차를 감안하더라도 100회 이하로 실행되어야 정상이죠.

nanosleep 함수를 한번 사용해 보세요.

jkam7520의 이미지

답변 감사합니다. 참고하겠습니다.

댓글 달기

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