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).
Достарыңызбен бөлісу: