Спасибо за проявленный интерес!
(На всякий случай: в примере 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. Дальше - по возрастающей.
Вот схожий пример, но без зацикливаний: все задачи ждут существующие семафоры. С ним будет попроще разбираться.