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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Скорость USB на AT91SAM7S, У кого какие рекорды?
Edmundo
сообщение May 23 2006, 09:02
Сообщение #1


Мастер
****

Группа: Свой
Сообщений: 730
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 474



Сделал проектик на базе Atmel'овского "AT91SAM7S64-BasicUSB". Там bulk-обмен с размером буфера 64 байта. Гонял обмен туда-сюда следующим образом: большой буфер делил на куски по 64 байта и WriteFile'ом (и соотв. ReadFile) прогонял. На МК ловил/отправлял с помощью AT91F_L1USB_GET_Data и AT91F_L1USB_PUT_Data, которые тоже бьют массив на части:

Код
void AT91F_L1USB_PUT_Data(char* data,unsigned int length)
{
    unsigned int size;

    while(length)
    {
        size = (length<SIZEBUFMAX) ? length : SIZEBUFMAX; // SIZEBUFMAX=64
        AT91F_L0USB_PUT_Data(data, size); //  это фактически pCDC.Write(&pCDC, data, length);
        length -= size;
        data += size;
    }
}


Чего-то скорость не очень большая. Количественных замеров не сделал еще, качественно где-то на уровне сотни килобайт в секунду, мне кажется не больше. Как-то по-быстрее хотелось бы smile.gif

В связи с чем три вопроса:
1) Можно ли как-то ускорить обмен (может, что-то по-другому делать)?
2) Этот пример на USB 1.1, как я понял (bcdUSBL=0x0110), чтобы сделать его 2.0 достаточно просто указать в bcdUSBL 0x0200?
3) Какие скорости у вас получались?


--------------------
شامل
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение May 23 2006, 09:30
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Я тоже плясал от basicUSB, но поскольку задача была гонять большие объемы (единицы мегабайт), я сразу отгрыз на буфер половину ОЗУ.
Читал/писал одним Read/WriteFile с фиксированным размером приема/передачи.
Максимум что получил 4 МБ/с, что меня вполне удовлетворило, и дальнейшего повышения скорости не производил.
Настройки USB не изменял.
Так что возможно это у вас накладные расходы Винды на передаче маленьких фрагментов.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
Edmundo
сообщение May 23 2006, 09:46
Сообщение #3


Мастер
****

Группа: Свой
Сообщений: 730
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 474



Цитата(beer_warrior @ May 23 2006, 13:30) *
Я тоже плясал от basicUSB, но поскольку задача была гонять большие объемы (единицы мегабайт), я сразу отгрыз на буфер половину ОЗУ.
Читал/писал одним Read/WriteFile с фиксированным размером приема/передачи.
Максимум что получил 4 МБ/с, что меня вполне удовлетворило, и дальнейшего повышения скорости не производил.
Настройки USB не изменял.
Так что возможно это у вас накладные расходы Винды на передаче маленьких фрагментов.

А можно поподробнее smile.gif
Как заставить ReadFile/WriteFile обработать весь заданный размер? Ведь они по-моему вываливаются после получения ACK и возвращают фактическое число полученных байт (64 байта по размеру endpoint'а). Что-то в sys-драйвере поменять? Или я не так понимаю суть процесса?
И как на МК получить разом 8К байт -- через AT91F_L1USB_GET_Data или как-то напрямую (чтобы избежать накладных расходов)?


--------------------
شامل
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение May 23 2006, 15:27
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Не буду утверждать стопроцентно, поскольку вглубь не лазил, удовлетворился фактом работы, но
basicUSB уже предсталяет из себя CDC-устройство т.е. в файле main мы уже имеем верхний уровень
отвязаный от режимов передачи, endpoint-ов и прочей USB специфики.
У меня основной цикл выглядел так:
Код
//--------------------------------------------------------------------------
for(;;)
   {
    // Check enumeration
    if (pCDC.IsConfigured(&pCDC))
        {
        ProcessCmd();
        }
   }
}
//--------------------------------------------------------------------------
void ProcessCmd()
{
//AT91F_PIO_ForceOutput(AT91C_BASE_PIOA,~(1<<4));
pCDC.Read(&pCDC,(char*)&ask, sizeof(CMD_S));
Execute(ask.cmd);    
pCDC.Write(&pCDC,(char*)&resp, sizeof(DAT_S));
//AT91F_PIO_ForceOutput(AT91C_BASE_PIOA,(1<<4));
}
//--------------------------------------------------------------------------

