реклама на сайте
подробности

 
 
> TNKernel->TN_EVENT->старт сразу всех ожидающих флага задач
kosyak©
сообщение Mar 17 2015, 16:44
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



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

В рабочее состояние перейдет первая созданная задача. Как сделать чтобы все задачи перешли в рабочее состояние?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
megajohn
сообщение Mar 17 2015, 17:24
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



если нужно быстрое решение, то навскидку так
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(;;);


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Mar 17 2015, 17:30
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Не не не. У меня вопрос скорее к RTOS - насколько я понимаю запускаться должны все ожидающие задачи.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 17 2015, 17:38
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Mar 17 2015, 17:44
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Это у меня псевдо код. В реале там есть задержка средствами RTOS.
Все задачи точно успевают вызвать wait_event. А вот просыпается потом только первая и них.
Интересно какое поведение у event в других RTOS?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 17 2015, 19:22
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



В scmRTOS проснутся все задачи, ожидающие данного события.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Grape
сообщение Mar 19 2015, 10:04
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 69
Регистрация: 22-10-04
Пользователь №: 956



в 2.7 просыпаются все.

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

/gr
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Mar 19 2015, 10:13
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



а можно пример кода как Вы проверяли?
Go to the top of the page
 
+Quote Post
Grape
сообщение Mar 19 2015, 10:53
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 69
Регистрация: 22-10-04
Пользователь №: 956



Цитата(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(;;);
}
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Mar 19 2015, 11:29
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Попробуйте так.
Код
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);
}

Go to the top of the page
 
+Quote Post
Grape
сообщение Mar 19 2015, 12:06
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 69
Регистрация: 22-10-04
Пользователь №: 956



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


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

Go to the top of the page
 
+Quote Post
kosyak©
сообщение Mar 19 2015, 12:34
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



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

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

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


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


Прикрепленные файлы
Прикрепленный файл  evftest.zip ( 1000 байт ) Кол-во скачиваний: 17
 
Go to the top of the page
 
+Quote Post
Grape
сообщение Mar 19 2015, 12:36
Сообщение #13


Участник
*

Группа: Свой
Сообщений: 69
Регистрация: 22-10-04
Пользователь №: 956



Цитата(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 + правки для удобства и отладки, собранные по форуму..
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Mar 19 2015, 17:47
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



А у кого выше приоритет? у "MAIN Run"?
Поделись файлом tn_event.c из своей сборки пожалуйста.
Go to the top of the page
 
+Quote Post
Grape
сообщение Mar 20 2015, 10:47
Сообщение #15


Участник
*

Группа: Свой
Сообщений: 69
Регистрация: 22-10-04
Пользователь №: 956



Цитата(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

Прикрепленный файл  tn_event.zip ( 2.42 килобайт ) Кол-во скачиваний: 72
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 22:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016