Jump to content

    

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

Recommended Posts

MiklPolikov

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

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

 

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

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

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

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

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

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

 

МП

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

 

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

 

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

Это RTOS ...

Share this post


Link to post
Share on other sites

yes

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

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

Странно...

 

 

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.