MiklPolikov 0 Posted August 24, 2015 · Report post Коллеги, добрый день. Наболел вопрос: Есть задача А , которая управляет всей системой в целом. Есть задача Б, которая управляет соединением USB , в ней крутится цикл с приёмом данных из очереди. USB надо "включать" и "выключать" при отключении/подключении устройства к USB шине. Просто удалить задачу Б неправильно. Если это делать путём передачи в задачу Б команды через очередь или симафор, то эту очередь/симафор надо поллить в цикле, который там крутится. Если это делать путём сознания задачи В, которая закрывает задачу Б сделав нужные действия с USB, то получается слишком громоздкий код. Как быть ? Возможно придуман какой-то стандартный путь ? Или я вообще чего-то не понимаю, и неправильно рассуждаю изначально ? МП Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
zltigo 0 Posted August 25, 2015 · Report post Наболел вопрос: Что-бы я что понял в описании "проблемы" :(. Как вообще "выключить" задачу - .....suspend() Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
MiklPolikov 0 Posted August 25, 2015 · Report post "выключить" задачу Речь о логике работы. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
zltigo 0 Posted August 25, 2015 · Report post Речь о логике работы. Ничего не прояснило :( Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
MiklPolikov 0 Posted August 25, 2015 · Report post Ничего не прояснило :( Пространно размышлять я умею и сам, в данном случае спрашиваю совета у тех, кто решает задачу на практике. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
zltigo 0 Posted August 25, 2015 · Report post Пространно размышлять я умею и сам, в данном случае спрашиваю совета у тех, кто решает задачу на практике. Тогда надо срочно учиться задавать вопросы. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
ViKo 0 Posted August 25, 2015 · Report post Если это делать путём передачи в задачу Б команды через очередь или симафор, то эту очередь/симафор надо поллить в цикле, который там крутится. А есть во FreeRTOS Сигналы (События), по которым задача и запускается? Должны быть. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
aaarrr 1 Posted August 25, 2015 · Report post USB надо "включать" и "выключать" при отключении/подключении устройства к USB шине. Просто удалить задачу Б неправильно. Зачем вообще удалять задачу при отключении USB? Что мешает обрабатывать событие подключения/отключения внутри задачи Б? Если это делать путём передачи в задачу Б команды через очередь или симафор, то эту очередь/симафор надо поллить в цикле, который там крутится. Что здесь смущает? Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
AlexandrY 0 Posted August 25, 2015 · Report post ... то получается слишком громоздкий код. Как быть ? Возможно придуман какой-то стандартный путь ? Или я вообще чего-то не понимаю, и неправильно рассуждаю изначально ? Задача Б либо управляет соединием, либо " в ней крутится цикл с приёмом данных из очереди" И то и то задача делать не может, поскольку события разрывов соединений приходят из ISR асинхронно и вешают задачу Б. Поэтому менеджер соединений это отдельная задача, которая убивает все очереди и все что вдруг становится ненужным. И да код громоздкий. Это RTOS ... Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
yes 0 Posted August 26, 2015 · Report post > Если это делать путём передачи в задачу Б команды через очередь или симафор, то эту очередь/симафор надо поллить в цикле, который там крутится. семафоры и очереди работают не так (по крайней мере в FreeRTOS и в остальном, что я видел) - при ожидании семафора или очереди задача отключается, ничего там не крутится. а включается когда семафор освободит другая задача/прерывание или в очередь что-то положат > А есть во FreeRTOS Сигналы (События), по которым задача и запускается? Должны быть. нету. зачем они нужны если есть семафоры? ну то есть FreeRTOS ориентирована на минимализацию ресурсов, поэтому много чего там нет, но это много чего не принципиально Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
ViKo 0 Posted August 26, 2015 · Report post нету. зачем они нужны если есть семафоры? ну то есть FreeRTOS ориентирована на минимализацию ресурсов, поэтому много чего там нет, но это много чего не принципиально Кейловская CMSIS-RTOS RTX попроще будет, а Сигналы есть. Например, можно ждать сигналы от нескольких задач. Просто, красиво, удобно. for (;; ) { osSignalWait(0x0003, osWaitForever); // Ждать сигналы от ПЛИС и Main ... Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
AlexandrY 0 Posted August 26, 2015 · Report post Кейловская CMSIS-RTOS RTX попроще будет, а Сигналы есть. Например, можно ждать сигналы от нескольких задач. Просто, красиво, удобно. for (;; ) { osSignalWait(0x0003, osWaitForever); // Ждать сигналы от ПЛИС и Main ... Есть и во FreeRTOS механизм передачи сигналов от нескольких задач. Но только это уже занос, уклон в сторону автоматов. Тогда от RTOS мало смысла остается. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
ViKo 0 Posted August 26, 2015 · Report post Есть и во FreeRTOS механизм передачи сигналов от нескольких задач. Но только это уже занос, уклон в сторону автоматов. Тогда от RTOS мало смысла остается. Не могу похвастаться, что я большой специалист в использовании RTOS. Как программу правильно на задачи делить, для меня остается загадкой. У меня нет задач, никак не связанных одна с другой. Поэтому приходится давать пинка от одной к другой, и притормаживать слишком ретивые. Сигналами запускаю, мьютексом блокирую. Еще задержками регулирую. И это всё. Я даже не уверен, что мне нужна RTOS. :laughing: Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
AlexandrY 0 Posted August 26, 2015 · Report post Не могу похвастаться, что я большой специалист в использовании RTOS. Как программу правильно на задачи делить, для меня остается загадкой. У меня нет задач, никак не связанных одна с другой. Поэтому приходится давать пинка от одной к другой, и притормаживать слишком ретивые. Сигналами запускаю, мьютексом блокирую. Еще задержками регулирую. И это всё. Я даже не уверен, что мне нужна RTOS. :laughing: Завидую. Я до мьютексов даже не добрался. Не знаю как их применять и зачем они вообще нужны. И не могу найти в middleware которое идет с RTOS где бы применялись мьютексы. Странно... Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
zltigo 0 Posted August 26, 2015 · Report post Я до мьютексов даже не добрался. Не знаю как их применять и зачем они вообще нужны. Поддержу. Я как-бы когда-то пользовал, но потом по мере роста разумения похерил за ненедобностью. Последним толчком, лет 12 назад, к пониманию ненадобности была именно FreeRTOS, где их де-факто нет, ибо реализованы были ввиде макросов на очередях. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...