kosyak© 0 17 марта, 2015 Опубликовано 17 марта, 2015 · Жалоба 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 3 17 марта, 2015 Опубликовано 17 марта, 2015 · Жалоба если нужно быстрое решение, то навскидку так 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© 0 17 марта, 2015 Опубликовано 17 марта, 2015 · Жалоба Не не не. У меня вопрос скорее к RTOS - насколько я понимаю запускаться должны все ожидающие задачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 17 марта, 2015 Опубликовано 17 марта, 2015 · Жалоба Я не пользовал TNKernel, но из общих соображений: перед вызовом tn_event_set() надо немного поспать, чтобы все запущенные задачи успели получить управление и вызвать tn_event_wait(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kosyak© 0 17 марта, 2015 Опубликовано 17 марта, 2015 · Жалоба Это у меня псевдо код. В реале там есть задержка средствами RTOS. Все задачи точно успевают вызвать wait_event. А вот просыпается потом только первая и них. Интересно какое поведение у event в других RTOS? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 17 марта, 2015 Опубликовано 17 марта, 2015 · Жалоба В scmRTOS проснутся все задачи, ожидающие данного события. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grape 0 19 марта, 2015 Опубликовано 19 марта, 2015 · Жалоба в 2.7 просыпаются все. только что проверил. /gr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kosyak© 0 19 марта, 2015 Опубликовано 19 марта, 2015 · Жалоба а можно пример кода как Вы проверяли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grape 0 19 марта, 2015 Опубликовано 19 марта, 2015 · Жалоба а можно пример кода как Вы проверяли? задержки в тиках сист.таймера. 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© 0 19 марта, 2015 Опубликовано 19 марта, 2015 · Жалоба Попробуйте так. 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 0 19 марта, 2015 Опубликовано 19 марта, 2015 · Жалоба Попробуйте так .................. Все задачи просыпаются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kosyak© 0 19 марта, 2015 Опубликовано 19 марта, 2015 · Жалоба Хм... Я использую v2.7 порт для CortexM4. Во вложении файл с тестом. Вывод в TRACE такой [0] - before wait [1] - before wait [2] - before wait before evf set after evf set [0] - after wait Если не сложно не могли бы Вы запустить у себя этот тест. evftest.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grape 0 19 марта, 2015 Опубликовано 19 марта, 2015 · Жалоба Хм... Я использую 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© 0 19 марта, 2015 Опубликовано 19 марта, 2015 · Жалоба А у кого выше приоритет? у "MAIN Run"? Поделись файлом tn_event.c из своей сборки пожалуйста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grape 0 20 марта, 2015 Опубликовано 20 марта, 2015 · Жалоба А у кого выше приоритет? у "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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться