2017-01-27 2 views
1

FreeRTOS를 사용하여 프로젝트를 진행하고 있으며 설명서를 읽고 있는데 이해할 수없는 부분이 있습니다. 컨텍스트 스위칭이 틱 인터럽트가 트리거되면서 발생하므로 스케줄러는 작업을 수행하고 이벤트를 기다리고 있던 작업의 차단을 해제하고 준비 상태에있는 우선 순위가 높은 작업을 선택합니다. 하지만 틱이 인터럽트되기 전에 작업이 차단되면 어떻게됩니까? 설명서에는 컨텍스트 스위치가 즉시 적용된다는 힌트가있는 것 같습니다 (예 : vTaskDelay()를 호출하여 CPU 시간 슬라이스를 비우는 우선 순위가 다른 두 작업). 어떻게됩니까? 검색했지만 내 질문에 대한 답을 찾을 수 없습니다. portYIELD() 매크로 단순히 SVCall 예외 요청 사용된다 FreeRTOS 내 포트 (SAMD21 텍스 M0 +)에FreeRTOS 컨텍스트 전환

EDIT, 그래서 문맥 스케줄러 실행 따로 (스위칭을 수행하기 위해 사용되는이 메커니즘이며 틱 인터럽트)?

+1

정확히 무엇인지 묻지는 못하지만 시간 조각이 끝나기 전에 스레드가 프로세서를 양도하면 RTOS가 즉시 스케줄러를 실행해야합니다. –

+0

@FiddlingBits 예, 그렇습니다.하지만 설명서에는이 추적 내용이 없습니다. 매주기 틱마다 실행되는 ISR에 대해서만 이야기하지만 틱간에 발생하는 컨텍스트 전환은 어떻습니까? 스케줄러가 인계 받아 컨텍스트 스위칭을 수행합니까? 그렇다면 인터럽트 (소프트웨어)가 실행 되려고합니까? – Luca

+0

SVC는 더 이상 최신 M0 포트에서 사용되지 않습니다. 그러나 SVC 인터럽트가 실제 컨텍스트 스위칭을 수행하기 위해 PendSV 인터럽트를 트리거하고 있다고 예상합니다. –

답변

3

taskYIELD에 대한 문서가 있습니다. 이 함수는 컨텍스트 전환을 요청하는 데 사용할 수 있으므로 틱을 기다릴 필요가 없습니다. 컨텍스트 전환은 권한이 부여 된 작업이므로 소프트웨어 인터럽트로 수행되는 경우가 많습니다. 귀하의 경우 PendSV와 SVCall.

모든 작업이 차단 된 경우 (예 : vTaskDelay) FreeRTOS는 Idle Task입니다. vTaskDelayportYIELD을 내부적으로 사용하여 컨텍스트 전환을 요청합니다. 현재 작업을 계속 수행 할 방법이 없기 때문입니다.

해당 모드에서 FreeRTOS를 이해하려면 Preemptive multitasking에 대해 알고 있어야합니다.

편집 2016년 1월 29일 :

  • 호출 지연 기능은 내부적으로 taskYIELD/portYIELD를 호출됩니다. 따라서 현재 작업이 차단되고 FreeRTOS가 우선 순위가 가장 높은 작업으로 다시 일정을 잡을 수 있습니다.이 작업은 실행할 수있는 작업이 없으면 실행될 수도 있고 (차단되지도 않음) 유휴 상태 일 수도 있습니다.
  • 예 : xQueueReceive에는 두 가지 가능성이 있습니다. 큐에 몇 가지 요소가 있으므로 POPed입니다. 대기열에 요소가 없으므로 작업이 blocked state으로 전환되고 YIELD가 호출되므로 FreeRTOS가 다른 작업으로 다시 예약됩니다.
  • 예 : xQueueSend에는 두 가지 가능성이 있습니다. 대기열에 공간이 없으므로 공간이 확보 될 때까지 작업이 차단됩니다. 적어도 하나의 무료 요소가 있으므로 대기열로 이동할 수 있습니다.

대기열에서 보내는 요소 또는 대기열로 보내는 요소는 다른 상위 우선 순위 작업을 깨울 수 있습니다. 즉, 작업을 수행 중이지만 현재 차단되어 있습니다. FreeRTOS는 즉시이를 다시 스케줄합니다.

