Компоненты и технологии • №2 '2011 компоненты



Pdf көрінісі
бет84/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   80   81   82   83   84   85   86   87   ...   129
Kurniz

рис. 1. Использование мьютекса для управления доступом к ресурсу
а
б
в
г
д
е


136
КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 8 '2011
компоненты
микроконтроллеры
Как видно по результатам работы (рис. 2), 
совместный доступ к консоли без примене-
ния какого-либо механизма взаимного ис-
ключения приводит к тому, что некоторые 
сообщения, которые выводят на консоль за-
дачи, оказываются повреждены.
Теперь защитим консоль от одновремен-
ного доступа с помощью мьютекса, заменив 
реализацию функции prvNewPrintString() 
на следующую:
/* Функция посимвольно выводит строку на консоль.
Консоль, как ресурс, защищена от совместного доступа 
из нескольких задач с помощью мьютекса. */
static void prvNewPrintString(const portCHAR *pcString) {
portCHAR *p;
int i;
/* Указатель — на начало строки */
p = pcString;
/* Захватить мьютекс. Время ожидания в блокированном 
состоянии, если мьютекс недоступен, сколь угодно долго.
Возвращаемое значение xSemaphoreTake() должно проверяться,
если указано время пребывания в блокированном состоянии, 
отличное от portMAX_DELAY */
xSemaphoreTake( xMutex, portMAX_DELAY ); {
/* Пока не дошли до нулевого символа — конца строки. */
while (*p) {
/* Вывод на консоль символа, на который ссылается указатель. */
putchar(*p);
/* Указатель — на следующий символ в строке. */
p++;
/* Вывести содержимое буфера экрана на экран. */
fflush(stdout);
/* Небольшая пауза */
for (i = 0; i < 10000; i++) ;
}
}
/* Когда вывод ВСЕЙ строки на консоль закончен
освободить мьютекс. Иначе другие задачи не смогут 
обратиться к консоли! */
xSemaphoreGive( xMutex );
}
Теперь при выполнении учебной программы 
№ 1 сообщения от разных задач не накладыва-
ются друг на друга: совместный доступ к ресур-
су (консоли) организован правильно (рис. 3).


Достарыңызбен бөлісу:
1   ...   80   81   82   83   84   85   86   87   ...   129




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет