Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Инструментарий

Инструментарий Тестеры, паяльники, осциллографы, программаторы, IDE.

Ответ
 
Опции темы Опции просмотра
Старый 28.03.2009, 05:28   #1
CERGEI1982
Senior Member
 
Регистрация: 02.03.2007
Возраст: 36
Сообщений: 345
Вес репутации: 151/48
CERGEI1982 has a spectacular aura aboutCERGEI1982 has a spectacular aura about
По умолчанию Вопросы по OSA

Посмотрел,что нет подобной темы на форуме,чтоб задавать вопросы начинающему по OSA и решил создать эту.Можно конечно и в личку писать,но думаю будет всем полезны вопросы и ответы.
Вопросы у меня по работе кода(тестовые,из самой OSA)
Общий смысл работы кода понял так: Создаем три задачи с одинаковым приоритетом,вызываем сервис OS_Sched() (пока не силен во всех терминах,так что не обижайтесь,где по своему скажу),первая задача не начнется,так как ждет установки семафора №1 (OS_Bsem_Wait(1),потому вызывается задача №2.Устанавливаем первый семафор (OS_Bsem_Set(1) и увеличиваем переменую counter,вызываем планировщик OS_Yield();,который вызывает задачу №3.Устанавливается семафор №2,увеличивываем переменую counter,дальше вызывается планировщик OS_Yield();,он пропускается и увеличивается переменая counter,дальше команда на ожидание установки семафора №4(который не когда не установится).Дальше переходим на задачу №1 и здесь закольцовывается программа.
Теперь вопросы мои:
1)Почему в задачи №3 пропускается планировщик OS_Yield();,я думал что он передает управление сервису OS_Sched() и вызывается задача №1.Но в задаче №2 подобный код и там не пропускается планировщик OS_Yield(); ?
2)Почему когда поставили семафор №1 во второй задаче,в задаче №1 просто закольцовывается,ведь семафор стоит и сервис OS_Bsem_Wait(1); как раз его и ждал и дальше код не работает,я понимаю что остальные задачи выполнятся не будут,так как ждут установки своих семафоров.
3) И еще,почему сервис OS_Yield(); в задачах №2 и №3 стоит в середине? Думал что их надо ставить в конце задач,может потому что в задачи все равно закольцована for(;.
4)Интересно в какой переменой можно посмотреть какие семофоры установлены или нет,поискал в окне Watch ничего подобного не нашел.
Вот сам код,компилирую МСС18,проверял с помощью MPLAB SIM:
Код:
//#include <pic.h>
#include <OSA.h>

unsigned char counter=0;


//------------------------------------------------------------------------------
void Task_T1 (void)
{
    for(;;)
    {
        OS_Bsem_Wait(1);
        counter++;
        OS_Yield();
        counter++;
        OS_Bsem_Wait(2);
    }
}


//------------------------------------------------------------------------------
void Task_T2 (void)
{
    for (;;)
    {
        OS_Bsem_Set(1);
        counter++;
        OS_Yield();
        counter++;
        OS_Bsem_Wait(4);
    }
}


//------------------------------------------------------------------------------
void Task_T3 (void)
{
    for (;;)
    {

        OS_Bsem_Set(2);
        counter++;
        OS_Yield();
        counter++;
        OS_Bsem_Wait(4);


    }
}


//------------------------------------------------------------------------------
void main (void)
{
    OS_Init();
    OS_Task_Create(2, Task_T1);
    OS_Task_Create(2, Task_T2);
    OS_Task_Create(2, Task_T3);


    for (;;)
    {
        //asm(" CLRWDT ");
        OS_Sched();
    }
}
CERGEI1982 вне форума   Ответить с цитированием
Старый 28.03.2009, 12:13   #2
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

Спасибо за проявленный интерес!

(На всякий случай: в примере Test2 первым сервисом в задаче 1 строит OS_Bsem_Set(0). Но раз в твоей программе стоит OS_Bsem_Wait(1), то отвечать буду по конкретному коду).

Цитата:
Сообщение от CERGEI1982 Посмотреть сообщение
Теперь вопросы мои:
1)Почему в задачи №3 пропускается планировщик OS_Yield();,я думал что он передает управление сервису OS_Sched() и вызывается задача №1.Но в задаче №2 подобный код и там не пропускается планировщик OS_Yield(); ?
Он не пропускается. Пошаговая отладка RTOS в симуляторе - отдельная тема. По ней я сейчас готовлю небольшое пособие, но в двух словах так: поведение MPLab не однозначно предсказуемо при попытке пошагового выполнения сервисов OS, передающих управление планировщику. Самому MPLab'у довольно сложно справиться с конструкцией сложного макроса (в нем вызываются подпрораммы, производящие операции со стеком, возврат из которых производится совсем не туда, куда ожидает симулятор.) Поэтому обходить такие сервисы как OS_Yield, OS_Delay, OS_xxx_Wait и пр. лучше, устанавливая за ними breakpoint'ы и нажимая F9.

Цитата:
2)Почему когда поставили семафор №1 во второй задаче,в задаче №1 просто закольцовывается,ведь семафор стоит и сервис OS_Bsem_Wait(1); как раз его и ждал и дальше код не работает,я понимаю что остальные задачи выполнятся не будут,так как ждут установки своих семафоров.
В самый первый раз задача 1 дожидается этого семафора. Сразу после этого семафор сбрасывается (это делает автоматически сервис OS_Bsem_Wait). Больше этот семафор не будет установлен, т.к. задача 2 (единственная задача, которая его устанавливает) будет в вечном ожидании семафора 4, который нигде не устанавливается. Поэтому задача 1, возвращаясь к началу цикла for и повторно ожидая установку семафора 1, зациклится.

Цитата:
3) И еще,почему сервис OS_Yield(); в задачах №2 и №3 стоит в середине? Думал что их надо ставить в конце задач,может потому что в задачи все равно закольцована for(;.
Этот сервис можно ставить где угодно в задаче и сколько угодно раз:
Код:
void Task (void)
{
    OS_Yield();
    OS_Yield();
    OS_Yield();
    for (;;) 
    {
        OS_Yield();
        RB0 = 1;
        OS_Yield();
        RB0 = 0;
        OS_Yield();
        RB1 ^= 1;
    }
}
Цитата:
4)Интересно в какой переменой можно посмотреть какие семофоры установлены или нет,поискал в окне Watch ничего подобного не нашел.
Системная переменная OS_BSems - массив char'ов. Младший бит младшего байта соответствует семафору 0. Дальше - по возрастающей.

Вот схожий пример, но без зацикливаний: все задачи ждут существующие семафоры. С ним будет попроще разбираться.
Вложения
Тип файла: pdf test2_osa.c.pdf (1.2 Кб, 65 просмотров)
tester вне форума   Ответить с цитированием
Старый 28.03.2009, 13:40   #3
CERGEI1982
Senior Member
 
Регистрация: 02.03.2007
Возраст: 36
Сообщений: 345
Вес репутации: 151/48
CERGEI1982 has a spectacular aura aboutCERGEI1982 has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Попробывал как вы мне посоветовали,ставить точки останова и сразу смысл стал понятен сервисов OS_Yield() и OS_WaitBSem() ,только одно огорчило массив с семафорами все таки в окне переменых не отображается(сфотал на рисунке),а держать все семафоры в голове,запутываешся какой стоит,а какой сброшен.Если можно покажите как вы их контролируете при симуляции.
Миниатюры
111.JPG  
CERGEI1982 вне форума   Ответить с цитированием
Старый 28.03.2009, 14:14   #4
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

Цитата:
Сообщение от CERGEI1982 Посмотреть сообщение
Попробывал как вы мне посоветовали,ставить точки останова и сразу смысл стал понятен сервисов OS_Yield() и OS_WaitBSem() ,только одно огорчило массив с семафорами все таки в окне переменых не отображается(сфотал на рисунке),а держать все семафоры в голове,запутываешся какой стоит,а какой сброшен.Если можно покажите как вы их контролируете при симуляции.
Правой кнопкой по OS_BSems в окне Watch, выбрать "Properties..." и в поле "Format" выбрать "Binary". Это самый удобный способ из доступных. Номера семафоров, к сожелению, приходится держать в голове. Это плата за экономию RAM-памяти: один семафор - один бит памяти (в jacOS он занимает 2 байта, в Salvo - 3)
tester вне форума   Ответить с цитированием
Старый 28.03.2009, 16:02   #5
CERGEI1982
Senior Member
 
Регистрация: 02.03.2007
Возраст: 36
Сообщений: 345
Вес репутации: 151/48
CERGEI1982 has a spectacular aura aboutCERGEI1982 has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Точно,как же не подумал переключить,спасибо за подсказку все работает,буду дальше двигатся
Сразу же поигрался и заметил одну особеность сервиса OS_WaitBSem() это то что например если в задаче доходим до него и семафор установлен,OS_WaitBSem() вызывает OS_Sched(),и при следущем вызове этой же задачи мы можем двигатся дальше после OS_WaitBSem(),то есть не сразу пропускает по условию семафора,а при следущем выборе этой задачи,разве это правельно?

Последний раз редактировалось CERGEI1982; 28.03.2009 в 16:19.
CERGEI1982 вне форума   Ответить с цитированием
Старый 28.03.2009, 16:26   #6
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

Цитата:
Сообщение от CERGEI1982 Посмотреть сообщение
Точно,как же не подумал переключить,спасибо за подсказку все работает,буду дальше двигатся
Сразу же поигрался и заметил одну особеность сервиса OS_WaitBSem() это то что например если в задаче доходим до него и семафор установлен,OS_WaitBSem() вызывает OS_Sched(),и при следущем вызове этой же задачи мы можем двигатся дальше после OS_WaitBSem(),то есть не сразу пропускает по условию семафора,а при следущем выборе этой задачи,разве это правельно?
А представь, что этот же семафор ожидается более приоритетной задачей. Например, семафор используется для блокировки ресурса UART. Высокоприоритетная задача имеет срочные данные на отсылку, и если низкоприоритетная, проверив семафор сама, не позволит планировщику проверить, нет ли более срочной задачи, то высокоприоритетной придется ждать, пока отработает низкоприоритетная.
tester вне форума   Ответить с цитированием
Старый 28.03.2009, 16:36   #7
CERGEI1982
Senior Member
 
Регистрация: 02.03.2007
Возраст: 36
Сообщений: 345
Вес репутации: 151/48
CERGEI1982 has a spectacular aura aboutCERGEI1982 has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от tester Посмотреть сообщение
А представь, что этот же семафор ожидается более приоритетной задачей. Например, семафор используется для блокировки ресурса UART. Высокоприоритетная задача имеет срочные данные на отсылку, и если низкоприоритетная, проверив семафор сама, не позволит планировщику проверить, нет ли более срочной задачи, то высокоприоритетной придется ждать, пока отработает низкоприоритетная.
Очень хорошее замечание Приоритеты рулят
Потому и решил работать с осью.Чуствую скоро будет виндоус в микроконтроллере.
CERGEI1982 вне форума   Ответить с цитированием
Старый 31.03.2009, 07:08   #8
Picvan
Senior Member
 
