使用基于ChibiOS/RT的实时系统已经有一段时间的,一直都好奇在STM32F1及STM32F4平台上USB接口的最大传输速率能达到多少。
- 测试相关的代码
-device端使用的测试的代码参考的是ChibiOS/RT v16.1.x:testhal/STM32/STM32F7xx/USB_RAW,End Point会配置成bulk类型:
/**
* @brief IN EP1 state.
*/
static USBInEndpointState ep1instate;
/**
* @brief EP1 initialization structure (IN only)
*/
static const USBEndpointConfig ep1config = {
USB_EP_MODE_TYPE_BULK,
NULL,
NULL,
NULL,
0x0040,
0x0000,
&ep1instate,
NULL,
1,
NULL
};
/**
* @brief OUT EP2 state.
*/
static USBOutEndpointState ep2outstate;
/**
* @brief EP2 initialization structure (OUT only).
*/
static const USBEndpointConfig ep2config = {
USB_EP_MODE_TYPE_BULK,
NULL,
NULL,
NULL,
0x0000,
0x0040,
NULL,
&ep2outstate,
1,
NULL
};
同时会创建两个线程分别处理数据的接收与发送:
/*
* USB writer. This thread writes data to the USB at maximum rate.
* Can be measured using:
* dd if=/dev/xxxx of=/dev/null bs=512 count=10000
*/
static THD_WORKING_AREA(waWriter, 128);
static THD_FUNCTION(Writer, arg) {
(void)arg;
chRegSetThreadName("writer");
while (true) {
msg_t msg = usbTransmit(&USBD1, USBD1_STLINK_TX_EP,
txbuf, sizeof (txbuf) - 1);
if (msg == MSG_RESET)
chThdSleepMilliseconds(500);
}
}
/*
* USB reader. This thread reads data from the USB at maximum rate.
* Can be measured using:
* dd if=bigfile of=/dev/xxx bs=512 count=10000
*/
static THD_WORKING_AREA(waReader, 128);
static THD_FUNCTION(Reader, arg) {
(void)arg;
chRegSetThreadName("reader");
while (true) {
msg_t msg = usbReceive(&USBD1, USBD1_STLINK_RX_EP,
rxbuf, sizeof (rxbuf));
if (msg == MSG_RESET)
chThdSleepMilliseconds(500);
}
}
// ...
/*
* Application entry point.
*/
int __attribute__((noreturn)) main(void) {
// ...
chThdCreateStatic(waWriter, sizeof(waWriter), HIGHPRIO, Writer, NULL);
chThdCreateStatic(waReader, sizeof(waReader), HIGHPRIO, Reader, NULL);
// ...
}
-host端的代码如下:
void handle_stlink_command(struct usb_ctx *ctx, const uint8_t *data, int32_t len)
{
int result;
struct timeval tv;
int64_t start = 0, end = 0;
int idx, count = 2048;
uint8_t txbuf[1024], rxbuf[1024];
// Write operation benchmark
result = gettimeofday(&tv, NULL);
if (result == 0) {
start = seconds_to_microseconds(tv.tv_sec) + tv.tv_usec;
}
memset(txbuf, 0x00, sizeof(txbuf));
for (idx = 0; idx < count; idx++) {
W(ctx, txbuf, sizeof(txbuf));
}
result = gettimeofday(&tv, NULL);
if (result == 0) {
end = seconds_to_microseconds(tv.tv_sec) + tv.tv_usec;
}
printf("WRITE: Total transfer time: %11lldus, size=%lu, speed=%8.3fbyte/second\n", end - start, sizeof(txbuf) * count,
(double)(sizeof(txbuf) * count) / (end - start) * seconds_to_microseconds(1));
// Read operation benchmark
result = gettimeofday(&tv, NULL);
if (result == 0) {
start = seconds_to_microseconds(tv.tv_sec) + tv.tv_usec;
}
for (idx = 0; idx < count; idx++) {
R(ctx, rxbuf, sizeof(rxbuf));
}
result = gettimeofday(&tv, NULL);
if (result == 0) {
end = seconds_to_microseconds(tv.tv_sec) + tv.tv_usec;
}
printf(" READ: Total transfer time: %11lldus, size=%lu, speed=%8.3fbyte/second\n", end - start, sizeof(rxbuf) * count,
(double)(sizeof(rxbuf) * count) / (end - start) * seconds_to_microseconds(1));
}
可以看到,这里分别测试写入与读取2MiB所需的时间。
- 相关的代码可以从这里下载:2016_11_26_chibios_v16.1.x_usb_benchmark.tar.gz
- 在BRO-DBG-LINK – V2.1的传输速率
BRO-DBG-LINK – V2.1所使用的MCU为STM32F103CBT6,ARM Cortex M3核心,最大时钟频率为72MHz。
1. 系统的整体性能:
ch> test *** ChibiOS/RT Test Suite *** *** Compiled: Nov 26 2016 - 18:38:32 *** Platform: STM32F10x Performance Line Medium Density *** Test Board: BRO-DBG-LINK - V2.1 ... ---------------------------------------------------------------------------- --- Test Case 12.1 (Messages performance #1) --- Score : 264660 msgs/S, 529320 ctxswc/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.2 (Messages performance #2) --- Score : 206101 msgs/S, 412202 ctxswc/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.3 (Messages performance #3) --- Score : 206101 msgs/S, 412202 ctxswc/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.4 (Context Switch performance) --- Score : 847568 ctxswc/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.5 (Threads performance, full cycle) --- Score : 147596 threads/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.6 (Threads performance, create/exit only) --- Score : 192312 threads/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.7 (Mass reschedule performance) --- Score : 66410 reschedules/S, 398460 ctxswc/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.8 (Round-Robin voluntary reschedule) --- Score : 504200 ctxswc/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.9 (Virtual Timers set/reset performance) --- Score : 590990 timers/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.10 (Semaphores wait/signal performance) --- Score : 1035976 wait+signal/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.11 (Mutexes lock/unlock performance) --- Score : 568112 lock+unlock/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.12 (RAM Footprint) --- System: 116 bytes --- Thread: 68 bytes --- Timer : 20 bytes --- Semaph: 12 bytes --- Mutex : 16 bytes --- CondV.: 8 bytes --- EventS: 4 bytes --- EventL: 20 bytes --- MailB.: 40 bytes --- Result: SUCCESS ---------------------------------------------------------------------------- Final result: SUCCESS
2. USB接口的传输速率:
$ ./bro-dbg-link
Device properties:
bus number: 20
port path: 1 (from root hub)
speed: 12 Mbit/s (USB FullSpeed)
Reading device descriptor:
length: 18
device class: 0
S/N: 3
VID:PID: 0483:3748
bcdDevice: 0100
iMan:iProd:iSer: 1:2:3
nb confs: 1
Reading string descriptors:
String (0x01): "brobwind.com"
String (0x02): "BRO-DBG-LINK - V2.1"
String (0x03): "066AFF495650897167153325"
WRITE: Total transfer time: 4088864us, size=2097152, speed=512893.557byte/second
READ: Total transfer time: 3146494us, size=2097152, speed=666504.370byte/second
...
WRITE: Total transfer time: 4092033us, size=2097152, speed=512496.356byte/second
READ: Total transfer time: 3148294us, size=2097152, speed=666123.304byte/second
...
WRITE: Total transfer time: 4082853us, size=2097152, speed=513648.667byte/second
READ: Total transfer time: 3107639us, size=2097152, speed=674837.714byte/second
可以看到写入的速率约为500KiB/second,而读取的速度可以达到650KiB/second。
- 在STM32F4-discovery上的传输速率
STM32F4-discovery所使用的MCU为STM32F407VGT6,ARM Cortex M4核心,包含硬件浮点运算单元(FPU),最大时钟频率为168MHz。
1. 系统的整体性能:
ch> test *** ChibiOS/RT Test Suite *** *** Compiled: Nov 26 2016 - 18:23:45 *** Platform: STM32F407 High Performance with DSP and FPU *** Test Board: STMicroelectronics STM32F4-Discovery ... ---------------------------------------------------------------------------- --- Test Case 12.1 (Messages performance #1) --- Score : 749995 msgs/S, 1499990 ctxswc/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.2 (Messages performance #2) --- Score : 599998 msgs/S, 1199996 ctxswc/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.3 (Messages performance #3) --- Score : 599998 msgs/S, 1199996 ctxswc/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.4 (Context Switch performance) --- Score : 2434776 ctxswc/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.5 (Threads performance, full cycle) --- Score : 428568 threads/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.6 (Threads performance, create/exit only) --- Score : 552630 threads/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.7 (Mass reschedule performance) --- Score : 197183 reschedules/S, 1183098 ctxswc/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.8 (Round-Robin voluntary reschedule) --- Score : 1588640 ctxswc/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.9 (Virtual Timers set/reset performance) --- Score : 1287926 timers/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.10 (Semaphores wait/signal performance) --- Score : 3652164 wait+signal/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.11 (Mutexes lock/unlock performance) --- Score : 1976464 lock+unlock/S --- Result: SUCCESS ---------------------------------------------------------------------------- --- Test Case 12.12 (RAM Footprint) --- System: 120 bytes --- Thread: 68 bytes --- Timer : 20 bytes --- Semaph: 12 bytes --- Mutex : 16 bytes --- CondV.: 8 bytes --- EventS: 4 bytes --- EventL: 20 bytes --- MailB.: 40 bytes --- Result: SUCCESS ---------------------------------------------------------------------------- Final result: SUCCESS
2. USB接口的传输速率:
$ ./bro-dbg-link
Device properties:
bus number: 20
port path: 1 (from root hub)
speed: 12 Mbit/s (USB FullSpeed)
Reading device descriptor:
length: 18
device class: 0
S/N: 3
VID:PID: 0483:3748
bcdDevice: 0100
iMan:iProd:iSer: 1:2:3
nb confs: 1
Reading string descriptors:
String (0x01): "brobwind.com"
String (0x02): "BRO-DBG-LINK - V2.1"
String (0x03): "FFFFFFFFFFFFFFFFFFFFFFFF"
WRITE: Total transfer time: 2263160us, size=2097152, speed=926647.696byte/second
READ: Total transfer time: 3101735us, size=2097152, speed=676122.235byte/second
...
WRITE: Total transfer time: 2267679us, size=2097152, speed=924801.085byte/second
READ: Total transfer time: 3097070us, size=2097152, speed=677140.652byte/second
...
WRITE: Total transfer time: 2258652us, size=2097152, speed=928497.174byte/second
READ: Total transfer time: 3099147us, size=2097152, speed=676686.843byte/second
可以看到,在写入方面要比BRO-DBG-LINK – V2.1要好很多。
- 相关的参考文档
- http://chibios.org/dokuwiki/doku.php
- http://www.st.com/en/microcontrollers/stm32f103cb.html
- http://www.st.com/en/microcontrollers/stm32f407vg.html