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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> STM32F2xx USB FS CDC, Достижение максимальной пропускной способности
jcxz
сообщение May 2 2013, 02:39
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Если CDC - не обязательное условие, то создавайте одну изохронную точку 1023байт и получите гарантированные 999кБ/сек.
Без всяких танцев с бубном....
+ можно ещё чуток дожать на параллельных control-пакетах wink.gif
Go to the top of the page
 
+Quote Post
BaN
сообщение May 2 2013, 04:24
Сообщение #17


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

Группа: Участник
Сообщений: 144
Регистрация: 28-08-07
Пользователь №: 30 111



Цитата(jcxz @ May 2 2013, 09:39) *
Если CDC - не обязательное условие, то создавайте одну изохронную точку 1023байт и получите гарантированные 999кБ/сек.
Без всяких танцев с бубном....
+ можно ещё чуток дожать на параллельных control-пакетах wink.gif

По ТЗ нужно именно CDC, т.к. требуется совместимость со старой версией устройства с RS-232.
Go to the top of the page
 
+Quote Post
BaN
сообщение May 2 2013, 13:35
Сообщение #18


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

Группа: Участник
Сообщений: 144
Регистрация: 28-08-07
Пользователь №: 30 111



Опять у меня проблемы с обменом. Нужно передавать непрерывный поток данных 750кБ/с.
При отправке данных в цикле:
Код
while (1)
{
    if ( (USB_OTG_dev.dev.device_status == USB_OTG_CONFIGURED) && (USB_Tx_State == 0 ))
    {
      USB_Tx_State = 1;
      DCD_EP_Tx (&USB_OTG_dev, CDC_IN_EP, (uint8_t*)&APP_Rx_Buffer[0], APP_RX_DATA_SIZE);
    }
}

Достигается скорость 950кБ/с.
Сделал проверочную отправку непрерывного потока данных 750кБ/с:
CODE
#define APP_RX_DATA_SIZE (7*4096)
...
uint8_t APP_Rx_Buffer [APP_RX_DATA_SIZE];
uint8_t APP_Rx_Buffer_2 [APP_RX_DATA_SIZE];
...
SysTick_Config(SystemCoreClock /48000);
while (1)
{
if (new_data_ready == 1)
{
static uint32_t cnt = 0;
uint8_t *buf_ptr;

new_data_ready = 0;
if (USB_Tx_Buf_State == 0)
{
buf_ptr = APP_Rx_Buffer;
}
else
{
buf_ptr = APP_Rx_Buffer_2;
}

if(APP_Rx_ptr_in == APP_RX_DATA_SIZE)
{
if (APP_Rx_ptr_in_OVERFLOW <= (APP_RX_DATA_SIZE-8))
{
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'O';
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'V';
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'E';
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'R';
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'F';
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'L';
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'O';
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'W';
}
}
else
{
// Записываем 16 байт данных с частотой 48кГц
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[3];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[2];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[1];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[0];
cnt++;
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[3];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[2];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[1];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[0];
cnt++;
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[3];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[2];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[1];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[0];
cnt++;
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[3];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[2];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[1];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[0];
cnt++;
}
}
if ( (USB_OTG_dev.dev.device_status == USB_OTG_CONFIGURED) && (USB_Tx_State == 0 ) && (APP_Rx_ptr_in > (4096-1)))
{
uint8_t *buf_ptr;
uint8_t *fill_ptr;
uint32_t buf_leftovers;
uint32_t len;

if (USB_Tx_Buf_State == 0)
{
buf_ptr = APP_Rx_Buffer;
fill_ptr = APP_Rx_Buffer_2;
USB_Tx_Buf_State = 1;
}
else
{
buf_ptr = APP_Rx_Buffer_2;
fill_ptr = APP_Rx_Buffer;
USB_Tx_Buf_State = 0;
}
len = APP_Rx_ptr_in;
APP_Rx_ptr_in = 0;
APP_Rx_ptr_in_OVERFLOW = 0;
// Копируем данные из бефера, которые не кратны 4096
// т.к. приемный буфер драйвера VCP от ST размером 4096
buf_leftovers = len & 0x00000FFF;
len -= buf_leftovers;
while (APP_Rx_ptr_in < buf_leftovers)
{
fill_ptr[APP_Rx_ptr_in] = buf_ptr[(len+APP_Rx_ptr_in)];
APP_Rx_ptr_in++;
}

USB_Tx_State = 1;
DCD_EP_Tx (&USB_OTG_dev, CDC_IN_EP, buf_ptr, len);
}
}
...
void SysTick_Handler(void)
{
new_data_ready = 1;
}

