Я хочу реализовать PCP в FreeRTOS, создав функции-оболочки вокруг FreeRTOS API.Вот код-обертка, который получает мьютекс с использованием PCP.
UBaseType_t PCP_mutex_take(mutex_handle, task_handle) {
UBaseType_t ret_val = pdFALSE;
// Returns the semaphore S* ('p_highest_ceiling_semaphore')
// with the highest priority ceiling of all semaphores
// currently locked by jobs other than job J ('task_handle')
p_highest_ceiling_semaphore = get_highest_ceiling_semaphore(task_handle);
// Job J will be blocked and the lock on S (mutex_handle) will be denied, if the priority
// of job J is not higher than the priority ceiling of semaphore S*
if (uxTaskPriorityGet(task_handle) > p_highest_ceiling_semaphore.ceiling) {
// We can try to obtain the lock according to PCP
xSemaphoreTake(mutex, ((TickType_t)portMAX_DELAY);
{
add_to_currently_locked_semaphore_list(mutex);
ret_val = pdTRUE;
}
}
else {
block 'task_handle' on 'p_highest_ceiling_semaphore'
ret_val = pdFALSE;
}
}
В качестве алгоритма PCP в оригинальной статье [Приоритетные протоколы наследования, L.Sha, R. Rajkumar и JP Lehoczky] «говорит:« Задание J с наивысшим приоритетом будет заблокировано, и блокировка на S будет отклонена, если приоритет задания J не выше потолка приоритета семафора с потолком наивысшего приоритета всех семафоров, которые в данный момент заблокированыпо заданиям, отличным от задания J. "
Итак, в ветви else я хочу выполнить в точности 2-ю часть предложения. Однако, когда я вставляю внутрь ветви else xSemaphoreTake(pHighestCeilingLockedSemaphore->semphHandle, (TickType_t)portMAX_DELAY);
, кажется, что существует тупикситуация, поскольку никакая другая задача не запланирована?
Как сделать задачу заблокированной для определенного семафора без явного вызова xSemaphoreTake
?