Jump to content
    

Активировать задачу из не системного прерывания

1 hour ago, jcxz said:

Таким образом сразу гробятся все нижележащие (по приоритету) задачи.  :hang3:

Да, это плата.

1 hour ago, jcxz said:

Если "так приходится делать", то скорее всего нужно открывать учебник и читать: что такое "event-driven программирование" и как его правильно готовить.

Как быть, если периферия (SPI в STM32F091) выставляет флаг BUSY в регистре STATUS от которого нет прерывания? Т.е. события не может возникнуть.

Share this post


Link to post
Share on other sites

25 минут назад, _3m сказал:

Результат не будет достигнут

Ну я же и объяснил, и показал, как это делается. Задача подготавливает и запускает работу модуля, который будет вызывать высокоприоритетное прерывание. Приоритет этой задачи можно даже не повышать, чтобы обеспечить многозадачность. В  прерывании выполняется короткий код (прием байтов по интерфейсу?). Затем после завершения приема всех байтов, это прерывание выставляет флаг готовности. Ну а задача потом, когда перейдет в активное состояние, сразу подхватывает этот флаг и продолжается далее, отправляя нотификацию или очередь в другую задачу-обработчик и после этого приостанавливается до следующего раза. Задача обработчик будет разблокирована по её очереди в соответствии с её приоритетом. Всё ж просто и понятно же.

Или же используйте приём по DMA, он примет все байты без участия ЦПУ и по завершению вызовет прерывание, имеющее обычный приоритет RTOS, которое в свою очередь отправит уведомление в задачу-обработчик данных и разблокирует еёйную. Тоже все аккуратно и просто.

Edited by EdgeAligned

Share this post


Link to post
Share on other sites

2 часа назад, haker_fox сказал:

Как быть, если периферия (SPI в STM32F091) выставляет флаг BUSY в регистре STATUS от которого нет прерывания? Т.е. события не может возникнуть.

Запустить от него интервал по таймеру и проверить в прерывании завершения этого интервала. Самый простой способ.

Share this post


Link to post
Share on other sites

14 minutes ago, jcxz said:

Запустить от него интервал по таймеру и проверить в прерывании завершения этого интервала.

Т.е. запускаем таймер, который периодически в прерывании начинает проверять флаг. Запускаем транзакцию на шине. Когда флаг будет выставлен, код обработчика прерывания просигнализирует задаче о готовности любым доступным и уместным средством межпроцессного взаимодействия, предоставляемым данной ОСРВ. Я правильно Вас понял?

Share this post


Link to post
Share on other sites

3 минуты назад, haker_fox сказал:

Т.е. запускаем таймер, который периодически в прерывании начинает проверять флаг. Запускаем транзакцию на шине. Когда флаг будет выставлен, код обработчика прерывания просигнализирует задаче о готовности любым доступным и уместным средством межпроцессного взаимодействия, предоставляемым данной ОСРВ. Я правильно Вас понял?

Почти. Только не "периодически", а "однократно". Зачем периодически? Достаточно выяснить примерное время снятия BUSY и выставлять таймер на чуть бОльшее время.

В ISR достаточно предусмотреть только assert. Для разработчика.

Share this post


Link to post
Share on other sites

9 hours ago, jcxz said:

В ISR достаточно предусмотреть только assert. Для разработчика.

Ну что ж, скажу так: очень оригинальное и необычное решение! Мне такое в голову даже не приходило. Возьму это себе на вооружение заметку!

Share this post


Link to post
Share on other sites

10 hours ago, haker_fox said:

Т.е. запускаем таймер, который периодически в прерывании начинает проверять флаг.

Можно для этого использовать vApplicationTickHook().

 

Share this post


Link to post
Share on other sites

8 minutes ago, tonyk_av said:

Можно для этого использовать vApplicationTickHook().

В принципе, да. При этом разрешение опроса флага таймером составит, как правило 1 мс. Понимаю, что настройка частоты SysTick, или иного, используемого для целей вызова планировщика, может быть адаптирована под конкретные требования. В случае же упомянутого выше флага BUSY из периферии SPI, ЕМНИПИ, счёт шёл на сотни мкс.

Share this post


Link to post
Share on other sites

Ну и ничего страшного! В противоположность обычному методу без RTOS, работа задач в RTOS может содержать полинг чего-либо, особенно когда речь о коротких интервалах менее интервала переключения задач. Это упрощает построение программы, убирает лишний мусор, такой как запуск таймера и работу с ним. Потому я и говорю - кривой тот метод с таймером, ну так себе он.

И еще раз повторюсь - написание под RTOS - это своего рода искусство компромиссных решений.

Share this post


Link to post
Share on other sites

5 minutes ago, EdgeAligned said:

Потому я и говорю - кривой тот метод с таймером, ну так себе он.

Да мы уже все поняли, что Вы хотите сказать) А мне метод - нравится! Хотя бы тем, что он необычный и пикантный!

Share this post


Link to post
Share on other sites

6 часов назад, haker_fox сказал:

Ну что ж, скажу так: очень оригинальное и необычное решение! Мне такое в голову даже не приходило.

Ёрничаете?  :wink:

PS: Кстати - необязательно для этого использовать таймер (и тратить целый таймер(!) на это). Часто я (для экономии таймеров и упрощения кода (чтобы всё в одном ISR было)), такое делаю отправкой/приёмом слова через тот же SPI. Но - отправкой с неактивным CS. Получается просто как небольшая задержка. Особенно - если ещё и установить для неё другую размерность слова (меньшее число бит).

Share this post


Link to post
Share on other sites

5 hours ago, haker_fox said:

А мне метод - нравится!

Я бы сильно задумался, почему мне вдруг понадобилось опрашивать флаг периферии, который не формирует прерывание. Возможно, алгоритм работы с периферией не удачен, коли приходится так извращаться.

Share this post


Link to post
Share on other sites

5 часов назад, EdgeAligned сказал:

Потому я и говорю - кривой тот метод с таймером, ну так себе он.

И что же там "кривого"?

Кривой здесь - МК, SPI которого имеет такие кривости "особенности". И вынуждает лепить дополнительные меры для коррекции.

9 минут назад, tonyk_av сказал:

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

.....или МК выбран не удачно.  :biggrin:

PS: Какой не выбирай алгоритм работы с флешкой, один фиг нужен минимальный интервал времени, в течение которого CS должен оставаться высоким. Между двумя соседними транзакциями по SPI. И если SPI-контроллер данного МК не умеет автоматом формировать этот интервал, или не умеет генерить прерывания по его окончанию - тут уже правка алгоритма никак не поможет. Только замена МК или выдержка интервала сторонними способами.  :unknw:

Очевидно, создатели данного МК создавали его под super-loop-ный способ работы с флешкой. И никогда не слышали про РТОС на МК.  :unknw:

Share this post


Link to post
Share on other sites

10 minutes ago, jcxz said:

Ёрничаете?  :wink:

Так читается моё сообщение? Сорян, ничего даже подобного не было. Я написал то, что хотел выразить. Жаль, что иногда искренний восторг воспринимается как лёгкий сарказм😜 Это минус невербального общения💗

12 minutes ago, jcxz said:

Но - отправкой с неактивным CS. Получается просто как небольшая задержка.

Хм! Интересный подход! Из нестандартного применения SPI я недавно только использовал его для формирования кода сигма-дельта ЦАП по документации от TI. Когда данные с MISO (SPI тактировался как подчинённый от таймера для исключения джиттера фреймов) шли на ФНЧ, а сам двоичный код рассчтиывался в обработчике прерывания.

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.

×
×
  • Create New...