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

 
 
> at90usb1287 - малая скорость передачи по USB, Передача данных в режиме CDC USB
Mty
сообщение Nov 23 2010, 09:14
Сообщение #1


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

Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560



Привет!

Необходимо за 0.1 сек передать с at90usb1287 в комп массив данных из 600 чисел типа int
Я пользуюсь для этого printf()

Код
    
while( buffindex < buffmax ){
printf( "%x %x\r\n", databuff[ buffindex ], databuff[ buffindex + 1 ] );  
buffindex += 2;
}


И получаю очень малую скорость - порядка 100 байт за 0.1 секунды.
А нужно порядка 20 килобайт в секунду.
Посоветуйте, как можно увеличить скорость, что я делаю не так?

За основу я взял AT90USBxxx CDC demonstration с сайта Atmel.
Функцию вывода буффера я поместил в функцию cdc_task()

Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zhevak
сообщение Nov 23 2010, 10:11
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(Mty @ Nov 23 2010, 14:14) *
И получаю очень малую скорость - порядка 100 байт за 0.1 секунды.
А нужно порядка 20 килобайт в секунду.
Посоветуйте, как можно увеличить скорость, что я делаю не так?

Отделите мух (USB) от котлет (printf) и попробуйте найти, кто из них самый медленный.

Может быть имеет смысл сначала накидать инфу в буфер (sprintf), так сказать подготовить данные к передаче. А потом уже готовый текст выводить из этого буфера. К стати, почему Вы используете printf? Для конвертации их int в ASCII есть более быстрая функция -- itoa.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 23 2010, 11:57
Сообщение #3


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(zhevak @ Nov 23 2010, 13:11) *
К стати, почему Вы используете printf? Для конвертации их int в ASCII есть более быстрая функция -- itoa.

Есть где? В стандарте C? Однако же в IAR-компиляторе ее нет и никогда не было.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 23 2010, 12:00
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Передавайте бинарный массив сразу без всяких printf.
Должно стать ЗНАЧИТЕЛЬНО быстрее.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Mty
сообщение Nov 23 2010, 13:14
Сообщение #5


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

Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560



Цитата(demiurg_spb @ Nov 23 2010, 15:00) *
Передавайте бинарный массив сразу без всяких printf.
Должно стать ЗНАЧИТЕЛЬНО быстрее.


Спасибо.
Как вариант. Попробую. Со стороны РС будет прога на LabView.
Пока что терминал putty в режиме com port.

---

У меня возникла одна мысль.
Для нормальной обработки система должна работать в режиме "мультизадачности"
В библиотеке atmel usb есть scheduler() который запускает по очереди cdc_task() и usb_task() в цикле.
А я внутри функции cdc_task() запихиваю большой массив данных в USB.
Может проблемы возникают из за того что блокируется usb_task в это время?
Go to the top of the page
 
+Quote Post
zhevak
сообщение Nov 23 2010, 13:59
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(Mty @ Nov 23 2010, 18:14) *
Спасибо.
Как вариант. Попробую. Со стороны РС будет прога на LabView.
Пока что терминал putty в режиме com port.

Эх, если бы Вы юзали Линух, я бы Вам посоветовал одну вещицу...

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

После миграции на Линь и открытия для себя UNUX-way, я понял, что все эти сложности не от великого ума. Эти сложности надуманны и провоцируются M$-подходом. Цель более чем банальна -- нарубить как можно больше капусты. Чем сложнее и навороченнее прога, тем больше бабла можно снять с клиента. И никого не волнует, что функциональность в системе многократно дублируется и переплетается с уже готовыми решениями очень хитрыми способами. По большому счету эта бесполезная мишура и самообман. Вы обманывайте своих клиентов. Как минимум это не этично. Но простительно, т.к. это краеугольный камень любого успешного бизнеса. Но вы также обманываете и себя. А это уже -- себя не уважать. Вы тратите свою жизнь не на движение вперед, а на создание малоотличающихся копий сущностей -- точно таких же, но только с кнопочкой "изменить цвет панели". А главная зада, не решается. Она замерзла на этапе отладки очередного дубля сущности. Вы понимаете меня?

Но я сильно отвлекся. Итак. После перехода на Линух, у меня на стороне компа нет никаких моих комповых программ вообще! Все, что мне надо, делается одной-двумя командами оболочки. Например, так:

$ stty -F /dev/ttyUSB0 115200
$ cat /dev/ttyUSB0 mydata

Если надо как-то отслеживать получаемые данные, то добавляю команду tee

$ cat /dev/ttyUSB0 | tee mydata

