Я пытаюсь понять, почему пользователь должен вызывать метод taskYIELD_FROM_ISR()
и почему он не вызывается автоматически ОСРВ в рамках метода xStreamBufferSendFromISR
.
Мой вопрос относится к FreeRTOS_Manual p. 369.
/* A stream buffer that has already been created. */
StreamBufferHandle_t xStreamBuffer;
void vAnInterruptServiceRoutine( void ) {
size_t xBytesSent;
char *pcStringToSend = "String to send";
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
/* Attempt to send the string to the stream buffer. */
xBytesSent = xStreamBufferSendFromISR(xStreamBuffer,(void *) pcStringToSend,strlen( pcStringToSend),&xHigherPriorityTaskWoken);
if(xBytesSent != strlen(pcStringToSend)){
/* There was not enough free space in the stream buffer for the entire string to be written, ut xBytesSent bytes were written. */
}
/*
If xHigherPriorityTaskWoken was set to pdTRUE inside xStreamBufferSendFromISR() then a
task that has a priority above the priority of the currently executing task was unblocked
and a context switch should be performed to ensure the ISR returns to the unblocked task.
In most FreeRTOS ports this is done by simply passing xHigherPriorityTaskWoken into
taskYIELD_FROM_ISR(), which will test the variables value, and perform the context switch
if necessary. Check the documentation for the port in use for port specific instructions.
*/
taskYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
Мое понимание сценария
Предварительные условия
- Есть две задачи
- Task1 (высокий приоритет) и Task2 (низкий приоритет)
- Task1 находится в заблокированном состоянии, ожидая входной поток streamBuffer
- Task2 находится в рабочем состояниии прерывается с
vAnInterruptServiceRoutine
в пределах ISR
- Метод ISR вызывает
xStreamBufferSendFromISR()
- Этот вызов означаетто, что заблокированное состояние задачи 1 переходит в состояние готовности
случай A Если метод ISR возвращается сейчас, планировщик не будет вызываться, и задача 2 будет выполняться допериод временного интервала закончился, и затем планировщик переключается на высокий предшествующий Задача 1.
Случай B Если метод ISR наконец вызывает taskYIELD_FROM_ISR(xHigherPriorityTaskWoken);
, планировщик будет вызван и после возвратаISR, Task1 будет работать вместо Task2.
Вопросы
- Правильно ли, thв Task2 будет выполняться до тех пор, пока не истечет период времени или не появится другой тигр для переключения задач?
- Почему метод
taskYIELD_FROM_ISR()
не вызывается автоматически ОСРВ при вызове xStreamBufferSendFromISR()
?