При проверке подключаю устройство напрямую к корневому хабу, все остальные устройства отключаю от шины USB. Настраиваю USBlyzer на логгирование всех устройств на шине (моего устройства, всех хабов, всех хостов).
И в итоге всё нормально передается, но почему-то возникает нечастая (может подряд через несколько сотен мс, может через несколько десятков секунд) непериодическая задержка между передачами разной длительностью в среднем 40мс, но до 100мс, из-за которой у меня забиваются буферы и данные теряются. При этом, судя по логу, никакого трафика на шине в этот момент не идет.
Что это вообще может быть?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 3 2013, 05:04
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Среда? Фоновые процессы? Например C# так может мусор собирать, фреймворк виндовый теперь тоже что-то подобное может творить... УСБ передает когда у него хост данные запросит, так что если ваш компьютер что-то делает и тупит, передача и стоит...
Go to the top of the page
 
+Quote Post
BaN
сообщение May 3 2013, 07:52
Сообщение #20


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

Группа: Участник
Сообщений: 144
Регистрация: 28-08-07
Пользователь №: 30 111



Цитата(Golikov A. @ May 3 2013, 12:04) *
Среда? Фоновые процессы? Например C# так может мусор собирать, фреймворк виндовый теперь тоже что-то подобное может творить... УСБ передает когда у него хост данные запросит, так что если ваш компьютер что-то делает и тупит, передача и стоит...

Windows 7 Professional SP1 32-bit.
ОЗУ 2Гб, процессор Core2Duo 2ГГц, проверял на ноутбуке Toshiba Satellite A200-1IW.
Сейчас поубивал все лишние процессы.
Код
Имя образа                     PID Имя сессии          № сеанса       Память
========================= ======== ================ =========== ============
System Idle Process              0 Services                   0        24 КБ
System                           4 Services                   0       236 КБ
smss.exe                       352 Services                   0       540 КБ
csrss.exe                      620 Services                   0     1 644 КБ
wininit.exe                    816 Services                   0       952 КБ
csrss.exe                      824 Console                    1    10 048 КБ
winlogon.exe                   880 Console                    1     2 744 КБ
services.exe                   908 Services                   0     5 660 КБ
lsass.exe                      940 Services                   0     5 852 КБ
lsm.exe                        948 Services                   0     2 716 КБ
svchost.exe                   1060 Services                   0     4 660 КБ
svchost.exe                   1136 Services                   0     4 260 КБ
Ati2evxx.exe                  1184 Services                   0     1 848 КБ
svchost.exe                   1268 Services                   0     9 248 КБ
svchost.exe                   1312 Services                   0    31 032 КБ
svchost.exe                   1336 Services                   0    15 392 КБ
svchost.exe                   1476 Services                   0     3 264 КБ
svchost.exe                   1548 Services                   0     6 180 КБ
Ati2evxx.exe                  1644 Console                    1     3 732 КБ
spoolsv.exe                   1760 Services                   0     5 296 КБ
svchost.exe                   1792 Services                   0     4 052 КБ
explorer.exe                   632 Console                    1    54 272 КБ
taskhost.exe                  1152 Console                    1     4 572 КБ
acrotray.exe                  2248 Console                    1     1 212 КБ
issch.exe                     2256 Console                    1     1 404 КБ
TPwrMain.exe                  2272 Console                    1     2 764 КБ
TCrdMain.exe                  2644 Console                    1     5 736 КБ
TosCoSrv.exe                  2760 Services                   0     1 144 КБ
KeNotify.exe                  2960 Console                    1     1 392 КБ
CeEKey.exe                    2972 Console                    1     1 536 КБ
nncron.exe                    3076 Console                    1       604 КБ
nnguard.exe                   3304 Console                    1       180 КБ
svchost.exe                   3648 Services                   0     1 536 КБ
RtHDVCpl.exe                  4044 Console                    1     2 660 КБ
lock.exe                      3352 Console                    1     3 164 КБ
cmd.exe                       5240 Console                    1     1 556 КБ
conhost.exe                   5072 Console                    1     2 132 КБ
HxD.exe                       3544 Console                    1    10 696 КБ
notepad++.exe                 5832 Console                    1    31 932 КБ
USBLyzer.exe                  2348 Console                    1   290 392 КБ
serial.exe                    1236 Console                    1     2 888 КБ
conhost.exe                   3512 Console                    1     3 888 КБ
audiodg.exe                   6120 Services                   0    15 064 КБ
TrustedInstaller.exe          4980 Services                   0     5 960 КБ
tasklist.exe                   444 Console                    1     4 588 КБ
WmiPrvSE.exe                  4412 Services                   0     5 192 КБ

Эта задержка стала появляться намного реже, но не исчезла.
Например, записал файл 770МБ, задержка была только 2 раза на 157-ом МБ, на 635 МБ.
Теперь в USBlyzer'е почему-то время в колонке Time стало обновляться раз в 15-16мс.
UPD:
Записал еще один файлик на 1,67Гб, задержки возникали 7 раз по адресам:
04AE7000
15348000
22593000
3C2F9000
4DD17000
62F16000
675F6000
Попробую на другом компьютере проверить.

