Показать сообщение отдельно
Старый 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 вне форума   Ответить с цитированием