리눅스에서의 실시간 어플리케이션 처리

jaspe의 이미지

Intel Xscale PXA255 에 리눅스를 운영체제로 한 통신장비를
개발하고 있는데요, 간단한 동작인데 제가 생각하는 대로 동작하질
않네요.

CPU 2개가 중간에 있는 외부 메모리(DPRAM)를 통하여 서로 데이터를
주고 받는데요, 환형큐처럼 동작시키고 있습니다.
어떤 루틴인가 하면, 외부 메모리의 특정주소에 데이터가 들어있음을
알려주는 flag 값이 들어있는데 데이터가 대략 90ms마다 주기적으로 들어오고
따라서 flag도 이때마다 setting되거든요, 이걸 90ms보다 짧은 주기로
읽어서 flag가 ON일때 데이터를 처리해야 하는데 제대로 처리하지 못합니다.
음성데이터인데 소리가 안들리네요. 사실 90ms안에만 flag를 읽어내면
문제가 없을것 같은데 그게 안되네요. 다른 쓰레드는 메인함수에서 할일없이
sleep(10)하고 있는 놈 하나 있습니다.
쓰레드를 띄워서 flag를 체크하도록 했구요 flag가 ON이면 데이터를
처리하고 OFF이면 nanosleep(10ms)를 주었습니다.
아래 코드는 대략 제가 짠 쓰레드 내용입니다.

void TxAudio()
{
  while(1)
  {
     if(ReadFlag() == ON)
     {
         데이터 처리
     }
     else
     {
         nanosleep(10ms);
      }
   }
}

Preemption patch를 적용했는데 쓰레드의 priority같은걸 설정할 수 있나요?

지난번 개발에서는 VxWorks를 썼었는데 그땐 이런 문제가 전혀 없었는데
리눅스를 제가 잘 몰라서 그런지 이 문제에 막혀서 더이상 진도가
안나갑니다.
경험 있으신 분들의 도움을 좀 부탁드립니다.

hb_kim의 이미지

Xscale 리눅스에 비대칭 멀티프로세서(맞나요?), 공유 메모리를 사용하는 리얼타임 애플리케이션이라...

꽤 비싼 컨설턴트가 필요하시겠군요. :twisted:

이 문제만 대충 넘기시려면 링버퍼 크기를 아주 크게해서 읽는 주기가 조금 늦어져도 별 지장이 없도록 하시구요.

이 문제만 완벽히 해결하시려면 간단한 디바이스 드라이버를 어디선가 복사해와서 타이머 인터럽트나, 프로세서간 인터럽트를 써서 데이터를 전송하도록 고치시고요.

이런 유형의 문제가 앞으로도 많이 발생할것이라고 생각되면, RTLinux 를 검색해서 한번 검토해보십시오.

jaspe의 이미지

비대칭 프로세서(?)는 아니구요.
같은 프로세서입니다. 한놈은 열심히 코덱을 돌리구요,
다른 한놈은 코딩된 음성과 영상 데이터를 받아서 전송하는 역할을 하지요.

근데 전송하는 역할을 하는 놈이 문제입니다.
적당히 쓰레드를 깨워줄 누군가가 없기 때문에 쓰레드에서 자체적으로
sleep을 주어 깨게 한건데 이게 잘 동작하질 않네요.
그래서 다른 타임 이벤트를 발생하는 쓰레드를 하나 더 두어서
이놈은 nanosleep만 하고 있다가 signal을 발생시키구요,
실제 데이터를 읽어와야 하는 놈이 이 signal을 받게 했더니 어찌어찌
돕니다요. -_-;

근데, 이상하면서도 궁금한게 있는데요,
지금 현상이 타임 이벤트를 wait 하고 있는 쓰레드(즉, signal을 받아
데이터를 처리하는 놈)에 프린트문을 넣으면 어찌어찌 동작하는데
프린트문을 넣지 않으면 아예 일을 안하는군요.
도대체 어떻게 된 일일까요?

leonhan의 이미지

아마 printf 문 때문이 아니라 sleep을 주어야 똑같이 동작할 겁니다.
즉 printf가 sleep 역활을 하는 거지요 .
thread의 경우 한 thread가 수행시 다른 thread가 멈추어야 하므로 절절하게 thread 관리를 해주어야 합니다.
확실하게 돌릴려고 하면 sleep으로 하는게 아니라 wait cond 등으로 확실하게 해야지요 .

댓글 달기

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