2008-09-27 2 views
2

레거시 임베디드 시스템은 협업 멀티 태스킹 스케줄러를 사용하여 구현됩니다.VxWorks에서 협업 멀티 태스킹 시스템을 구현할 수 있습니까?

시스템은 기본적으로 다음과 같은 라인을 따라 작동합니다

  • 태스크 A는 태스크 A가 완료되면,이 프로세서를 산출
  • 작동한다.
  • 작업 B가 프로세서를 가져 와서 작동합니다.
  • 작업 B는
    ...
  • 작업 N
  • 작업 A는 예정 도착 수익률을 산출하고 작동합니까

하나의 큰 원형 큐 : A -> B -> C -> ... -> n -> A

시스템을 새로운 플랫폼으로 이식하고 시스템 재 설계를 최소화하고자합니다.

vxWorks에서 이러한 유형의 협업 멀티 태스킹을 구현할 수있는 방법이 있습니까?

답변

2

VxWorks는 우선 순위 기반 운영 체제이지만 이러한 유형의 협업 멀티 태스킹을 구현할 수 있습니다.

모든 작업을 에 동일하게 입력하십시오.이 우선합니다.
코드에서 수율을으로 지정하면 'taskDelay (0);'

커널 시간 분할이 비활성화되어 있는지 확인해야합니다 (kernelTimeSlice (0)).

동일한 우선 순위의 모든 작업은 대기열에 있습니다. 작업이 발생하면 대기열의 끝에 놓입니다. 이는 설명 된 알고리즘 유형을 구현합니다.

0

이것은 VxWorks에만 국한된 것은 아니지만, 설명한 시스템은 라운드 로빈 스케줄링의 변형입니다 (우선 순위 대기열을 사용하고 있다고 가정합니다. 그렇지 않으면 라운드 로빈 스케줄링입니다).

wiki article은 약간의 배경을 제공하고 거기에서 갈 수 있습니다.

행운을 낸다

2

나는 이것을 한 비교적 큰 끼워 넣어 진 제품에 한 번 종사했다. 타임 슬라이싱이 비활성화되었고 스레드는 다른 스레드가 실행될 수 있도록 명시 적으로 taskDelay를 지정합니다.

결론 : vxWorks 슬라이스를 사용하지 않도록 설정하면 광기가 발생합니다. 그렇게 할 능력이 있다면 피해야합니다.

작업이 전체적으로 비 선점 적이기 때문에 (그리고 인터럽트 처리기는 일반 작업이 사용하기 위해 메시지를 대기열에 넣기 만 허용됨) 시스템은 모든 데이터 구조에 대해 어떤 종류의 잠금도 필요하지 않게되었습니다. 모든 데이터 구조가 일관성이 있다면 태스크는 스케줄러를 다른 태스크로 릴리스 할 것으로 예상됩니다.

시간이 지남에 따라 원래 프로그래머는 새로운 개발자로 교체되었으며 제품을 유지 보수하고 연장했습니다. 시스템이 더 많은 기능을 갖추면서 시스템 전체가 응답 성이 떨어졌습니다.새로운 개발자가 너무 오래 걸린 작업에 직면했을 때 간단한 해결책을 취할 것입니다. 중간에 taskDelay를 삽입하십시오. 때로는 괜찮 았고 때로는 그렇지 않았습니다 ...

작업 분할을 사용하지 않도록 설정하면 시스템의 모든 작업이 다른 모든 작업에 종속되도록 만듭니다. 3 가지 이상의 작업이 있거나 심지어이 결국 세 가지 이상의 작업이있을 것이라고 생각하면 , 실제로이를 허용하는 시스템을 구성해야합니다.

0

은 무엇 당신이 설명하는 것은 본질적으로 :

void scheduler() 
{ 
    while (1) 
    { 
     int st = microseconds(); 
     a(); 
     b(); 
     c(); 
     sleep(microseconds() - st); 
    } 
} 

이미 스케줄러가없는 경우, 지금 하나를 구현하는 좋은 시간입니다. 가장 간단한 경우, 각 진입 점은 Task 클래스에서 다중 상속되거나 Task 인터페이스를 구현할 수 있습니다 (언어에 따라 다름).

+0

리처드, 나는 대답을 좋아하지만 질문은 특히 vxWorks와 관련이 있습니다. 따라서 이미 스케줄러가 있습니다. – Benoit

0

같은 우선 순위의 모든 작업을 수행하고 작업 지연 (0)을 사용하거나 사전 준비 작업을하지 않아도되는 우선 순위가 낮은 작업에서 tasklock 및 taskunlock을 사용할 수 있습니다.

관련 문제