Использую операционку Keil RL-RTX.
Определено две задачи, имеющие одинаковый приоритет и выполняющиеся параллельно:
CODE
//----------------------------------------------------------------------------------------------------
/*! \brief Задача RTX для работы с радиомодемом 1, подключенным к порту uart 0 */
//----------------------------------------------------------------------------------------------------
__task void modem1(void)
{
while(1)
{
RadiomModemSubsystem(RADIO_MODEM_1);
}
}
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
/*! \brief Задача RTX для работы с радиомодемом 2, подключенным к порту uart 2*/
//----------------------------------------------------------------------------------------------------
__task void modem2(void)
{
while(1)
{
RadiomModemSubsystem(RADIO_MODEM_2);
}
}
//----------------------------------------------------------------------------------------------------
/*! \brief Задача RTX для работы с радиомодемом 1, подключенным к порту uart 0 */
//----------------------------------------------------------------------------------------------------
__task void modem1(void)
{
while(1)
{
RadiomModemSubsystem(RADIO_MODEM_1);
}
}
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
/*! \brief Задача RTX для работы с радиомодемом 2, подключенным к порту uart 2*/
//----------------------------------------------------------------------------------------------------
__task void modem2(void)
{
while(1)
{
RadiomModemSubsystem(RADIO_MODEM_2);
}
}
//----------------------------------------------------------------------------------------------------
Как видно, задачи вызывают одну и туже функцию. Создается ли для каждой задачи свой экземпляр функции со своими локальными переменными? Вот эта функция:
CODE
static unsigned char Modem1Buffer[BUF_MAX_SIZE] = {0x00};
static unsigned char Modem2Buffer[BUF_MAX_SIZE] = {0x00};
void RadiomModemSubsystem(unsigned char numModem)
{
unsigned char queue = UNKNOWN_QUEUE;
unsigned char *dataBuf = 0;
switch(numModem)
{
case RADIO_MODEM_1:
queue = MODEM_1_QUEUE;
dataBuf = &Modem1Buffer[0];
break;
case RADIO_MODEM_2:
queue = MODEM_2_QUEUE;
dataBuf = &Modem2Buffer[0];
break;
default:
return;
}
// здесь управление и обмен с модемом
}
static unsigned char Modem2Buffer[BUF_MAX_SIZE] = {0x00};
void RadiomModemSubsystem(unsigned char numModem)
{
unsigned char queue = UNKNOWN_QUEUE;
unsigned char *dataBuf = 0;
switch(numModem)
{
case RADIO_MODEM_1:
queue = MODEM_1_QUEUE;
dataBuf = &Modem1Buffer[0];
break;
case RADIO_MODEM_2:
queue = MODEM_2_QUEUE;
dataBuf = &Modem2Buffer[0];
break;
default:
return;
}
// здесь управление и обмен с модемом
}
Интересует, что будет с переменными queue и *dataBuf. Задача modem 1 вызывает функцию RadiomModemSubsystem с параметром RADIO_MODEM_1. Для локальных переменных queue и *dataBuf выделяется память, идет выполнение. Задача modem 1 израсходовала свой квант времени и теперь выполняется задача modem 2. Задача modem 2 вызывает функцию RadiomModemSubsystem с параметром RADIO_MODEM_2 и для локальных переменных queue и *dataBuf выделяется новая память (то есть, это экземпляр функции для другой задачи), правильно? Не будет ситуации, что адреса локальных переменных совпадут, и мы перепишем буфер dataBuf и номера очереди queue другой задачи.