Регистрация: 21.03.2007
Сообщений: 320
Вес репутации: 186/47
Picvan has a spectacular aura aboutPicvan has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Пытаюсь понять как получать информацию из задач:
Сейчас
Temperatura1 = TRead(Adr1);
................
Temperatura2 = TRead(Adr2);
...........
В TRead()
{
.........
return(T);
}
А как это сделать в OCA? Через сообщения? Можно маленький пример?
Во всех доступных примерах такого я не нашел. Может плохо искал?
Picvan вне форума   Ответить с цитированием
Старый 31.03.2009, 09:17   #9
DL36
Senior Member
 
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/99
DL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant future
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от Picvan Посмотреть сообщение
Пытаюсь понять как получать информацию из задач:
Сейчас
Temperatura1 = TRead(Adr1);
................
Temperatura2 = TRead(Adr2);
...........
В TRead()
{
.........
return(T);
}
А как это сделать в OCA? Через сообщения? Можно маленький пример?
Во всех доступных примерах такого я не нашел. Может плохо искал?
Передать данные из одной задачи в другую удобно через очередь.
DL36 вне форума   Ответить с цитированием
Старый 31.03.2009, 10:10   #10
vitalka
Super Moderator
 
Аватар для vitalka
 
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 44
Сообщений: 3,334
Вес репутации: 2341/99
vitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond repute
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от Picvan Посмотреть сообщение
Пытаюсь понять как получать информацию из задач...
Может плохо искал?
плохо искал
доки на OSA, раздел "сообщения"
я так понимаю, подойдут короткие однобайтные сообщения (там и пример есть)
vitalka вне форума   Ответить с цитированием
Старый 31.03.2009, 10:27   #11
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 Посмотреть сообщение
Пытаюсь понять как получать информацию из задач:
Сейчас
Temperatura1 = TRead(Adr1);
................
Temperatura2 = TRead(Adr2);
...........
В TRead()
{
.........
return(T);
}
А как это сделать в OCA? Через сообщения? Можно маленький пример?
Во всех доступных примерах такого я не нашел. Может плохо искал?
Так что куда передается? Если я правильно понял, TRead - это функция, не заслуживающая под себя отдельной задачи. В таком случае средста OSA не нужны, и реализация передачи данных через возвращаемое функцией значение - правильная.

Или TRead - нечто большее, чем просто чтение температуры с датчика?
tester вне форума   Ответить с цитированием
Старый 31.03.2009, 17:23   #12
Picvan
Senior Member
 
Регистрация: 21.03.2007
Сообщений: 320
Вес репутации: 186/47
Picvan has a spectacular aura aboutPicvan has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Извините за неполный вопрос. TRead() - функция опроса DS18S20.
Задается один параметр адрес канала и возвращает значение температуры или устанавливает флаги к.з./обрыв. При обнаружении неисправности датчика немедленный выход из функции. Я пока не совсем понимаю как лучше: сделать задачи Temperatura1 и Temperatura2 и применить сообщения или через глобальные переменные а TRead сделать задачей. Эти данные затем используются в управлении. Трудно дается перестройка мышления от суперцикла к РТОС.
Picvan вне форума   Ответить с цитированием
Старый 31.03.2009, 17:49   #13
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() - функция опроса DS18S20.
Задается один параметр адрес канала и возвращает значение температуры или устанавливает флаги к.з./обрыв. При обнаружении неисправности датчика немедленный выход из функции. Я пока не совсем понимаю как лучше: сделать задачи Temperatura1 и Temperatura2 и применить сообщения или через глобальные переменные а TRead сделать задачей. Эти данные затем используются в управлении. Трудно дается перестройка мышления от суперцикла к РТОС.
Повторюсь: не совсем понятно желание вынести TRead в отдельную задачу. Там есть длинные задержки? Или ожидание каких-то событий?

Также нет смысла заводить отдельные задачи для измерения температур. Самое сложное, что можно себе позволить, это выделить одну задачу на измерение обеих температур, да и то, только если данные о температуре требуются нескольким задачам. В большинстве же случаев (конкретно твой случай не рассматриваю, т.к. его целиком не знаю) вызов функции (не задачи) TRead можно делать из той задачи, которой данные о температуре нужны (если такая задача всего одна).

А не так, что задача TRead измеряет температуру, потом передает сообщение задаче Temperature, которая потом передает сообщение основной задаче.

