То есть, локальная переменная функции становится локальной переменной задачи? Тогда если сделать локальный буфер внутри функции на много байт и вызвать ее из задачи, такая функция вполне может привести к переполнению стека! (В RL-RTX он по умолчанию 64 байта.)
А функция RadiomModemSubsystem принимает на вход только номер модема, т.к. переменная queue - это номер очередь FIFO для пакетов радиомодема, и в месте вызова (в main) про подсистему обработки очередей ничего не известно. Для main она скрыта. (h файл соответствующий я не подключаю, там и так дофига всего подключено, сложно разобраться потом).
Вот как это выглядит:
Код
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;
}
if (QueueIsEmpty(queue) == QUEUE_NOT_EMPTY) // если в очереди есть данные на отправку по радиомодему
{
FreeString(&dataBuf[0], BUF_MAX_SIZE); // очищаем буфер
SetRadioModemToCtrlMode(numModem);
SendCmdToRadioModem(RM_REQUEST_STATUS, &dataBuf[0], numModem); // отправляем команду
ReceivePacketFromRadioModem(&dataBuf[0], numModem); // получаем статус модема
// обрабатываем статус ..
// ..
SetRadioModemToDataMode(numModem);
RetrieveDataFromQueue(&dataBuf[0], &sizeOfData, queue); // извлекаем пакет из очереди
// оправляем пакет ...
}
}
А буфер радиомодема dataBuf можно и так сделать:
__task void modem2(void)
{
unsigned char Modem2Buffer[BUF_MAX_SIZE] = {0x00};
while(1)
{
RadiomModemSubsystem(RADIO_MODEM_2, &Modem2Buffer[0]);
}
}
но тогда задачу нужно инициализировать с помощью ф-ии os_tsk_create_user (делать ей стек большой отдельно). В этом нет необходимости.
Сообщение отредактировал Artkop - Jul 30 2010, 07:46