Показать сообщение отдельно
Старый 01.04.2009, 11:13   #15
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 41
Сообщений: 3,577
Вес репутации: 4386/122
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от Picvan Посмотреть сообщение
В TRead есть задержка в 750 мсек на время преобразования температуры DS1820.
Данные по температуре нужны двум задачам: управления и индикации.
Обе температуры используются для решения разных задач, но обе выводятся на индикацию. Наверное можно вызвать эту функцию из задачи управления и там же сформировать сообщение для задачи индикации?
Тогда понятно. 2 * 750 мс - это много, и на такое время задачу управления подвешивать не всегда допустимо. Тогда, действительно, TRead нужно сделать отдельной задачей, измеряющей в цикле обе температуры.

Теперь о способе передачи данных. Вариантов много, но я бы сделал так:
Для начала я бы организовал небольшой массив:
Код:
typedef struct 
{
    float T[2];
} TSensors;
(типы я от балды взял), чтобы две переменные о состоянии температур не гуляли отдельно, а были организованы в единый блок - статическую переменную типа TSensors. (Структуру вместо обычного массива я применил на тот случай, если в последствии ее понадобится расширить другими датчиками. В принципе, не обязательно, но может пригодиться.) После первого измерения один раз разослать задачам управления и индикации указатель на эту перменную (сервисом OS_Msg_Send), а эти задачи будут уже оперировать этим указателем. Передавать сообщение каждый раз после измерения нет смысла: во-первых, оно будет всегда одинаковым, а во-вторых, измерение температуры - задача довольно редкая (обычно, наверное, раз в 5-10 секунд), и заставлять другие задачи ждать такое время не рационально.

Код:
extern OST_MSG_CB  msg_CSensors;    // Сообщение для задачи управления
extern OST_MSG_CB  msg_ISensors;    // Сообщение для задачи индикации
void Task_TRead ()
{
    static TSensors S;
    static bit      bFirstTime;
    bFirstTime = 1;             // Индикатор первого запуска
    for (;;) 
    {
        // Измеряем температуру
 
        for (n = 0; n < 1; n++) 
        {
            ...
            OS_Delay(750 ms);
            S.T[n] = ...;
        }
 
        // В первый раз отсылаем сообщения
 
        if (bFirstTime)
        {
            OS_Msg_Send_Now(msg_CSensors, (OST_MSG)&S);
            OS_Msg_Send_Now(msg_ISensors, (OST_MSG)&S);
            bFirstTime = 0;
        }
 
        // Период измерений 5 секунд
 
        OS_Delay(5000 ms);
    }
}
Задачи управления и индикации проверяю это сообщение и, если оно готово, то устанавливают себе указатель на структуру:
Код:
void Task_Control (void)
{
    static TSensors *pS;    // Указатель на сруктуру с датчиками
    pS = NULL;
    for (;;)
    {
        ...
        if (OS_Msg_Check(msg_CSensors))
            OS_Msg_Accept(msg_CSensors, pS);  // Принимаем указатель и дальше работаем с ним
        ...
    }
}
Можно было бы и не заводить сообщения, а пользоваться глобальной структурой, но тогда нарушится структурность программы. Если в программе будут заведены еще переменные такого типа, то потом пойди разберись, какая из них в какой задаче устанавливается.

Короткими сообщениями здесь будет пользоваться не совсем удобно. Надо будет заводить по два коротких сообщения на каждую температуру (для двух задач), да еще заставлять задачи ждать их в правильном порядке.

Очередь сообщений здесь, конечно, тоже не совсем уместна, поскольку задачам управления и индикации нижно знать только последние значения температур, а не всю историю. А сама очередь - это громоздкая программная единица, и заводить целых две штуки для такой мелочи как температура - накладно.
tester вне форума   Ответить с цитированием