Данные о температуре нужны только одной задаче или нескольким?
tester вне форума   Ответить с цитированием
Старый 01.04.2009, 04:27   #14
Picvan
Senior Member
 
Регистрация: 21.03.2007
Сообщений: 320
Вес репутации: 186/47
Picvan has a spectacular aura aboutPicvan has a spectacular aura about
По умолчанию Re: Вопросы по OSA

В TRead есть задержка в 750 мсек на время преобразования температуры DS1820.
Данные по температуре нужны двум задачам: управления и индикации.
Обе температуры используются для решения разных задач, но обе выводятся на индикацию. Наверное можно вызвать эту функцию из задачи управления и там же сформировать сообщение для задачи индикации?
Picvan вне форума   Ответить с цитированием
Старый 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 вне форума   Ответить с цитированием
Старый 01.04.2009, 11:52   #16
Picvan
Senior Member
 
Регистрация: 21.03.2007
Сообщений: 320
Вес репутации: 186/47
Picvan has a spectacular aura aboutPicvan has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Спасибо за столь подробный ответ. Буду вникать.
Picvan вне форума   Ответить с цитированием
Старый 01.04.2009, 13:44   #17
Semёn
Senior Member
 
Регистрация: 30.07.2008
Возраст: 45
Сообщений: 117
Вес репутации: 107/40
Semёn will become famous soon enoughSemёn will become famous soon enough
По умолчанию Re: Вопросы по OSA

Что-то я не допонял... В первый раз задача получит сообщение, что температура измерена, выведет ее на индикатор, а что потом? Допустим, у нее есть укзатель на массив температур, но как она будет знать, что очередное измерение готово и его пора выводить? Надо же как-то сигнализировать ей, хотя бы через семафор. Или я не прав?
Semёn вне форума   Ответить с цитированием
Старый 01.04.2009, 16:13   #18
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

Цитата:
Сообщение от Semёn Посмотреть сообщение
Что-то я не допонял... В первый раз задача получит сообщение, что температура измерена, выведет ее на индикатор, а что потом? Допустим, у нее есть укзатель на массив температур, но как она будет знать, что очередное измерение готово и его пора выводить? Надо же как-то сигнализировать ей, хотя бы через семафор. Или я не прав?
Температура - это состояние, а не событие. Событие - это факт завершения измерения температуры, но это же не значит, что температура сразу исчезает после того, как мы обработали событие. И индикатору, который выводит температуру, все равно: была она измерена только что или 5 секунд назад. Если это важно пользователю, то при проектировании нужно предусмотреть более частые измерения, а не отсылку семафоров.
tester вне форума   Ответить с цитированием
Старый 02.04.2009, 09:06   #19
Picvan
Senior Member
 
Регистрация: 21.03.2007
Сообщений: 320
Вес репутации: 186/47
Picvan has a spectacular aura aboutPicvan has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Если я правильно понял, то сообщение после прочтения затирается. В моем случае
если первой прочтет сообщение задача управления, то задаче индикации ничего не достанется?
Picvan вне форума   Ответить с цитированием
Старый 02.04.2009, 10:25   #20
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 Посмотреть сообщение
Если я правильно понял, то сообщение после прочтения затирается. В моем случае
если первой прочтет сообщение задача управления, то задаче индикации ничего не достанется?
Если они будут ждать сообщение через один и тот же дескриптор, то да (только затирается не сообщение, а только указатель на него в дескрипторе; тело сообщения остается неизменным)

В примере, который я приводил, сообщение передается через два дескриптора: msg_CSensors и msg_ISensors - каждой задаче свое. Оба дескриптора на момент отправки содержат указатель на одну и ту же переменную (структуру S). Задача управления, получив сообщение msg_CSensors, достает из него указатель, запоминает его в своей статической переменной, после чего обнуляет дескриптор. Сама переменная S, куда указывал дескриптор, остается не тронутой. Следующей сообщение получает задача индикации (через свой дескриптор msg_ISensors), достает из него указатель на структуру S, запоминает его в своей статической переменной и обнуляет дескриптор.
tester вне форума   Ответить с цитированием
Старый 02.04.2009, 15:43   #21
Picvan
Senior Member
 
