Сначала описание проблемы (ну или того что у меня просто не получается по незнанию) - есть две задачи, каждая из них может обращаться к разделяемому ресурсу, для поочередного доступа я использую mutex (на самом деле я просто изучаю FreeRTOS и пробую различные тесты для этого). Написал такой код:
Код
void Task_1( void *pvParametrs )
{
while(1)
{
xSemaphoreTake( mutex_1, portMAX_DELAY );
LCD_ClearLine(LCD_LINE_6);
LCD_ClearLine(LCD_LINE_7);
LCD_DisplayStringLine(LCD_LINE_6, (uint8_t *)" TASK 1 ");
vTaskDelay( 2000 / portTICK_RATE_MS );
xSemaphoreGive( mutex_1 );
}
}
void Task_2( void *pvParametrs )
{
while(1)
{
xSemaphoreTake( mutex_1, portMAX_DELAY );
LCD_ClearLine(LCD_LINE_6);
LCD_ClearLine(LCD_LINE_7);
LCD_DisplayStringLine(LCD_LINE_7, (uint8_t *)" TASK 2 ");
vTaskDelay( 3000 / portTICK_RATE_MS );
xSemaphoreGive( mutex_1 );
}
}
{
while(1)
{
xSemaphoreTake( mutex_1, portMAX_DELAY );
LCD_ClearLine(LCD_LINE_6);
LCD_ClearLine(LCD_LINE_7);
LCD_DisplayStringLine(LCD_LINE_6, (uint8_t *)" TASK 1 ");
vTaskDelay( 2000 / portTICK_RATE_MS );
xSemaphoreGive( mutex_1 );
}
}
void Task_2( void *pvParametrs )
{
while(1)
{
xSemaphoreTake( mutex_1, portMAX_DELAY );
LCD_ClearLine(LCD_LINE_6);
LCD_ClearLine(LCD_LINE_7);
LCD_DisplayStringLine(LCD_LINE_7, (uint8_t *)" TASK 2 ");
vTaskDelay( 3000 / portTICK_RATE_MS );
xSemaphoreGive( mutex_1 );
}
}
Задача 1 и 2 имеют одинаковые приоритеты.
Так вот код в задаче 2, который находится за попыткой схватить семафор, никогда не выполняется. В 3х других RTOS с которыми я имел дело (TNKernel, CHibiOS, SMX) - такой-же код (ну со своим API естественно) работает нормально - то есть поочередно выполняется код task_1 и task_2 (задача стоит просто проверить работу mutex, поэтому не надо предлагать других методов выполнения этой простой задачи). Видимо в тех RTOS есть "очередь" на mutex - и если задача попыталась схватить, занятый mutex, то она встает в эту очередь и после освобождения mutex другой задачей первая его хватает. А в FreeRTOS такого получается нету?
Или я что то не правильно делаю?
P.S. если после xSemaphoreGive первую задачу отправить в сон (Delay) - то всторая задача все-же захватывает mutex и выполняет свой код и выполянется 2 задача постоянно - 1 уже не может схватить mutex (ну если 2 задачу в сон после xSemaphoreGive не отправлять тоже) - что вроде говорит что mutex работают, но без очереди.
Во внутренности очень не охото лезть - может уже кто сталкивался с таким.
Заранее благодарю за любые подсказки.