Перейти к содержанию
    

Взаимодействие между задачами

Коллеги, добрый день.

Наболел вопрос:

 

Есть задача А , которая управляет всей системой в целом.

Есть задача Б, которая управляет соединением USB , в ней крутится цикл с приёмом данных из очереди.

USB надо "включать" и "выключать" при отключении/подключении устройства к USB шине. Просто удалить задачу Б неправильно.

Если это делать путём передачи в задачу Б команды через очередь или симафор, то эту очередь/симафор надо поллить в цикле, который там крутится.

Если это делать путём сознания задачи В, которая закрывает задачу Б сделав нужные действия с USB, то получается слишком громоздкий код.

Как быть ? Возможно придуман какой-то стандартный путь ? Или я вообще чего-то не понимаю, и неправильно рассуждаю изначально ?

 

МП

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наболел вопрос:

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничего не прояснило :(

Пространно размышлять я умею и сам, в данном случае спрашиваю совета у тех, кто решает задачу на практике.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пространно размышлять я умею и сам, в данном случае спрашиваю совета у тех, кто решает задачу на практике.

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если это делать путём передачи в задачу Б команды через очередь или симафор, то эту очередь/симафор надо поллить в цикле, который там крутится.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

USB надо "включать" и "выключать" при отключении/подключении устройства к USB шине. Просто удалить задачу Б неправильно.

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

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

 

Если это делать путём передачи в задачу Б команды через очередь или симафор, то эту очередь/симафор надо поллить в цикле, который там крутится.

Что здесь смущает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... то получается слишком громоздкий код.

Как быть ? Возможно придуман какой-то стандартный путь ? Или я вообще чего-то не понимаю, и неправильно рассуждаю изначально ?

 

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

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

 

Поэтому менеджер соединений это отдельная задача, которая убивает все очереди и все что вдруг становится ненужным. И да код громоздкий.

Это RTOS ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

> Если это делать путём передачи в задачу Б команды через очередь или симафор, то эту очередь/симафор надо поллить в цикле, который там крутится.

 

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

 

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

 

нету. зачем они нужны если есть семафоры? ну то есть FreeRTOS ориентирована на минимализацию ресурсов, поэтому много чего там нет, но это много чего не принципиально

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нету. зачем они нужны если есть семафоры? ну то есть FreeRTOS ориентирована на минимализацию ресурсов, поэтому много чего там нет, но это много чего не принципиально

Кейловская CMSIS-RTOS RTX попроще будет, а Сигналы есть. Например, можно ждать сигналы от нескольких задач. Просто, красиво, удобно.

  for (;; ) {
    osSignalWait(0x0003, osWaitForever);    // Ждать сигналы от ПЛИС и Main
    ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кейловская CMSIS-RTOS RTX попроще будет, а Сигналы есть. Например, можно ждать сигналы от нескольких задач. Просто, красиво, удобно.

  for (;; ) {
    osSignalWait(0x0003, osWaitForever);    // Ждать сигналы от ПЛИС и Main
    ...

 

Есть и во FreeRTOS механизм передачи сигналов от нескольких задач.

Но только это уже занос, уклон в сторону автоматов.

Тогда от RTOS мало смысла остается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть и во FreeRTOS механизм передачи сигналов от нескольких задач.

Но только это уже занос, уклон в сторону автоматов.

Тогда от RTOS мало смысла остается.

Не могу похвастаться, что я большой специалист в использовании RTOS. Как программу правильно на задачи делить, для меня остается загадкой. У меня нет задач, никак не связанных одна с другой. Поэтому приходится давать пинка от одной к другой, и притормаживать слишком ретивые. Сигналами запускаю, мьютексом блокирую. Еще задержками регулирую. И это всё. Я даже не уверен, что мне нужна RTOS. :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не могу похвастаться, что я большой специалист в использовании RTOS. Как программу правильно на задачи делить, для меня остается загадкой. У меня нет задач, никак не связанных одна с другой. Поэтому приходится давать пинка от одной к другой, и притормаживать слишком ретивые. Сигналами запускаю, мьютексом блокирую. Еще задержками регулирую. И это всё. Я даже не уверен, что мне нужна RTOS. :laughing:

 

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

И не могу найти в middleware которое идет с RTOS где бы применялись мьютексы.

Странно...

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поддержу. Я как-бы когда-то пользовал, но потом по мере роста разумения похерил за ненедобностью. Последним толчком, лет 12 назад, к пониманию ненадобности была именно FreeRTOS, где их де-факто нет, ибо реализованы были ввиде макросов на очередях.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...