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

 
 
> FreeRTOS и микросекундные задержки
AlexMad
сообщение Apr 17 2009, 18:47
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 262
Регистрация: 18-02-05
Из: SPb
Пользователь №: 2 743



может, стоит переместить в тему для начинающих...

По моему разумению, если у меня configTICK_RATE_HZ равен 1000 (то есть планировщик крутится с периодом 1 миллисекунда), то vTaskDelay() и vTaskDelayUntil() у меня могут работать не быстрее одной миллисекунды.
А мне надо задержки в микросекундах (для работы с iButton, да и не только).
Поиск по словам FreeRTOS, delay, us привели только к http://www.google.ru/codesearch/p?hl=ru#YO...os%20delay%20us (в районе 700-ой строки), но использовать NOP в ОСРВ как-то не кошерно. В голове крутится мысль, что надо просто запустить свободный таймер и по нему отсчитывать задержки. Смущает только то, что гугль на подобное решение в связке с FreeRTOS не направляет - толи никто не озадачивается таким вопросом, толи он для всех слишком очевиден.
P.S. речь идет о LPC2388.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 11)
FormatCft
сообщение Apr 17 2009, 18:51
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 331
Регистрация: 22-07-08
Из: Р О С С И Я
Пользователь №: 39 145



Цитата(AlexMad @ Apr 18 2009, 00:47) *
может, стоит переместить в тему для начинающих...

По моему разумению, если у меня configTICK_RATE_HZ равен 1000 (то есть планировщик крутится с периодом 1 миллисекунда), то vTaskDelay() и vTaskDelayUntil() у меня могут работать не быстрее одной миллисекунды.
А мне надо задержки в микросекундах (для работы с iButton, да и не только).
Поиск по словам FreeRTOS, delay, us привели только к http://www.google.ru/codesearch/p?hl=ru#YO...os%20delay%20us (в районе 700-ой строки), но использовать NOP в ОСРВ как-то не кошерно. В голове крутится мысль, что надо просто запустить свободный таймер и по нему отсчитывать задержки. Смущает только то, что гугль на подобное решение в связке с FreeRTOS не направляет - толи никто не озадачивается таким вопросом, толи он для всех слишком очевиден.
P.S. речь идет о LPC2388.

Можно подкрутить configTICK_RATE_HZ. Мне удобнее было сделать 6000 для проекта. Можно сделать еще больше. Но предел всё же есть )
Go to the top of the page
 
+Quote Post
AlexMad
сообщение Apr 17 2009, 18:55
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 262
Регистрация: 18-02-05
Из: SPb
Пользователь №: 2 743



Цитата(FormatCft @ Apr 17 2009, 22:51) *
Можно подкрутить configTICK_RATE_HZ. Мне удобнее было сделать 6000 для проекта. Можно сделать еще больше. Но предел всё же есть )


В том-то и дело, что предел есть, мне удалось только в 10 раз уменьшить configTICK_RATE_HZ, дальше уже начинаются ошибки блокировки (BlockTime).
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Apr 17 2009, 19:15
Сообщение #4


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(AlexMad @ Apr 17 2009, 21:47) *
А мне надо задержки в микросекундах (для работы с iButton, да и не только).
...
P.S. речь идет о LPC2388.

У вас 4 UART. Выделите один для iButton, и неободимости в задержках для iButoon уже нету smile.gif
У меня UART0 используется для программирования, отладки и 1wire.
Расскажите для чего еще задержки нужны?
Go to the top of the page
 
+Quote Post
AlexMad
сообщение Apr 17 2009, 19:26
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 262
Регистрация: 18-02-05
Из: SPb
Пользователь №: 2 743



Цитата(HARMHARM @ Apr 17 2009, 23:15) *
У вас 4 UART. Выделите один для iButton, и неободимости в задержках для iButoon уже нету smile.gif
У меня UART0 используется для программирования, отладки и 1wire.
Расскажите для чего еще задержки нужны?


А поподробней можно? Вроде, где-то что-то перед глазами мелькало про совмещение УАРТа с iButton, буду рад, если ткнете носом, но текущей проблемы это не решит - железо уже реализовано, да и кроме iButton-а есть еще подключенные на разные ноги датчики температуры, на все уартов не хватит.
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Apr 17 2009, 19:31
Сообщение #6


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(AlexMad @ Apr 17 2009, 22:26) *
А поподробней можно? Вроде, где-то что-то перед глазами мелькало про совмещение УАРТа с iButton, буду рад, если ткнете носом, но текущей проблемы это не решит - железо уже реализовано, да и кроме iButton-а есть еще подключенные на разные ноги датчики температуры, на все уартов не хватит.

Я обошелся одним уартом на датчики и iButton сразу. Очень удобно.
Вот апноут от Maxim с описанием. Никаких граблей.
Самым сложным было измерение температуры на датчиках с оборваным питанием - они как-бы питаются от шины (VCC к GND не подключен), но сбрасываются при измерении...
Go to the top of the page
 
