Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Взаимодействие между задачами
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
MiklPolikov
Коллеги, добрый день.
Наболел вопрос:

Есть задача А , которая управляет всей системой в целом.
Есть задача Б, которая управляет соединением USB , в ней крутится цикл с приёмом данных из очереди.
USB надо "включать" и "выключать" при отключении/подключении устройства к USB шине. Просто удалить задачу Б неправильно.
Если это делать путём передачи в задачу Б команды через очередь или симафор, то эту очередь/симафор надо поллить в цикле, который там крутится.
Если это делать путём сознания задачи В, которая закрывает задачу Б сделав нужные действия с USB, то получается слишком громоздкий код.
Как быть ? Возможно придуман какой-то стандартный путь ? Или я вообще чего-то не понимаю, и неправильно рассуждаю изначально ?

МП
zltigo
QUOTE (MiklPolikov @ Aug 25 2015, 02:53) *
Наболел вопрос:

Что-бы я что понял в описании "проблемы" sad.gif. Как вообще "выключить" задачу - .....suspend()

MiklPolikov
Цитата(zltigo @ Aug 25 2015, 07:30) *
"выключить" задачу

Речь о логике работы.
zltigo
QUOTE (MiklPolikov @ Aug 25 2015, 20:20) *
Речь о логике работы.

Ничего не прояснило sad.gif
MiklPolikov
Цитата(zltigo @ Aug 25 2015, 20:24) *
Ничего не прояснило sad.gif

Пространно размышлять я умею и сам, в данном случае спрашиваю совета у тех, кто решает задачу на практике.
zltigo
QUOTE (MiklPolikov @ Aug 25 2015, 20:37) *
Пространно размышлять я умею и сам, в данном случае спрашиваю совета у тех, кто решает задачу на практике.

Тогда надо срочно учиться задавать вопросы.

ViKo
Цитата(MiklPolikov @ Aug 25 2015, 02:53) *
Если это делать путём передачи в задачу Б команды через очередь или симафор, то эту очередь/симафор надо поллить в цикле, который там крутится.

А есть во FreeRTOS Сигналы (События), по которым задача и запускается? Должны быть.
aaarrr
Цитата(MiklPolikov @ Aug 25 2015, 02:53) *
USB надо "включать" и "выключать" при отключении/подключении устройства к USB шине. Просто удалить задачу Б неправильно.

Зачем вообще удалять задачу при отключении USB?
Что мешает обрабатывать событие подключения/отключения внутри задачи Б?

Цитата(MiklPolikov @ Aug 25 2015, 02:53) *
Если это делать путём передачи в задачу Б команды через очередь или симафор, то эту очередь/симафор надо поллить в цикле, который там крутится.

Что здесь смущает?
AlexandrY
Цитата(MiklPolikov @ Aug 25 2015, 02:53) *
... то получается слишком громоздкий код.
Как быть ? Возможно придуман какой-то стандартный путь ? Или я вообще чего-то не понимаю, и неправильно рассуждаю изначально ?


Задача Б либо управляет соединием, либо " в ней крутится цикл с приёмом данных из очереди"
И то и то задача делать не может, поскольку события разрывов соединений приходят из ISR асинхронно и вешают задачу Б.

Поэтому менеджер соединений это отдельная задача, которая убивает все очереди и все что вдруг становится ненужным. И да код громоздкий.
Это RTOS ...
yes
> Если это делать путём передачи в задачу Б команды через очередь или симафор, то эту очередь/симафор надо поллить в цикле, который там крутится.

семафоры и очереди работают не так (по крайней мере в FreeRTOS и в остальном, что я видел) - при ожидании семафора или очереди задача отключается, ничего там не крутится. а включается когда семафор освободит другая задача/прерывание или в очередь что-то положат

> А есть во FreeRTOS Сигналы (События), по которым задача и запускается? Должны быть.

нету. зачем они нужны если есть семафоры? ну то есть FreeRTOS ориентирована на минимализацию ресурсов, поэтому много чего там нет, но это много чего не принципиально
ViKo
Цитата(yes @ Aug 26 2015, 13:12) *
нету. зачем они нужны если есть семафоры? ну то есть FreeRTOS ориентирована на минимализацию ресурсов, поэтому много чего там нет, но это много чего не принципиально

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


Есть и во FreeRTOS механизм передачи сигналов от нескольких задач.
Но только это уже занос, уклон в сторону автоматов.
Тогда от RTOS мало смысла остается.
ViKo
Цитата(AlexandrY @ Aug 26 2015, 14:03) *
Есть и во FreeRTOS механизм передачи сигналов от нескольких задач.
Но только это уже занос, уклон в сторону автоматов.
Тогда от RTOS мало смысла остается.

Не могу похвастаться, что я большой специалист в использовании RTOS. Как программу правильно на задачи делить, для меня остается загадкой. У меня нет задач, никак не связанных одна с другой. Поэтому приходится давать пинка от одной к другой, и притормаживать слишком ретивые. Сигналами запускаю, мьютексом блокирую. Еще задержками регулирую. И это всё. Я даже не уверен, что мне нужна RTOS. laughing.gif
AlexandrY
Цитата(ViKo @ Aug 26 2015, 14:12) *
Не могу похвастаться, что я большой специалист в использовании RTOS. Как программу правильно на задачи делить, для меня остается загадкой. У меня нет задач, никак не связанных одна с другой. Поэтому приходится давать пинка от одной к другой, и притормаживать слишком ретивые. Сигналами запускаю, мьютексом блокирую. Еще задержками регулирую. И это всё. Я даже не уверен, что мне нужна RTOS. laughing.gif


Завидую. Я до мьютексов даже не добрался. Не знаю как их применять и зачем они вообще нужны.
И не могу найти в middleware которое идет с RTOS где бы применялись мьютексы.
Странно...

zltigo
QUOTE (AlexandrY @ Aug 26 2015, 15:08) *
Я до мьютексов даже не добрался. Не знаю как их применять и зачем они вообще нужны.

Поддержу. Я как-бы когда-то пользовал, но потом по мере роста разумения похерил за ненедобностью. Последним толчком, лет 12 назад, к пониманию ненадобности была именно FreeRTOS, где их де-факто нет, ибо реализованы были ввиде макросов на очередях.
ViKo
У меня мьютекс один, ограничивает доступ к буферу изображения для ЖКИ, чтобы каждая задача рисовала свое полностью.
zltigo
QUOTE (ViKo @ Aug 26 2015, 15:46) *
У меня мьютекс один, ограничивает доступ к буферу изображения для ЖКИ, чтобы каждая задача рисовала свое полностью.

А у меня отдельная задача занимается рисованием извлекая из очереди задания на прорисовку. При этом задача прорисовки при таком подходе легко и непринужденно уносится при необходимости и на другой контролер вынесеный физически куда-нибудь подальше.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.