Рассмотрим следующие коды:мьютекса в RTOSes в этой конкретной ситуации
/*----------------------------------------------------------------------------
First Thread
*---------------------------------------------------------------------------*/
void Thread1 (void const *argument)
{
for (;;)
{
osMutexWait(mutex, osWaitForever);
Thread1_Functions;
osMutexRelease(mutex);
}
}
/*----------------------------------------------------------------------------
Second Thread
*---------------------------------------------------------------------------*/
void Thread2 (void const *argument)
{
for(;;)
{
osMutexWait(mutex, osWaitForever);
Thread2_Functions;
osMutexRelease(mutex);
}
}
Насколько я заметил из RTOS's scheduling
, RTOS назначить определенное время для каждой задачи и после того, как на этот раз закончится, он переключается на другая задача.
Затем в это конкретное время бесконечный цикл внутренней задачи, возможно, цикл повторяется несколько раз, пока не закончится конкретное время задачи.
Предположим, что задача завершена менее чем наполовину, тогда у нее есть время, чтобы выполнить эту задачу еще раз. в последней строке после освобождения мьютекса, тогда он достигнет мьютекса перед задачей2 во второй раз, правда ли?
Предположим, что таймер включен, когда MCU запускает Thread1_Functions
во второй раз, затем task2 не работает, потому что mutex принадлежит задаче 1, RTOS запускает задачу 1 снова, и если таймер имеет место каждый раз в Thread1_Functions
, тогда task2 не имеет шансов работать, Am I правда ?
Пусть в 2th секции, квант времени истек на теле нити 2, что происходит знает, я использую Keil RTX, который используется упреждающей раунд время малиновки задачи schedling.Each выполняется только один!? или он работает всегда и раньше, пока не появится следующий таймер? –
@MahmoudHD См. Обновление в моем ответе выше. – kkrambo