|
Взаимодействие между задачами, Как правильнее ? |
|
|
|
Aug 24 2015, 23:53
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Коллеги, добрый день. Наболел вопрос:
Есть задача А , которая управляет всей системой в целом. Есть задача Б, которая управляет соединением USB , в ней крутится цикл с приёмом данных из очереди. USB надо "включать" и "выключать" при отключении/подключении устройства к USB шине. Просто удалить задачу Б неправильно. Если это делать путём передачи в задачу Б команды через очередь или симафор, то эту очередь/симафор надо поллить в цикле, который там крутится. Если это делать путём сознания задачи В, которая закрывает задачу Б сделав нужные действия с USB, то получается слишком громоздкий код. Как быть ? Возможно придуман какой-то стандартный путь ? Или я вообще чего-то не понимаю, и неправильно рассуждаю изначально ?
МП
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
Aug 25 2015, 18:45
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(MiklPolikov @ Aug 25 2015, 02:53)  USB надо "включать" и "выключать" при отключении/подключении устройства к USB шине. Просто удалить задачу Б неправильно. Зачем вообще удалять задачу при отключении USB? Что мешает обрабатывать событие подключения/отключения внутри задачи Б? Цитата(MiklPolikov @ Aug 25 2015, 02:53)  Если это делать путём передачи в задачу Б команды через очередь или симафор, то эту очередь/симафор надо поллить в цикле, который там крутится. Что здесь смущает?
|
|
|
|
|
Aug 25 2015, 19:16
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(MiklPolikov @ Aug 25 2015, 02:53)  ... то получается слишком громоздкий код. Как быть ? Возможно придуман какой-то стандартный путь ? Или я вообще чего-то не понимаю, и неправильно рассуждаю изначально ? Задача Б либо управляет соединием, либо " в ней крутится цикл с приёмом данных из очереди" И то и то задача делать не может, поскольку события разрывов соединений приходят из ISR асинхронно и вешают задачу Б. Поэтому менеджер соединений это отдельная задача, которая убивает все очереди и все что вдруг становится ненужным. И да код громоздкий. Это RTOS ...
|
|
|
|
|
Aug 26 2015, 11:03
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(ViKo @ Aug 26 2015, 13:28)  Кейловская CMSIS-RTOS RTX попроще будет, а Сигналы есть. Например, можно ждать сигналы от нескольких задач. Просто, красиво, удобно. Код for (;; ) { osSignalWait(0x0003, osWaitForever); // Ждать сигналы от ПЛИС и Main ... Есть и во FreeRTOS механизм передачи сигналов от нескольких задач. Но только это уже занос, уклон в сторону автоматов. Тогда от RTOS мало смысла остается.
|
|
|
|
|
Aug 26 2015, 12:16
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (AlexandrY @ Aug 26 2015, 15:08)  Я до мьютексов даже не добрался. Не знаю как их применять и зачем они вообще нужны. Поддержу. Я как-бы когда-то пользовал, но потом по мере роста разумения похерил за ненедобностью. Последним толчком, лет 12 назад, к пониманию ненадобности была именно FreeRTOS, где их де-факто нет, ибо реализованы были ввиде макросов на очередях.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|