Регистрация: 21.03.2007
Сообщений: 320
Вес репутации: 186/47
Picvan has a spectacular aura aboutPicvan has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Спасибо. Буду дальше постигать эту "высшую математику".
Picvan вне форума   Ответить с цитированием
Старый 02.04.2009, 19:05   #22
VOSAP
Senior Member
 
Аватар для VOSAP
 
Регистрация: 25.10.2008
Адрес: Валдай
Возраст: 38
Сообщений: 129
Вес репутации: 168/39
VOSAP has a spectacular aura aboutVOSAP has a spectacular aura about
Отправить сообщение для VOSAP с помощью ICQ
По умолчанию Re: Вопросы по OSA

А есть ли какие либо рекомендации по использованию сторожевого таймера совместно с ОСой?
VOSAP вне форума   Ответить с цитированием
Старый 02.04.2009, 19:36   #23
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

Цитата:
Сообщение от VOSAP Посмотреть сообщение
А есть ли какие либо рекомендации по использованию сторожевого таймера совместно с ОСой?
Здесь было немного про это: http://www.microchip.su/showthread.php?t=4033

Главное - это, чтобы сторожевой таймер выполнял свою основную функцию - принудительный сброс контроллера при зависании программы (если вопрос, конечно, касался именно этой функции WDT). Так что к RTOS, и в частности к OSA, он имеет косвенное отношение.

Кстати в OSA есть недокументированный сервис OS_CLRWDT(). Он ничего, кроме сброса WDT, не делает, но удобен при переносе программы на другую платформу.
tester вне форума   Ответить с цитированием
Старый 03.04.2009, 04:19   #24
Picvan
Senior Member
 
Регистрация: 21.03.2007
Сообщений: 320
Вес репутации: 186/47
Picvan has a spectacular aura aboutPicvan has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Я увидел этот недокументированный сервис и хочу уточнить. Вот такая конструкция будет работать?
void interrupt isr()
{

if (T0IE && T0IF)
{
TMR0 -= 250;
T0IF = 0;
OS_CLRWDT();
OS_Timer();
}
}
Picvan вне форума   Ответить с цитированием
Старый 03.04.2009, 10:00   #25
Alex B.
Super Moderator
 
Аватар для Alex B.
 
Регистрация: 25.02.2007
Адрес: Russia, SPb
Сообщений: 1,674
Вес репутации: 1729/77
Alex B. has a brilliant futureAlex B. has a brilliant futureAlex B. has a brilliant futureAlex B. has a brilliant futureAlex B. has a brilliant futureAlex B. has a brilliant futureAlex B. has a brilliant futureAlex B. has a brilliant futureAlex B. has a brilliant futureAlex B. has a brilliant futureAlex B. has a brilliant future
Отправить сообщение для Alex B. с помощью Skype™
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от Picvan Посмотреть сообщение
Я увидел этот недокументированный сервис и хочу уточнить. Вот такая конструкция будет работать?
По ссылке tester-а для начала пройди...
__________________
даташит читать до того , а не после
Alex B. вне форума   Ответить с цитированием
Ответ

Метки
osa, rtos, сторожевой таймер


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Все вопросы по MikroC shnitz Инструментарий 971 23.09.2016 13:22
Статья по RTOS OSA tester Продукция MICROCHIP 12 24.02.2009 12:04
16F690, вопросы по timer1 и встроенному 32кГц-генератору e_glu Продукция MICROCHIP 3 29.01.2009 17:14
Есть вопросы по алгоритму работы устройства на пике. 40grad Продукция MICROCHIP 9 27.10.2007 15:55
Пишу руководство по RS485 и есть вопросы pvl2000 Cетевые протоколы и технологии 2 16.04.2007 00:57


Часовой пояс GMT +3, время: 21:46.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot