|
|
  |
AT91SAM7 допустимая частота прерываний, обработать 500000 прерываний в секунду? |
|
|
|
Oct 4 2007, 19:13
|
Местный
  
Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930

|
Цитата(Serg_Sm @ Oct 4 2007, 20:42)  На AT91SAM7X-EK взял пример с таймерами и переделал его под частоту срабатываний прерываний в 500КГц т.е. режим прерывания по сравнению (MCK=48МГц, TIMER_CLOCK1 = 24МГц, TC_RC = 47). Максимально упростил проект - после инициализации таймера пустой бесконечный цикл и в самом прерывании инвертирование выхода. На практике (осциллографом) получается частота изменений (из длительности "0" или "1") максимум 460КГц, в среднем менее 400КГц, причем длительности импульсов "0" и "1" неодинаковые и постоянно болтаются.
Контроллер не успевает обработать прерывания или ещё есть какие-нибудь подводные камни? И вообще можно обработать такой поток и успеть перегнать по USB? Не знаю поможет ли Вам это или нет, но на плате MCBSTR-9 (процессор STR-912F) при тактовой частоте 96 Мгц минимальный пенриод срабатывания таймера получился порядка 7-10 мсек - правда я не старался сильно оптимизировать демонстрационную задачку работы с USB...
|
|
|
|
|
Oct 5 2007, 06:02
|
Местный
  
Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930

|
Цитата(Николай Z @ Oct 4 2007, 23:13)  Не знаю поможет ли Вам это или нет, но на плате MCBSTR-9 (процессор STR-912F) при тактовой частоте 96 Мгц минимальный пенриод срабатывания таймера получился порядка 7-10 мсек - правда я не старался сильно оптимизировать демонстрационную задачку работы с USB... Поправка - вместо USB надлежит читать URRT... Глюк в моске был - када вчерась писал...
|
|
|
|
|
Oct 5 2007, 09:23
|
Частый гость
 
Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167

|
Поток данных от внешнего устройства - асинхронный и непрерывный 512КБит/с. Алгоритм получения данных приблизительно такой: прерывание по изменению фронта, задержка (возможно вторым таймером) для подстройки под "середину" бита, затем считывание бита и запуск таймера с частотой 512КГц, а в прерывании по таймеру считывание остальных битов. Ну и переодическое повторение подстройки частоты, а в цикле передача данных по USB (по готовности). Но похоже придется обходные пути искать, а ПЛИС цеплять очень не хочется. PS: Кстати даже родной USB пример данные с неплохой скоростью гоняет - на передаче из контроллера блоков по 8КБайт (запрос один пакет) получилось ~727КБайт/с. Правда больше ничего не делалось
|
|
|
|
|
Oct 5 2007, 14:37
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(Serg_Sm @ Oct 5 2007, 13:23)  Поток данных от внешнего устройства - асинхронный и непрерывный 512КБит/с. Алгоритм получения данных приблизительно такой: прерывание по изменению фронта, задержка (возможно вторым таймером) для подстройки под "середину" бита, затем считывание бита и запуск таймера с частотой 512КГц, а в прерывании по таймеру считывание остальных битов. Ну и переодическое повторение подстройки частоты, а в цикле передача данных по USB (по готовности). Но похоже придется обходные пути искать, а ПЛИС цеплять очень не хочется. PS: Кстати даже родной USB пример данные с неплохой скоростью гоняет - на передаче из контроллера блоков по 8КБайт (запрос один пакет) получилось ~727КБайт/с. Правда больше ничего не делалось  Лучше запустить на обработку какую-нибудь альтеру
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Oct 8 2007, 09:17
|
Частый гость
 
Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167

|
Цитата(_dem @ Oct 8 2007, 10:54)  а нельзя попробовать прикрутить для этих целей USART c STOP BITS = 0 / NO PARITY + DMA ?
или SPI, сделав на одном внешнем элементе генератор "клока" для него ? Всяко эффективнее и точнее будет, чем пытаться софтово это делать - и ресурсы останутся для пересылки "наверх"
у вас позволительна потеря части данных на время подстройки ? Я сейчас пробую нечто подобное сделать - внешний сдвиговый регистр тактируемый от таймера 0, который (пере) запускается по внешнему прерыванию и прерывание от таймера 1 срабатывающее от 8 тактов таймера 0, в нем загружаются данные с регистра в память. В принципе контроллер такое тянет, проблема в одном - внешнее прерывание срабатывает через 1.4-1.6 микросекунды. Если время реакции уменьшить раза этак в два то должно работать. Что касается USART - проблема будет в подстройке частоты, чую убежит/прибьется битик в поток  Вот с SPI уже интереснее (сам об этом не подумал) - нужен только "клок" от таймера и без внешнего регистра. К нему DMA прикручивается? Потеря данных допустима только вначале - после поток прерываться не должен, а периодические подстройки делать все равно придется. В FAQ прочитал, что реакция на прерывание будет быстрее в THUMB режиме, а как его установить? Если поставить в настройках проекта в IAR, то с такой прошивкой девайс не работает. Как вообще уменьшить время реакции на прерывание?
|
|
|
|
|
Oct 8 2007, 11:59
|
Частый гость
 
Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167

|
Цитата(_dem @ Oct 8 2007, 13:59)  "...внешний сдвиговый регистр тактируемый от таймера 0..." А какова загрузка контроллера при этом ?
К SPI DMA прикручивается.
"В FAQ прочитал, что реакция на прерывание будет быстрее в THUMB режиме, а как его установить? Если поставить в настройках проекта в IAR, то с такой прошивкой девайс не работает."
Какой у вас проект ( используется ли ОС, что взято за основу ИАР-ского проекта ) ?
Ускорить реакцию на прерывание можно, использовав FIQ Что значит загрузка контроллера? Практически получается считать данные, передать по USB и подкорректировать частоту приема внешним прерыванием. Но настоящей проверки пока не делал. Попробую переделать под SPI (внешнего регистра все равно в наличии нет) и прогнать на реальных данных. Подстройка частоты делается нормально и с такой заторможенной реакцией на прерывание, а вот поступающие данные надо проверять. Основа проекта - BasicUSB от Atmel + добавлены обработчики прерываний, ОС естественно нет. Даже c FIQ как я понял существенно ускорить реакцию на прерывание не получится (из FAQ). Не посоветуете пример с SPI и DMA? (DMA в контроллерах еще не доводилось использовать). to defunct: насчет ПЛИС это понятно, но требуется решение подешевле и попроще.
|
|
|
|
|
Oct 23 2007, 12:09
|
Частый гость
 
Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167

|
Если кому интересно, то я доделал данный проект. Правда с прерываниями не получилось - очень тормознутая система (по некоторым замерам до 12 микросекунд). Но оказалось, что средств контроллера вполне хватает, чтобы реализовать прием 512К (возможно и 2М вытянет) потока. Коротко о реализации: данные принимаются по SPI с использованием PDC, а вот тактирует SPI внутренний таймер в режиме WAVESEL, со сбросом по внешнему событию (для подстройки такта). Ну и передача по USB на хост в главном цикле. В итоге только одно прерывание на перепрограммирование DMA контроллера. Так что ПЛИС не понадобилась
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|