Целью работы является освоение механизма блокировок во FreeRTOS на основе мьютексов и семафоров.
Для достижения поставленной цели требуется решить следующие задачи:
Презентация к блоку "Операционные системы реального времени RISC-V"
Мьютекс (Mutex: MUTual EXception) является разновидностью семафора. Семафор - примитив синхронизации работы процессов и потоков, в основе которого лежит счётчик, над которым можно производить две операции: увеличение и уменьшение значения на единицу, при этом операция уменьшения для нулевого значения счетчика является блокирующейся. Служит для построения более сложных механизмов синхронизации и используется для синхронизации параллельно работающих задач, для защиты передачи данных через разделяемую память, для защиты критических секций, а также для управления доступом к аппаратному обеспечению. Параметром семафора является максимальное значение его счетчика. Мьютекс - семафор, максимальное значение которого равно единице.
(рис 11.1) Назначение мьютекса
FreeRTOS разделяет понятия мьютекса и бинарного семафора. Отличие заключается в том, что у бинарных семафорах отсутствует механизм модификации приоритетов, который есть в мьютексах. Это проявляется тем, что у задачи, повышается приоритет на время владения мьютексом. Таким образом двоичные семафоры лучше подходят для синхронизации задач, а мьютексы - для блокировки ресурсов. В данной работе рассматриваются только двоичные семафоры и мьютексы. Существуют счетные семафоры и рекурсивные мьютексы, у которых максимальное значение счетчика больше единицы.
Для использования мьютексов и семафоров нужно создать макрос configSUPPORT_DYNAMIC_ALLOCATION, равный 1. Для использования мьютексов нужно также создать макрос configUSE_MUTEXES, равный 1. Мьютексы создаются функцией SemaphoreHandle_t xSemaphoreCreateMutex( void ), а семафоры - SemaphoreHandle_t xSemaphoreCreateBinary( void ).
Взятие семафора выполняется функцией xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait ), а освобождение - xSemaphoreGive( SemaphoreHandle_t xSemaphore ). В функции взятия используется параметр времени ожидания xTicksToWait. Он определяет количество системных тиков, в течение которых задача ждет получение семафора.
В более старых версиях FreeRTOS для определения мьютекса используется объект xSemaphoreHandle. Функционально он ничем не отличается от SemaphoreHandle_t.
Пример кода работы с мьютексами:
SemaphoreHandle_t xSemaphore = NULL;
void vATask( void * pvParameters )
{
xSemaphore = xSemaphoreCreateMutex();
if( xSemaphore != NULL )
{
if( xSemaphoreGive( xSemaphore ) != pdTRUE ) // will fail!
{
…
}
if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) )
{
…
if( xSemaphoreGive( xSemaphore ) != pdTRUE )
{
…
}
}
}
}
Для выполнения работы требуется:
В лабораторной работе требуется разработать набор задач для доступа к общему ресурсу. В данной работе общим ресурсом является группа светодиодов на плате. В ходе работы нужно ограничить максимальное количество включенных светодиодов. Для этой цели предлагается использовать мьютексы в качестве механизма блокировки задач.
n = max(k, 2 + ((a+1) % 4));T[i] = (a * t + b * t * (i));1 + ((b)%(n/2))где а = номер варианта, b = количество букв в фамилии, t - базовый период, принимаемый как 200 тиков процессора, k - количество доступных для работы светодиодов.
Если светодиод не зажигается из-за указанных ограничений, то программа пропускает период горения и ждет полупериод для повторной попытки.
Для выполнения задания необходимо:
typedef struct {
int num;
char* text;
char* text_fail
} lab_task_data_w_fail;
char* names[] = {"Toggle 1", "Toggle 2", "Toggle 3"};
char* names_fail[] = {"Toggle 1 failed", "Toggle 2 failed", "Toggle 3 failed"};
lab_task_data_w_fail data_fail[3];
void mutex_task_function(void *pvParameters)
{
lab_task_data_w_fail* config = (lab_task_data_w_fail*)pvParameters;
while(1)
{
if(xSemaphoreTake(mutex,0)){
vSendString(config->text);
vTaskDelay(100*(250<<config->num));
vSendString(config->text);
xSemaphoreGive(mutex);
} else {
vSendString(config->text_fail);
}
vTaskDelay(100*(250<<config->num));
}
}
int main_mutex(){
mutex = xSemaphoreCreateMutex();
for(int i=0;i<3;i++){
data_fail[i].num = i;
data_fail[i].text = names[i];
data_fail[i].text_fail = names_fail[i];
xTaskCreate((TaskFunction_t )mutex_task_function,
(const char* )names[i],
(uint16_t )512,
(void* )data_fail[i],
(UBaseType_t )2,
(TaskHandle_t* )NULL);
}
vTaskStartScheduler();
return 0;
}
int main(){
main_mutex();
while(1);
}
В ходе работы программы максимальное количество включенных светодиодов равно 1, так как созданный мьютекс блокирует включение других светодиодов. По этой причине при зажигании светодиода с самым большим периодом, остальные не могли зажечься.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.