+Quote Post
AlexMad
сообщение Apr 17 2009, 19:57
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 262
Регистрация: 18-02-05
Из: SPb
Пользователь №: 2 743



Цитата(HARMHARM @ Apr 17 2009, 23:31) *
Я обошелся одним уартом на датчики и iButton сразу. Очень удобно.
Вот апноут от Maxim с описанием. Никаких граблей.
Самым сложным было измерение температуры на датчиках с оборваным питанием - они как-бы питаются от шины (VCC к GND не подключен), но сбрасываются при измерении...

За наводку спасибо, буду читать. Но сути проблемы это не меняет - у меня есть устройство, в котором надо зажигать светодиод на 1-10 микросекунд, сейчас я это выдерживаю просто циклами, но вопрос-то и был - как правильнее это организовать во FreeRTOS?
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Apr 17 2009, 20:04
Сообщение #8


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(AlexMad @ Apr 17 2009, 22:57) *
За наводку спасибо, буду читать. Но сути проблемы это не меняет - у меня есть устройство, в котором надо зажигать светодиод на 1-10 микросекунд, сейчас я это выдерживаю просто циклами, но вопрос-то и был - как правильнее это организовать во FreeRTOS?

ИМХО нужно использовать таймер... Потому что сама FreeRTOS тут уже ничем не поможет.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Apr 18 2009, 03:24
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(AlexMad @ Apr 17 2009, 23:57) *
За наводку спасибо, буду читать. Но сути проблемы это не меняет - у меня есть устройство, в котором надо зажигать светодиод на 1-10 микросекунд, сейчас я это выдерживаю просто циклами, но вопрос-то и был - как правильнее это организовать во FreeRTOS?

Задержки таких порядков делаются либо аппаратно с использованием соответствущих интерфейсов (UART, таймер с compare модулем и т.п.), либо программно пустым циклом. Причем на современных контроллерах рассчитать точную программную задержку достаточно сложно, поскольку будет она зависеть от работы конвейера, настроки акселератора памяти (МАМ для LPC). Тут будет лучше завести один таймер, чтобы он тикал аппаратно, и поллить регистр его счетчика.
Учитывайте, что если вы хотите сделать задерку порядка единиц микросекунд через сервис ОС, то ОС на это время будет передавать управление другой задаче. Но только накладные расходы по переключению контекста у вас будут соизмеримы или больше времени задержки, которую вы хотите обеспечить. Для uCOS переключение контекста на LPC с тактовой ядра 60МГц и включенным полностью МАМ имеет порядок 10 мкс. У вас же на ожидание задержки ОС будет как минимум 2 переключения контекста - туда и обратно, да еще учтите накладные расходы по обслуживанию таймера ОС, где будут обрабатываться таймауты всех задач, работающих в данный момент.
Поэтому - при проектировании устройства распределяйте аппаратные функции периферии так, чтобы на нужных выводах у вас можно было аппаратно производить генерацию импульсов малой длительности.
Если у вас это уже выведено на GPIO - делайте это программно. Но тут есть одно "но". Если вам нужно сделать задержку программно "не менее чем", то тут все достаточно не сложно, просто делаете пустой цикл. Если же вам нужно делать точную временную задержки - то ее нужно делать в критической секции ОС. Для 1-Wire полностью программная реализация на программных задержках будет неэффективна. Будете в одной задаче постоянно торчать, а другие блокировать. Реализуйте 1-Wire c помощью UART как вам уже выше сказали, либо на capture - compare модулях таймера.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
FormatCft
сообщение Apr 18 2009, 05:56
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 331
Регистрация: 22-07-08
Из: Р О С С И Я
Пользователь №: 39 145



Цитата(AlexMad @ Apr 18 2009, 01:57) *
За наводку спасибо, буду читать. Но сути проблемы это не меняет - у меня есть устройство, в котором надо зажигать светодиод на 1-10 микросекунд, сейчас я это выдерживаю просто циклами, но вопрос-то и был - как правильнее это организовать во FreeRTOS?


Еще, кстати, есть преобразователи интерфейсов из I2C в 1Wire.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Apr 18 2009, 07:21
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(FormatCft @ Apr 18 2009, 09:56) *
Еще, кстати, есть преобразователи интерфейсов из I2C в 1Wire.

Лишняя трата денег, имхо.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Faradey
сообщение Apr 19 2009, 23:21
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638



я для 1wire с freertos реализовывал не сложный конечный автомат на прерывании таймера, который все необходимые задержки и выдерживал. В конце работы результат складывал в очередь которую уже обрабатывал "штатный" поток самой ос.

З.Ы. спасибо HARMHARM за UART для 1Wire.


--------------------
Завтра пойму, что нужно было сделать вчера...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:50
Рейтинг@Mail.ru


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