Теперь, когда данные приняты и записаны в файле, я могу с ними делать все, что захочу. Нужно разбить данные на столбцы, на строки, собрать обратно? -- все это есть в утилитах Линя. Нужно построить графики? -- пожалуйста, gnuplot? Нужно обработать каким-то необычным методом? -- Тоже не проблема. Пишу свою консольную линуховую прогу. Но я не обманываю себя, я не делаю ненужной работы, например, по украшательству оконного интерфейса. Через полчаса-час моя брутально-написанная консольная прога уже работает на меня. Вы улавливаете суть? Кто на кого работает?

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


Цитата
У меня возникла одна мысль.
Для нормальной обработки система должна работать в режиме "мультизадачности"
В библиотеке atmel usb есть scheduler() который запускает по очереди cdc_task() и usb_task() в цикле.
А я внутри функции cdc_task() запихиваю большой массив данных в USB.
Может проблемы возникают из за того что блокируется usb_task в это время?

Если у Вас есть свободные ножки, навешайте на них LED-ы. Зажигайте ЛЭД, когда входите в сервис (или как Вы пишите -- задачу.) и гасите его, когда выходите. Очень просто и наглядно, а самое главное абсолютно незатратно узнать, кто сколько съедает процессорного времени. Измеряя стрелочным вольтметром напряжение на ноге, можно примерно узнать скважность импульсов (зависимость пропорциональная!). Можете посмотреть осциллографом, еще больше узнаете интересного.

Извините, за советы. Просто мне хотелось это кому-нибудь рассказать smile.gif
Подвернулись Вы smile.gif


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Mty   at90usb1287 - малая скорость передачи по USB   Nov 23 2010, 09:14
- - Xenia   А приём-то у вас работает? А то как-то странно: pr...   Nov 23 2010, 09:28
|- - Mty   Цитата(Xenia @ Nov 23 2010, 12:28) А приё...   Nov 23 2010, 09:43
|- - shrek   Цитата(Mty @ Nov 23 2010, 12:43) Да, рабо...   Nov 23 2010, 18:20
|- - Mty   Цитата(shrek @ Nov 23 2010, 21:20) А вы б...   Nov 24 2010, 08:55
||- - zhevak   Цитата(Mty @ Nov 24 2010, 13:55) Попробов...   Nov 24 2010, 09:19
|- - mempfis_   Цитата(shrek @ Nov 23 2010, 22:20) Сам ст...   Nov 24 2010, 09:23
|- - shrek   Цитата(mempfis_ @ Nov 24 2010, 12:23) Это...   Nov 25 2010, 07:08
- - kovigor   Цитата(Mty @ Nov 23 2010, 13:14) А нужно ...   Nov 23 2010, 09:33
|||- - MrYuran   Цитата(demiurg_spb @ Nov 23 2010, 15:00) ...   Nov 23 2010, 12:09
||- - zhevak   Цитата(Xenia @ Nov 23 2010, 16:57) Есть г...   Nov 23 2010, 12:24
||- - Xenia   Цитата(zhevak @ Nov 23 2010, 15:24) Знает...   Nov 23 2010, 12:45
|- - Mty   Цитата(zhevak @ Nov 23 2010, 13:11) Отдел...   Nov 23 2010, 12:44
- - ARV   а вы не рассматривали такую возможность: в WinAVR ...   Nov 24 2010, 09:51
|- - Mty   Цитата(ARV @ Nov 24 2010, 12:51) а вы не ...   Nov 24 2010, 20:37
- - Xenia   А вы еще "double bank mode" включите (эт...   Nov 25 2010, 00:02
- - Mty   Цитата(Xenia @ Nov 25 2010, 03:02) А вы е...   Nov 25 2010, 08:36
- - mempfis_   Цитата(Mty @ Nov 25 2010, 12:36) А как по...   Nov 25 2010, 08:48
- - Mty   Цитата(mempfis_ @ Nov 25 2010, 11:48) Это...   Nov 25 2010, 10:28
- - shrek   Цитата(mempfis_ @ Nov 25 2010, 11:48) Это...   Nov 25 2010, 13:02
- - mempfis_   Цитата(shrek @ Nov 25 2010, 17:02) С друг...   Nov 25 2010, 13:32
- - shrek   Цитата(mempfis_ @ Nov 25 2010, 16:32) С a...   Nov 25 2010, 13:37
- - mempfis_   Цитата(shrek @ Nov 25 2010, 17:37) Ну воо...   Nov 25 2010, 13:53


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

 


RSS Текстовая версия Сейчас: 20th August 2025 - 17:49
Рейтинг@Mail.ru


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