Протокол приоритетного потолка (PCP) в FreeRTOS - PullRequest
0 голосов
/ 03 марта 2019

Я хочу реализовать 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...