Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TNKernel->TN_EVENT->старт сразу всех ожидающих флага задач
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
kosyak©
Код
void task(p)
{
    for(;;)
    {
        unsigned int evflags;
        if( tn_event_wait(&evftest, 1,TN_EVENT_WCOND_AND, &evflags, TN_WAIT_INFINITE) == TERR_NO_ERR )
        {
            TRACE("WAIT END %d\n", (uint32_t)p);
        }
    }
}
...
///где то в другой задаче
    tn_event_create(&evftest, TN_EVENT_ATTR_MULTI, 0);
    // запускаем 4 задачи
    create_task(task(0));
    create_task(task(1));
    create_task(task(2));
    create_task(task(3));
    
    tn_event_set(&evftest, 1);
    for(;;);
....

В рабочее состояние перейдет первая созданная задача. Как сделать чтобы все задачи перешли в рабочее состояние?
megajohn
если нужно быстрое решение, то навскидку так
void task(p)
{
for(;;)
{
unsigned int evflags;
if( tn_event_wait(&evftest, 1<<p,TN_EVENT_WCOND_OR, &evflags, TN_WAIT_INFINITE) == TERR_NO_ERR )
{
TRACE("WAIT END %d\n", (uint32_t)p);
}
}
}
...
///где то в другой задаче
tn_event_create(&evftest, TN_EVENT_ATTR_MULTI, 0);
// запускаем 4 задачи
create_task(task(0));
create_task(task(1));
create_task(task(2));
create_task(task(3));

tn_event_set(&evftest, (1<< 0) | (1<< 1) | (1<< 2) | (1<< 3) );
for(;;);
kosyak©
Не не не. У меня вопрос скорее к RTOS - насколько я понимаю запускаться должны все ожидающие задачи.
AHTOXA
Я не пользовал TNKernel, но из общих соображений: перед вызовом tn_event_set() надо немного поспать, чтобы все запущенные задачи успели получить управление и вызвать tn_event_wait().
kosyak©
Это у меня псевдо код. В реале там есть задержка средствами RTOS.
Все задачи точно успевают вызвать wait_event. А вот просыпается потом только первая и них.
Интересно какое поведение у event в других RTOS?
AHTOXA
В scmRTOS проснутся все задачи, ожидающие данного события.
Grape
в 2.7 просыпаются все.

только что проверил.

/gr
kosyak©
а можно пример кода как Вы проверяли?
Grape
Цитата(kosyak© @ Mar 19 2015, 14:13) *
а можно пример кода как Вы проверяли?


задержки в тиках сист.таймера.

Код
void task(void *p)
{
int err;
    for(;;) {
        unsigned int evflags;
        err = tn_event_wait(&evftest, 1, TN_EVENT_WCOND_AND, &evflags, TN_WAIT_INFINITE);

        TRACE("WAIT END %d, %d", (uint32_t)p, err);

        my_sleep(5);
    }
}


void    tn_test(void)
{

   //где то в другой задаче
   tn_event_create(&evftest, TN_EVENT_ATTR_MULTI, 0);

   // запускаем 4 задачи
   create_task(task, 1);
   create_task(task, 2);
   create_task(task, 3);
   create_task(task, 4);

   my_sleep(100);

   tn_event_set(&evftest, (1<< 0) | (1<< 1) | (1<< 2) | (1<< 3) );
   for(;;);
}
kosyak©
Попробуйте так.
Код
void task(void *p)
{
int err;
    for(;;) {
        unsigned int evflags;
        err = tn_event_wait(&evftest, 1, TN_EVENT_WCOND_AND, &evflags, TN_WAIT_INFINITE);

        TRACE("WAIT END %d, %d", (uint32_t)p, err);

                tn_task_sleep(TN_WAIT_INFINITE);
    }
}

void    tn_test(void)
{

   //где то в другой задаче
   tn_event_create(&evftest, TN_EVENT_ATTR_MULTI, 0);

   // запускаем 4 задачи
   create_task(task, 1);
   create_task(task, 2);
   create_task(task, 3);
   create_task(task, 4);

   my_sleep(100);

   tn_event_set(&evftest, (1<< 0) | (1<< 1) | (1<< 2) | (1<< 3) );
   tn_task_sleep(TN_WAIT_INFINITE);
}

Grape
Цитата(kosyak© @ Mar 19 2015, 15:29) *
Попробуйте так
..................


Все задачи просыпаются.

kosyak©
Хм... Я использую v2.7 порт для CortexM4.

Во вложении файл с тестом.
Вывод в TRACE такой

Код
[0] - before wait
[1] - before wait
[2] - before wait
before evf set
after evf set
[0] - after wait


Если не сложно не могли бы Вы запустить у себя этот тест.

Grape
Цитата(kosyak© @ Mar 19 2015, 16:34) *
Хм... Я использую v2.7 порт для CortexM4.

Во вложении файл с тестом.
Вывод в TRACE такой

Код
[0] - before wait
[1] - before wait
[2] - before wait
before evf set
after evf set
[0] - after wait


Если не сложно не могли бы Вы запустить у себя этот тест.


000000.010 MAIN Run at : 96MHz
000000.010 -- [0] - before wait
000000.010 -- [1] - before wait
000000.010 -- [2] - before wait
000000.509 MAIN before evf set
000000.509 -- [0] - after wait
000000.509 -- [1] - after wait
000000.509 -- [2] - after wait
000000.509 MAIN after evf set

да, порт для M3 + правки для удобства и отладки, собранные по форуму..
kosyak©
А у кого выше приоритет? у "MAIN Run"?
Поделись файлом tn_event.c из своей сборки пожалуйста.
Grape
Цитата(kosyak© @ Mar 19 2015, 21:47) *
А у кого выше приоритет? у "MAIN Run"?
Поделись файлом tn_event.c из своей сборки пожалуйста.


в предыдущем тесте приоритет у main ниже.

если у main приоритет выше, то

000000.010 MAIN Run at : 96MHz
000000.010 -- [0] - before wait
000000.010 -- [1] - before wait
000000.010 -- [2] - before wait
000000.509 MAIN before evf set
000000.509 MAIN after evf set
000000.509 -- [0] - after wait
000000.509 -- [1] - after wait
000000.509 -- [2] - after wait

Нажмите для просмотра прикрепленного файла
kosyak©
Все разобрался. Эта проблема присуща версии 2.6 (про более ранние не знаю).
По ссылке лежит как раз версия 2.6 (почему я решил что там 2.7 фик его знает). Ну а в 2.7 такое поведение event'ов было исправлено.
Хотелось бы попросить автора чтобы он порт для CortexM4f тоже поправил на версию RTOS 2.7...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.