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


Вызов блокирующих API-функций



Pdf көрінісі
бет103/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   99   100   101   102   103   104   105   106   ...   129
Kurniz

Вызов блокирующих API-функций
Еще одним последствием использования 
общего для всех сопрограмм стека является 
то, что вызов блокирующих API-функций 
допускается только непосредственно из тела 
сопрограммы, но не допускается из функций, 
которые вызываются из тела сопрограммы. 
Рассмотрим пример:
// Функция, реализующая сопрограмму
void vACoRoutineFunction(xCoRoutineHandle xHandle, unsigned
portBASE_TYPE uxIndex)
{
crSTART( xHandle );
for(;; )
{
// Непосредственно в сопрограмме
// блокирующие API-функции вызывать можно.
crDELAY( xHandle, 10 );
// Однако внутри функции vACalledFunction() их НЕЛЬЗЯ
вызывать!!!
vACalledFunction();
}
crEND();
}
void vACalledFunction(void) {
// Здесь нельзя вызывать блокирующие API-функции!!!
// ОШИБКА!
crDELAY( xHandle, 10 );
}
рис. 2. Результат выполнения учебной программы № 1
рис. 3. Ход выполнения сопрограмм в учебной программе № 1
рис. 4. Результат выполнения учебной программы № 1,
когда Сопрограмма 1 не выполняет переключения на другую сопрограмму


101
КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 9 '2011
www.kite.ru
компоненты
микроконтроллеры
Внутренняя реализация сопрограмм не до-
пускает вызова блокирующих API-функций 
внутри выражения switch. Рассмотрим пример:
// Функция, реализующая сопрограмму
void vACoRoutineFunction( xCoRoutineHandle xHandle, unsigned
portBASE_TYPE uxIndex )
{
crSTART( xHandle );
for(;; )
{
// Непосредственно в сопрограмме 
// блокирующие API-функции вызывать можно.
crDELAY( xHandle, 10 );
switch( aVariable )
{
case 1 : // Здесь нельзя вызывать блокирующие API-функции.
break;
default: // Здесь тоже нельзя.
}
}
crEND();
}


Достарыңызбен бөлісу:
1   ...   99   100   101   102   103   104   105   106   ...   129




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

    Басты бет