2014-01-20 3 views
0

Linux 시스템에서 50msec의 대기 시간이 정상이라고 생각하십니까?Excessive Linux Latency

많은 스레드가있는 프로그램이 있는데, 하나의 스레드는 모터와 광전지가있는 개체의 움직임을 제어합니다.

나는 minimun 대기 시간을 얻기 위해 많은 것을 만들었지 만, 항상 개체에서 위치 오류를 일으키는 50msec를 얻습니다.

것들 내가 그랬어 : - photeocell 제어 스레드의 스레드 우선 순위 - 좋은 기능 -20 에 : SCHED FIFO, 99 - 커널 구성 : CONFING_PREEMPT = Y - mlockall (MCL_CURRENT | MCL_FUTURE);

여러 번, 나는 광전지를 기다리는 데 50 밀리 초가 걸린다. 나는 problema가 내 스레드 인 이 아니라 커널에서 프로세스라고 생각한다.

이 지연 시간을 줄일 수 있습니까? 50 밀리 초의 추가 시간을 누가 알 수 있습니까?

포토 셀을 제어하는 ​​스레드는 많은 "읽기"기능을 수행합니다. 이로 인해 문제가 발생할 수 있습니까?

/* ** * ** * ** */

지금에 상황은 다음과 같습니다 은 하나의 스레드 만 찾고, 무한 빈 루프를 실행하고 있습니다 시작시 루프의 끝에서 루프를 시작합니다. 디스크에 액세스 할 수 없으며 GPIO에 액세스하지 않고 직렬 포트없이 액세스 할 수 있습니다. 루프는 많은 경우 50 밀리 초를 소비합니다.

cpuaffinity를 설정하지 않았으므로 프로세서에 핵이 하나만 있습니다.

+0

빠른 질문 - 당신은 cpuaffinity를 설정 했습니까? 어디서 읽었습니까 (디스크? I/O 컨트롤러? tmpfs?)? –

+0

광전지 신호가 프로그램에 어떻게 도달합니까? GPIO, 시리얼 포트, 전용 하드웨어가 있습니까? – rodrigo

+0

아마도보고있는 것은 실제로 대기 시간이 아니라 클럭 소스의 _ 입도입니다. – rodrigo

답변

0

나는 내 프로그램에서 테스트를 해왔다. 나는 대기 시간이 약 1 mseg을 감소이 라인을 주석 경우

struct sched_param lsPrio; 

lsPrio.sched_priority = 1; 
if (sched_setscheduler (0, SCHED_FIFO, &lsPrio) != 0) 
    printf ("FALLO sched_set\n"); 

: 프로그램이 스레드를 스타 전에 이, 그 원인 드 (50) mseg 지연의 주요 기능의 코드입니다.

왜 이러한 라인이 대기 시간을 유발합니까?

+0

이 스레드가 작업을 수행하면 당연히 다른 스레드에서 대기 시간이 발생할 것입니다. 커널이 완료 될 때까지이 스레드를 스케쥴하고, 어떤 일반 스레드로도 점유하지 않도록 커널에게 명령합니다. 그러나 이것은 원래의 문제가 아닙니다. – Damon

관련 문제