Сообщение отредактировал BaN - May 3 2013, 08:46
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 3 2013, 09:56
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(BaN @ May 2 2013, 19:35) *
Опять у меня проблемы с обменом. Нужно передавать непрерывный поток данных 750кБ/с.
Если у вас требование по ТЗ - передача потока с фиксированной скоростью и при этом использование bulk - это явное противоречие. bulk - не предназначен для передач с гарантированной скоростью.
bulk - это фоновая передача с низшим приоритетом.
Для гарантированной полосы вам нужна изохронная передача и только она.
Правьте ТЗ.

Если так уж нужно чтоб ваше устройство выглядело на стороне PC как COM-порт, создайте виртуальный COM сторонними драйверами и передавайте потоки (RX/TX) через две изохронные точки. sm.gif
Go to the top of the page
 
+Quote Post
BaN
сообщение May 3 2013, 10:03
Сообщение #22


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

Группа: Участник
Сообщений: 144
Регистрация: 28-08-07
Пользователь №: 30 111



Цитата(jcxz @ May 3 2013, 16:56) *
Если у вас требование по ТЗ - передача потока с фиксированной скоростью и при этом использование bulk - это явное противоречие. bulk - не предназначен для передач с гарантированной скоростью.
bulk - это фоновая передача с низшим приоритетом.
Для гарантированной полосы вам нужна изохронная передача и только она.
Правьте ТЗ.

Если так уж нужно чтоб ваше устройство выглядело на стороне PC как COM-порт, создайте виртуальный COM сторонними драйверами и передавайте потоки (RX/TX) через две изохронные точки. sm.gif

Попробую пока сделать тестовую передачу через изохронную точку и посмотреть, будет ли возникать эта же задержка.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 3 2013, 15:02
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Да с чего бы она возникала??? Это-бы противоречило стандарту USB.
Задержка в изохронной - это эквивалентно потере кадров.
У меня девайс с изохронной точкой ~870байт работает часами без проблем - потерь кадров ==0.
Go to the top of the page
 
+Quote Post
BaN
сообщение May 3 2013, 15:19
Сообщение #24


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

Группа: Участник
Сообщений: 144
Регистрация: 28-08-07
Пользователь №: 30 111



Цитата(jcxz @ May 3 2013, 22:02) *
Да с чего бы она возникала??? Это-бы противоречило стандарту USB.
Задержка в изохронной - это эквивалентно потере кадров.
У меня девайс с изохронной точкой ~870байт работает часами без проблем - потерь кадров ==0.

А с чего эта задержка возникает у меня в случае с bulk-передачами, если на шине никакого обмена нет и, согласно спецификации USB, вся шина должна была бы отдаваться bulk-передачам?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 3 2013, 15:53
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(BaN @ May 3 2013, 19:19) *
А с чего эта задержка возникает у меня в случае с bulk-передачами, если на шине никакого обмена нет и, согласно спецификации USB, вся шина должна была бы отдаваться bulk-передачам?

Шина не занята, занята система. А так как у шины нет неотложных дел типа изохронных передач, то её обслуживание вполне может попасть под нож.
Go to the top of the page
 
+Quote Post
BaN
сообщение May 3 2013, 18:07
Сообщение #26


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

Группа: Участник
Сообщений: 144
Регистрация: 28-08-07
Пользователь №: 30 111



Цитата(aaarrr @ May 3 2013, 22:53) *
Шина не занята, занята система. А так как у шины нет неотложных дел типа изохронных передач, то её обслуживание вполне может попасть под нож.

Да, вполне вероятное предположение. Здесь даже тест проводили на эту тему:
http://www.microchip.com/forums/m291283-p2.aspx
Цитата
As far as I remember I made tests about iso speed vs. cpu load, and iso speed was always correct.
Bulk speed on the contrary was apparently affected.

Но нигде конкретно не описаны приритеты ОС в таких случаях.
Пока попробую с изохронной передачей.
Go to the top of the page
 
+Quote Post
BaN
сообщение May 4 2013, 03:17
Сообщение #27


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

Группа: Участник
Сообщений: 144
Регистрация: 28-08-07
Пользователь №: 30 111



Еще нашел баг в библиотеке, из-за которого у меня постоянно происходили прерывания с частотой 500кГц:
https://my.st.com/public/STe2ecommunities/m...rrentviews=1112

Сообщение отредактировал BaN - May 4 2013, 03:30
Go to the top of the page
 
+Quote Post
ander0
сообщение Nov 19 2014, 23:51
Сообщение #28





Группа: Новичок
Сообщений: 2
Регистрация: 9-03-14
Пользователь №: 80 863



BaN, можете выложить исходники своего последнего варианта?) Какая частота кварца у вашего устройства?
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 - 16:59
Рейтинг@Mail.ru


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