где ask и resp соответственно буфера приема и передачи команды типа CMD_S - структуры в которой описан формат буферов.
Execute(ask.cmd) соответсвенно парсер команды.

Другими словами мы работаем так же как с обычным UARTом.

Со стороны хост-машины существуют исходники USBLibrary dll
Поскольку пользуюсь MInGW надо было перепиливать экспорт функций, я поленился и просто копи-пастом перенес в проект.
Суть от этого не изменилась, имеем класс CFCPipeUSB который создает два пайпа на чтение и запись.
Снаружи мы обращаемся к ним как к обычным функциям Read/Write внутри старые добрые Create-Read-Write-CloseFile т.е опять таки все хорошо известное по СОМ-портам
Отличие в том что вместо файла мы открываем пайпы и имеем не предопределенное имя порта а то что нашла энумерация USB.
Со стороны хоста получилось следующее
Код
if (pipe.Open(devname))
    {
    WxMemo->AppendText("Can't open device \n");        
    return 1;
    }
WxMemo->AppendText("Opened... \n");        
//----------------------------------
//there is exchange
//--------------------------------
WxMemo->AppendText("Write \n");        
for(int block = 0; block < 9; block ++)
    {
    if(pipe.WritePipe((char*)&ask, sizeof(CMD_S), &msgWritten))
        {
        WxMemo->AppendText("Write error 1\n");        
        pipe.Close();
        return 1;
        }
    if(sizeof(CMD_S) != msgWritten)
        {
        WxMemo->AppendText("Write error2\n" + s);        
        pipe.Close();
        return 1;
        }
    //s.Printf("%ud-%ld",sizeof(CMD_S),msgWritten);    
    //WxMemo->AppendText(s);
    if (pipe.ReadPipe ((char*)&resp, sizeof(DAT_S)))
        {
        WxMemo->AppendText("Read error\n");        
        pipe.Close();
        return 1;
        }
    }//for pipe
WxMemo->AppendText("Read\n");

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


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
Edmundo
сообщение May 23 2006, 18:52
Сообщение #5


Мастер
****

Группа: Свой
Сообщений: 730
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 474



Thanks! Вы дали мне надежду и почву для исследований smile.gif
Попишу тестовые программки, попробую разогнать (4 Мбайт/с меня бы устроило).


--------------------
شامل
Go to the top of the page
 
+Quote Post
Shuuura
сообщение May 24 2006, 05:05
Сообщение #6


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

Группа: Свой
Сообщений: 80
Регистрация: 23-08-05
Пользователь №: 7 902



Если делать отправку в одну сторону большого объема данных, пользоваться двойной буферизацией то максимальная скорость полученая от sam7s64 1090 кбайт/с (bulk) - практический предел для usb 1.0. Ставить usb 1.1 не рекомендую, т.к. не будет работать на старых ноутбуках, да и разницы по скорости нет.
Go to the top of the page
 
+Quote Post
Shuuura
сообщение May 24 2006, 05:16
Сообщение #7


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

Группа: Свой
Сообщений: 80
Регистрация: 23-08-05
Пользователь №: 7 902



Вдогонку.
Если не пользоваться двойной буферизацией, то скорость падает раза в два. Обязательно надо использовать прерывания.
Go to the top of the page
 
+Quote Post
Harbour
сообщение May 24 2006, 05:49
Сообщение #8


Местами Гуру
*****

Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323



Проясните - девайс реально usb 2.0 high speed режим обмена держит ? А то у них на сайте раньше было написано что только usb 1.1, теперь висит обкоцанное лого "usb certified" (сверху должна быть красная надпись high speed), маркетологи хреновы ....
Go to the top of the page
 
+Quote Post
Shuuura
сообщение May 24 2006, 06:20
Сообщение #9


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

Группа: Свой
Сообщений: 80
Регистрация: 23-08-05
Пользователь №: 7 902



Цитата(Harbour @ May 24 2006, 09:49) *
Проясните - девайс реально usb 2.0 high speed режим обмена держит ? А то у них на сайте раньше было написано что только usb 1.1, теперь висит обкоцанное лого "usb certified" (сверху должна быть красная надпись high speed), маркетологи хреновы ....

