2013-04-27 8 views
2
void print_task(void) 
{ 
    for(;;) 
    { 
     taskLock(); 
     printf("this is task %d\n", taskIdSelf()); 
     taskUnlock(); 
     taskDelay(0); 
    } 
} 
void print_test(void) 
{ 
    taskSpawn("t1", 100,0,0x10000, (FUNCPTR)print_task, 0,0,0,0,0,0,0,0,0,0); 
    taskSpawn("t2", 100,0,0x10000, (FUNCPTR)print_task, 0,0,0,0,0,0,0,0,0,0); 
} 

위의 코드 쇼 :vxworks 멀티 태스크 환경에서 문자열을 인쇄하는 방법은 무엇입니까?

이 작업이이이이이이 작업 126,672,144 이 작업 1,266,721,441 26,738,208이 있습니다 작업입니다이 작업 126712667214438208

입니다 작업입니다 126,672,144 task126738208입니다 작업

멀티 태스킹에서 문자열을 인쇄하는 올바른 방법은 무엇입니까?

+0

당신은 고정 블록 내에서의 printf 버퍼를 플러시해야 할 수도 있습니다. – Vicky

+0

printf 바로 뒤에 "fflush (stdout)"을 추가했지만 여전히 성공하지 못했습니다. –

답변

1

문제는 taskLock()에 있습니다.

대신에 세마포어 또는 뮤텍스를 사용해보십시오.

+0

감사합니다. –

+0

하지만 printf가 taskLock과 taskUnlock간에 끊어 질 수있는 이유는 무엇입니까? –

+0

tasklock이 예상대로 작동하지 않습니다. 몇 년 전에 만났습니다. – Daniel

0

멀티 스레드 환경에서 인쇄하는 주된 아이디어는 인쇄 작업에 전용 작업을 사용하는 것입니다. 일반적으로 vxWorks에는 시스템의 모든 작업에서 로그 메시지를 가져 와서 한 작업에서만 터미널로 인쇄하는 로그 작업이 있습니다. vxWorks 로거 메커니즘의 주요 문제점은 로거 태스크가 매우 높은 우선 순위를 사용하고 시스템 타이밍을 변경할 수 있다는 것입니다.

따라서 다른 작업 (메시지 큐, 뮤텍스로 보호되는 공유 메모리를 사용하여 ...)을 통해 메시지를 가져 오는 우선 순위가 낮은 작업을 만들어야합니다. 이 경우 두 가지 큰 이점이 있습니다. 첫 번째 것, 모든 시스템 출력물이 하나의 단일 작업에서 인쇄됩니다.

시스템의 실시간 작업 중 가장 중요한 두 번째 이점은 printf() 기능을 사용하여 시간을 낭비해서는 안됩니다. 아시다시피 printf는 시스템 호출을 사용하고 추가 한 디버그 정보에 따라 작업 타이밍을 확실히 변경하는 매우 느린 기능입니다.

taskLock, taskLock은 커널에 명령으로 사용합니다. 이는 현재 실행중인 작업을 CPU에 준비 상태로 남겨 두는 것을 의미합니다.

예제 코드에서 작성한대로 taskUnlock() 함수에는 인수가 없습니다. 기본적인 이유는 시스템에서 커널 & 인터럽트가 taskUnlock을 수행 할 수있게하는 것입니다.

는 작업 잠금 해제를 수행하는 많은 시스템 호출이있다 (때로는 서비스 라우팅을 중단도 그것을 할)