2012-06-12 1 views
1

vxworks 작업으로 CPU가 최단 시간 동안 최하위 작업을 수행하는 방법은 무엇입니까?VxWorks 작업은 어떻게 하나의 멀티 태스킹 사이클에 대해 우선 순위가 낮은 다른 모든 작업을 실행할 수 있습니까?

작업이 1ms 미만 동안 CPU를 포기하게하는 방법이 있습니까?

우선 순위가 낮은 다른 작업을 실행하는 유일한 방법은 taskDelay (n)입니다 (n> = 1).

저는 항상 taskDelay (0)가 우선 순위가 같거나 더 높은 다른 모든 작업을 실행한다고 가정했습니다.

taskDelay (1)는 우선 순위가 낮은 모든 보류중인 작업을 최대 1ms 동안 실행할 수있게합니다.

답변

2

높은 우선 순위의 작업 것이다 항상 실행, 그것은 준비가되어, 당신은 등 taskLock() 또는 intLock()을 호출되지 않은 경우, 그래서 당신은 높은 우선 순위 작업이 실행 수 있도록 taskDelay()에 필요가없는 경우.

taskDelay(0) 대기열의 준비 대기열 의 뒤쪽에 현재 작업을 배치합니다. 그것은 그 우선 순위 유일한 작업 인 경우에는 즉시 그 우선 순위에 대한 준비 큐의 뒤쪽에있는 현재 작업을 배치합니다 관계없이 우선 순위가 낮은 작업

taskDelay(n>0)의 존재 을 재조정 될 것이다 n 틱에 대해 다시 스케줄되지 않습니다. 이렇게하면 우선 순위가 낮은 준비 작업을 실행할 수 있습니다.

taskDelay()의 매개 변수는 틱이 아니라 ms입니다. 이 길이는 시스템 클럭 속도 (sysClkRateSet()으로 설정하고 sysClkRateGet()으로 읽음)를 기준으로 결정할 수 있습니다. 1 tick 은 1ms이지만, 시스템 클럭 속도가 1000 인 경우. 아마도 그럴 수 없습니다.

참고 :이 시스템 시계는 CPU 주파수와 다릅니다.

1

예를 들어 각 semGive(), 각 시스템 시계 틱 및 taskDelay()와 같이 스케줄러를 강제 실행하는 특정 이벤트가 VxWorks에 있습니다. taskDelay()의 인수는 시스템 클럭의 틱입니다. sysClkRateGet()은 시스템 클럭 속도를 반환합니다.

예를 들어 sysClkRateGet()이 10을 반환하면 각 시계 틱은 100ms입니다. taskDelay (1)를 호출하면 다음 시스템 틱 때까지 잠자기 상태가됩니다. 그러나 이는 100ms 슬리 프를 보장하지는 않지만 다음 클럭 틱이 절박한 경우 최대 100ms 또는 최소 0ms의 슬립을 보장합니다. taskDelay (2)를 호출하면 다음 시계 틱 (0-100ms 사이의 시간)과 다음 클록 틱 (100ms 보장)까지 작업이 잠자기 상태가되어 100ms와 100ms 사이의 총 지연이 발생합니다. 200 ms.

VxWorks의 타이밍은 많은 고려 사항을 가지고 있으며, 이것이 일부 세부 사항을 설명하는 데 도움이되기를 바랍니다.