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



Pdf көрінісі
бет111/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   107   108   109   110   111   112   113   114   ...   129
Kurniz

Время реакции системы 
на события
Продемонстрируем недостаток кооператив-
ной многозадачности по сравнению с вытес-
няющей с точки зрения времени реакции си-
стемы на прерывания. Для этого заменим реа-
лизацию служебной сопрограммы в учебной 
программе № 2 vIntCoRoutine() на следующую:
/* Служебная сопрограмма. Вызывает программные прерывания.
* Приоритет = 1.*/
void vIntCoRoutine( xCoRoutineHandle xHandle, unsigned
portBASE_TYPE uxIndex ) {
/* Все переменные должны быть объявлены как static. */
static long i;
crSTART( xHandle );
for(;;) {
/* Эта инструкция сгенерирует Прерывание № 1. */
__asm {int 0x83}
/* Грубая реализация задержки на какое-то время.
* Служебная сопрограмма при этом не блокируется! */
for (i = 0; i < 5000000; i++);
/* Эта инструкция сгенерирует Прерывание № 2. */
__asm {int 0x82}
/* Грубая реализация задержки на какое-то время.
* Служебная сопрограмма при этом не блокируется! */
for (i = 0; i < 5000000; i++);
}
crEND();
}
/*-----------------------------------------------------------*/
В этом случае низкоприоритетная служеб-
ная сопрограмма не вызывает блокирующих 
рис. 6. Результат выполнения учебной программы № 2


КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 9 '2011
104
компоненты
микроконтроллеры
API-функций. Результат выполнения модифицированной учебной 
программы № 2 приведен на рис. 7.
На рис. 7 видно, что теперь выполняется только низкоприоритет-
ная служебная сопрограмма. Высокоприоритетная Сопрограмма № 1 
не получает процессорного времени, даже несмотря на то, что она 
вышла из блокированного состояния, когда Прерывание № 1 поме-
стило сообщение в Очередь № 1.
Рассмотрим реальную программу, в которой высокоприоритетная 
сопрограмма отвечает за обработку события, ожидая, когда в очереди 
появится сообщение. Сообщение в очередь помещает обработчик пре-
рывания, которое возникает при наступлении события.
Пусть в текущий момент выполняется низкоприоритетная со-
программа и происходит это прерывание. Обработчик прерывания 
помещает сообщение в очередь. Однако высокоприоритетная со-
программа не получит управления сразу же после выполнения обра-
ботчика прерывания. Высокоприоритетная сопрограмма вынуждена 
ожидать, пока низкоприоритетная сопрограмма отдаст управление, 
вызвав блокирующую API-функцию.
Таким образом, время реакции системы на событие зависит от того, 
насколько быстро выполняющаяся в данный момент сопрограмма вы-
полнит переключение на другую сопрограмму. Высокоприоритетная со-
программа вынуждена ожидать, пока выполняется низкоприоритетная.
С точки зрения времени реакции системы на внешние события 
кооперативная многозадачность не позволяет гарантировать задан-
ное время реакции, что является одним из основных недостатков 
кооперативной многозадачности.
Выводы
Подводя итог, можно выделить следующие тезисы относительно со-
программ во FreeRTOS:
Выполняются в режиме кооперативной многозадачности.

Значительно экономят оперативную память.

Автоматически устраняют проблему реентерабельности функций.

Не гарантируют заданного времени реакции системы на прерывание.

При написании сопрограмм следует придерживаться строгих огра-

ничений.
Бедный набор API-функций для работы с сопрограммами.

Таким образом, использование сопрограмм может быть оправда-
но лишь в том случае, если преследуется цель написания програм-
мы, работающей под управлением FreeRTOS, на микроконтроллере, 
который не имеет достаточного объема оперативной памяти для 
реализации программы с использованием задач.
n


Достарыңызбен бөлісу:
1   ...   107   108   109   110   111   112   113   114   ...   129




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

    Басты бет