Для sam7s возможно ТОЛЬКО full speed (12 Мбит/с). но 12 Мбит/с это вместе со служебной информацией. Реально больше 1 мегабайта не получится. USB 2.0 и USB 1.1 в данном случае происки маркетологов в погоне за более красивой цифрой. Как и говорил ставьте 1.0 и все будет OK. biggrin.gif
Go to the top of the page
 
+Quote Post
KolyanV
сообщение May 24 2006, 12:12
Сообщение #10


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

Группа: Свой
Сообщений: 91
Регистрация: 1-06-05
Пользователь №: 5 621



Цитата(Edmundo @ May 23 2006, 21:52) *
Thanks! Вы дали мне надежду и почву для исследований smile.gif
Попишу тестовые программки, попробую разогнать (4 Мбайт/с меня бы устроило).

Это, наверно, опечатка, - 4 Мбит/сек, всего 500 кб/сек ...
Go to the top of the page
 
+Quote Post
Harbour
сообщение May 24 2006, 16:11
Сообщение #11


Местами Гуру
*****

Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323



То-то и оно или если короче то отож ...
Go to the top of the page
 
+Quote Post
Edmundo
сообщение May 24 2006, 18:45
Сообщение #12


Мастер
****

Группа: Свой
Сообщений: 730
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 474



То, что реально только 1.1 -- это полнейшая засада. На сайте-то пишут "features ... a USB 2.0 device". Негодяи...


--------------------
شامل
Go to the top of the page
 
+Quote Post
Stanislav
сообщение May 24 2006, 21:24
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987



Цитата(Edmundo @ May 24 2006, 22:45) *
То, что реально только 1.1 -- это полнейшая засада. На сайте-то пишут "features ... a USB 2.0 device". Негодяи...
Вообще-то USB 2.0 интерфейс может работать как в High-Speed, так и Full-Speed режимах. А USB 2.0 устройство вовсе не обязано поддерживать High-Speed, на это в стандарте прямо указано.


--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
Go to the top of the page
 
+Quote Post
Harbour
сообщение May 25 2006, 01:36
Сообщение #14


Местами Гуру
*****

Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323



Вы ошиблись - usb2.0 обязано поддерживать предыдущий режим, т.е. full-speed, но чтобы получить статус usb2.0 certified, данный девайс должон уметь работать в high-speed. Здесь мы имеем просто некрасивую политику фирмы атмел - заложив год назад в чип только usb1.1 они сами себе отрезали гугошары, теперь надо как-то впихнуть народу эту ботву. С другой стороны шоб реально потянуть поток usb2.0 (480Mbit) тут надоть чип по человечески делать, т.е. даже если б у них контроллер тянул high-speed, особого толку от этого в данном кристалле нет. Тем не менее слухи проистекающие от атмеля говорят о том что будет нам счастье, со временем ...
Go to the top of the page
 
+Quote Post
misyachniy
сообщение May 25 2006, 06:33
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



usb2.0 certified - определяет как раз соответствие спецификациям стандарта для разных скоростей.
LOW/FULL/HIGH.
Для каждой скорости есть свои требования по токам потребления, полного сопротивления, точности поддержания частоты передачи и д.р.
Устройство с поддержкой любой скорости может получить сертификат.
В стандарте 2.0 добавлены "протокольные" изменения.
Например окончание передачи пакетом кратным длине Endpoint в 1.1 не предусмотрено, нeужно передавать пакет нулевой длины.
В 2.0 можно при передаче последнего паета "приклеить" информацию о том что данных больше нет, и хост обратится к другому устройству на шине.
Также можно при приеме пакета отвечать не ACK а "буферы заполнены".
При этом хост может производить обмен с другими устройствами.
В 1.1 Host передает данные до получения NACK и пакет(времяпотраченное на передачу) теряется.
Есть также дополнительные запросы которые могут завести устройства 1.1 в ступор или выдать ответ
который Host не поймет.

То есть на цифру смотреть не нужно, LOW/FULL/HIGH - вот что главное.
Go to the top of the page
 
+Quote Post

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

 


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


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