реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Очередь в прерываниях, чаще системного тика, is it OK?
Cosmojam
сообщение Feb 15 2012, 08:37
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Есть некая задача, требующая прерывания каждые 250мкс и обмен данными с другими задачами. Для получения этого времени использую таймер. Системный тик - 1мс.
Подскажите, нормально ли использовать встроенный механизм очередей для обмена данными между задачами и прерыванием, которое в 4 раза чаще тика?


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
diwil
сообщение Feb 15 2012, 08:49
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



Цитата(Cosmojam @ Feb 15 2012, 12:37) *
Есть некая задача, требующая прерывания каждые 250мкс и обмен данными с другими задачами. Для получения этого времени использую таймер. Системный тик - 1мс.
Подскажите, нормально ли использовать встроенный механизм очередей для обмена данными между задачами и прерыванием, которое в 4 раза чаще тика?


нормально, если очередь длинная, но очень неэффективно.
Go to the top of the page
 
+Quote Post
Terminator
сообщение Feb 15 2012, 09:26
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



Цитата(diwil @ Feb 15 2012, 15:49) *
нормально, если очередь длинная, но очень неэффективно.

Почему?
Go to the top of the page
 
+Quote Post
diwil
сообщение Feb 15 2012, 10:25
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



Цитата(Terminator @ Feb 15 2012, 13:26) *
Почему?


для записи элемента в очередь используется довольно-таки большой и тяжелый механизм. Он будет вызываться 4 раза на тик. Это будет отъедать время, которое могут использовать другие задачи (включая сон).



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

Например:

FreeRTOS 7.0, Keil. Тики - 10мс. UART @57600 примерно 2kbytes/sec передается. STM32L152 @ 16MHz. Разница очереди (каждый принятый байт в очередь) и буфера - примерно 0.2мА не в пользу очереди.
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение Feb 15 2012, 15:48
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Спасибо за ответы


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01388 секунд с 7
ELECTRONIX ©2004-2016