이것은 인터럽트 처리기에서도 수행 할 수 있습니다. 일부 큐에서 대기중인 핸들러 태스크를 가질 수 있습니다. 인터럽트에서, 당신은 어떤 요소를 큐에 넣는다. 인터럽트가 끝나면 FreeRTOS는 대기열에서 대기중인 작업으로 다시 스케줄합니다. 해당 작업에 우선 순위가 충분해야한다는 전제 조건이 있습니다. 이것은 인터럽트에서 많은 것을하지 않는다는 이점이 있습니다. 즉, 정리 작업과 대기열에 항목 보내기 중입니다. 이는 짧은 작업입니다. 인터럽트 처리는 xTimerPendFunctionCallFromISR까지 수행 할 수도 있습니다. 이는 인터럽트를 처리하는 또 다른 방법입니다.

FreeRTOS fundamentals에 대해 읽으십시오. 그것에 관한 몇 가지 장이 있으며 그것은 interresting reading입니다.

+0

작업이 차단되면 taskYIELD()를 호출 할 필요가 없습니다. 작업이 차단 된 경우 어떻게 할 수 있습니까? – Richard

+0

작업이 차단되면 작업이 차단되어 작업에서 호출하는 방법이 없습니다. RTOS가 차단 된 작업을 실행하고 있지 않습니다. – j123b567

1

TaskDelay와 같은 OS 호출이나 항목을 대기열로 보내거나 자원을 확보 할 때마다 다른 다른 작업이 실행 준비가되면 OS가 작동하고 더 높은 우선 순위 작업을 실행할 준비가되면 현재 작업을 비 웁니다. 기본적으로 실행 준비가 된 가장 우선 순위가 높은 작업이 실행됩니다. 시간 슬라이스는 같거나 높은 우선 순위의 태스크가 두 개 이상 실행될 때만 발생합니다.

예 인터럽트가 실행됩니다. 피질 -m에서 PENDSV 인터럽트는 컨텍스트 스위치를 수행합니다.

+0

ok, vTaskDelay()를 호출하면 현재 태스크가 taskYield()를 호출하고 (소프트웨어) 인터럽트가 트리거되어 스케줄러가 작업을 수행하게됩니다. 항목을 대기열에 두거나 (또는 ​​바이너리 세마포어 또는 다른 동기화 이벤트를 주면) 커널은 다른 우선 순위가 높은 작업이 해당 대기열에서 대기 중인지 확인합니다. 이 모든 경우에 매번 검사를 수행하고 결과적으로 인터럽트를 트리거하는 함수가 호출 되었습니까? – Luca

+0

나는 그것이 꽤 정확하다고 생각한다. 호출 된 함수는 스케줄러를 호출하고 그 함수를 수행합니다. 외부 인터럽트는 OS 호출을 만들어 다른 작업을 준비시킬 수 있습니다. –

1

현재 실행중인 작업이 차단 될 때 다른 작업으로 전환하려면 어떻게해야합니까? 아니면 컨텍스트 스위치가 수행되는 방식에 대해 묻고 있습니까? 그것의 정말로 명확하지 않은.

하나의 작업이 차단되었을 때 다른 작업으로 전환하는 방법을 묻는다면 그 대답은 무의미합니다. 이것이 RTOS가 당신을 위해 무엇을하는지에 대한 기초입니다. 예를 들어 vTaskDelay()를 호출하거나 차단 시간을 지정하여 xQueueReceive()를 호출하면 작업이 차단됨 상태가됩니다. 태스크가 Blocked되면, 실행될 수 없으므로, RTOS의 스케줄링 알고리즘은 다음 태스크를 선택하고 실행중인 태스크를 시작합니다.

+0

나는 관련된 역학을 알고 싶다. 어떻게됩니까? – Luca

+0

@ 루카 [내 대답] (http://stackoverflow.com/questions/41898581/freertos)에서 제안하고있는 [FreeRTOS 기초] (http://www.freertos.org/implementation/main.html)를 읽어보십시오. -context-switching/41899897 # 41899897). – j123b567