|
TNKernel->TN_EVENT->старт сразу всех ожидающих флага задач |
|
|
|
Mar 17 2015, 16:44
|

Частый гость
 
Группа: Свой
Сообщений: 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(;;); .... В рабочее состояние перейдет первая созданная задача. Как сделать чтобы все задачи перешли в рабочее состояние?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Mar 17 2015, 17:24
|

Профессионал
    
Группа: Свой
Сообщений: 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 штук).
|
|
|
|
|
Mar 19 2015, 10:04
|
Участник

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

|
в 2.7 просыпаются все.
только что проверил.
/gr
|
|
|
|
|
Mar 19 2015, 10:53
|
Участник

Группа: Свой
Сообщений: 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(;;); }
|
|
|
|
|
Mar 19 2015, 11:29
|

Частый гость
 
Группа: Свой
Сообщений: 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); }
|
|
|
|
|
Mar 19 2015, 12:06
|
Участник

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

|
Цитата(kosyak© @ Mar 19 2015, 15:29)  Попробуйте так .................. Все задачи просыпаются.
|
|
|
|
|
Mar 19 2015, 12:34
|

Частый гость
 
Группа: Свой
Сообщений: 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 Если не сложно не могли бы Вы запустить у себя этот тест.
|
|
|
|
|
Mar 19 2015, 12:36
|
Участник

Группа: Свой
Сообщений: 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 + правки для удобства и отладки, собранные по форуму..
|
|
|
|
|
Mar 20 2015, 10:47
|
Участник

Группа: Свой
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|