taskYIELD
에 대한 문서가 있습니다. 이 함수는 컨텍스트 전환을 요청하는 데 사용할 수 있으므로 틱을 기다릴 필요가 없습니다. 컨텍스트 전환은 권한이 부여 된 작업이므로 소프트웨어 인터럽트로 수행되는 경우가 많습니다. 귀하의 경우 PendSV와 SVCall.
모든 작업이 차단 된 경우 (예 : vTaskDelay
) FreeRTOS는 Idle Task입니다. vTaskDelay
은 portYIELD
을 내부적으로 사용하여 컨텍스트 전환을 요청합니다. 현재 작업을 계속 수행 할 방법이 없기 때문입니다.
해당 모드에서 FreeRTOS를 이해하려면 Preemptive multitasking에 대해 알고 있어야합니다.
편집 2016년 1월 29일 :
- 호출 지연 기능은 내부적으로
taskYIELD
/portYIELD
를 호출됩니다. 따라서 현재 작업이 차단되고 FreeRTOS가 우선 순위가 가장 높은 작업으로 다시 일정을 잡을 수 있습니다.이 작업은 실행할 수있는 작업이 없으면 실행될 수도 있고 (차단되지도 않음) 유휴 상태 일 수도 있습니다.
- 예 :
xQueueReceive
에는 두 가지 가능성이 있습니다. 큐에 몇 가지 요소가 있으므로 POPed입니다. 대기열에 요소가 없으므로 작업이 blocked state으로 전환되고 YIELD가 호출되므로 FreeRTOS가 다른 작업으로 다시 예약됩니다.
- 예 :
xQueueSend
에는 두 가지 가능성이 있습니다. 대기열에 공간이 없으므로 공간이 확보 될 때까지 작업이 차단됩니다. 적어도 하나의 무료 요소가 있으므로 대기열로 이동할 수 있습니다.
대기열에서 보내는 요소 또는 대기열로 보내는 요소는 다른 상위 우선 순위 작업을 깨울 수 있습니다. 즉, 작업을 수행 중이지만 현재 차단되어 있습니다. FreeRTOS는 즉시이를 다시 스케줄합니다.
이것은 인터럽트 처리기에서도 수행 할 수 있습니다. 일부 큐에서 대기중인 핸들러 태스크를 가질 수 있습니다. 인터럽트에서, 당신은 어떤 요소를 큐에 넣는다. 인터럽트가 끝나면 FreeRTOS는 대기열에서 대기중인 작업으로 다시 스케줄합니다. 해당 작업에 우선 순위가 충분해야한다는 전제 조건이 있습니다. 이것은 인터럽트에서 많은 것을하지 않는다는 이점이 있습니다. 즉, 정리 작업과 대기열에 항목 보내기 중입니다. 이는 짧은 작업입니다. 인터럽트 처리는 xTimerPendFunctionCallFromISR
까지 수행 할 수도 있습니다. 이는 인터럽트를 처리하는 또 다른 방법입니다.
FreeRTOS fundamentals에 대해 읽으십시오. 그것에 관한 몇 가지 장이 있으며 그것은 interresting reading입니다.
정확히 무엇인지 묻지는 못하지만 시간 조각이 끝나기 전에 스레드가 프로세서를 양도하면 RTOS가 즉시 스케줄러를 실행해야합니다. –
@FiddlingBits 예, 그렇습니다.하지만 설명서에는이 추적 내용이 없습니다. 매주기 틱마다 실행되는 ISR에 대해서만 이야기하지만 틱간에 발생하는 컨텍스트 전환은 어떻습니까? 스케줄러가 인계 받아 컨텍스트 스위칭을 수행합니까? 그렇다면 인터럽트 (소프트웨어)가 실행 되려고합니까? – Luca
SVC는 더 이상 최신 M0 포트에서 사용되지 않습니다. 그러나 SVC 인터럽트가 실제 컨텍스트 스위칭을 수행하기 위해 PendSV 인터럽트를 트리거하고 있다고 예상합니다. –