Перейти к содержанию
    

TNKernel->TN_EVENT->старт сразу всех ожидающих флага задач

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(;;);
....

В рабочее состояние перейдет первая созданная задача. Как сделать чтобы все задачи перешли в рабочее состояние?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если нужно быстрое решение, то навскидку так

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(;;);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не не не. У меня вопрос скорее к RTOS - насколько я понимаю запускаться должны все ожидающие задачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не пользовал TNKernel, но из общих соображений: перед вызовом tn_event_set() надо немного поспать, чтобы все запущенные задачи успели получить управление и вызвать tn_event_wait().

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это у меня псевдо код. В реале там есть задержка средствами RTOS.

Все задачи точно успевают вызвать wait_event. А вот просыпается потом только первая и них.

Интересно какое поведение у event в других RTOS?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а можно пример кода как Вы проверяли?

 

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

 

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(;;);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте так.

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);
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Во вложении файл с тестом.

Вывод в TRACE такой

 

[0] - before wait
[1] - before wait
[2] - before wait
before evf set
after evf set
[0] - after wait

 

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

 

evftest.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм... Я использую 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 + правки для удобства и отладки, собранные по форуму..

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А у кого выше приоритет? у "MAIN Run"?

Поделись файлом tn_event.c из своей сборки пожалуйста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А у кого выше приоритет? у "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

 

tn_event.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...