A PicoTCP demo app testing the ethernet throughput on the lpc1768 mbed board.
Dependencies: PicoTCP lpc1768-picotcp-eth mbed-rtos mbed picotcp-demo-printf
This is a demo application, using the PicoTCP socket API, to show the performance of a TCP sender towards an endpoint connected via Ethernet.
This application runs on the NXP LPC1768 mbed board.
This demo should give you following output on the mbed lpc1768's serial port:
>>> Welcome 2 PicoTCP <<< ip=192.168.100.1 - will connect to 192.168.100.2:4404 in 5 seconds... PicoTCP Benchmark starting... Opening socket... tb> Connection established with server. tb> TCPSIZ written tb> Called shutdown() tb> Transmitted 10485760 bytes in 6704 milliseconds tb> average write throughput 12512 kbit/sec tb> Socket closed. Exit normally.
On the receiving side (e.g. linux computer) you could receive the packets sent by PicoTCP with netcat - e.g.:
ifconfig eth0 192.168.100.2 nc -l -p 4404 > /dev/null
Revision 0:b3aca3c27ab6, committed 2013-05-17
- Comitter:
- tass
- Date:
- Fri May 17 12:51:54 2013 +0000
- Child:
- 1:83d13ed71a38
- Commit message:
- Initial commit of PicoTCP demo app testing the ethernet throughput on the lpc1768 mbed board.
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Fri May 17 12:51:54 2013 +0000
@@ -0,0 +1,199 @@
+/******************************************************************************
+PicoTCP. Copyright (c) 2012-2013 TASS Belgium NV. Some rights reserved.
+See LICENSE and COPYING for usage. https://github.com/tass-belgium/picotcp
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License Version 2
+as published by the Free Software Foundation;
+
+Authors: Maxime Vincent
+
+Purpose: This is a PicoTCP demo. It will try to connect a TCP socket at
+ from 192.168.100.1 port 6666 to 192.168.100.2 port 4404
+ and then send "TCPSIZ" a-characters there.
+ When that succeeded, it prints the throughput on the serial output.
+
+Libraries needed to get this up and running:
+ PicoTCP,
+ lpc1768-picotcp-demo-eth,
+ picotcp-demo-printf,
+ mbed-rtos,
+ mbed
+
+******************************************************************************/
+
+#include "mbed.h"
+
+extern "C" {
+// PicoTCP includes
+#include "pico_dev_mbed_emac.h"
+#include "pico_stack.h"
+#include "pico_ipv4.h"
+#include "pico_socket.h"
+// CMSIS OS includes
+#include "cmsis_os.h"
+// other includes
+#include "serial_api.h"
+#include <stdio.h>
+#include "printf.h"
+}
+
+// Send 10 MBs
+#define TCPSIZ (10 * 1024 * 1024)
+
+serial_t _serial;
+
+DigitalOut myled1(LED1); /* Tick */
+
+void app_tcpbench(void);
+
+void _putc(void *p, char ch)
+{
+ serial_putc(&_serial, ch);
+}
+
+int main() {
+ struct pico_device *my_dev;
+ struct pico_ip4 myaddr, mynetmask;
+
+ // init serial output
+ serial_init(&_serial, p9, p10);
+ init_printf(NULL,_putc);
+ mprintf(">>> Welcome 2 PicoTCP <<<\r\n");
+
+ // init PicoTCP stack
+ pico_stack_init();
+
+ pico_string_to_ipv4("192.168.100.1", &myaddr.addr);
+ pico_string_to_ipv4("255.255.255.0", &mynetmask.addr);
+ my_dev = pico_emac_create("MBED-EMAC");
+
+ pico_ipv4_link_add(my_dev, myaddr, mynetmask);
+
+ mprintf("ip=192.168.100.1 - will connect to 192.168.100.2:4404 in 5 seconds...\r\n");
+ osDelay(5000);
+ mprintf("PicoTCP Benchmark starting...\r\n");
+ app_tcpbench();
+
+ // This is the IDLE task
+ while(1) {
+ static uint8_t led_tick;
+ pico_stack_tick();
+ //wait_ms(1); // wait a millisec...
+
+ led_tick++;
+ if (!(led_tick%200))
+ {
+ myled1 = !myled1;
+ led_tick = 0;
+ }
+ }
+}
+
+/*** START TCP BENCH ***/
+
+#define TCP_BENCH_TX 1
+#define TCP_BENCH_RX 2
+
+uint8_t buffer0[2000] __attribute__((section("AHBSRAM0"))); // To save some RAM
+
+int tcpbench_mode = TCP_BENCH_TX;
+struct pico_socket *tcpbench_sock = NULL;
+static unsigned long tcpbench_time_start,tcpbench_time_end;
+
+void cb_tcpbench(uint16_t ev, struct pico_socket *s)
+{
+ static int closed = 0;
+ static unsigned long count = 0;
+
+ static long tcpbench_wr_size = 0;
+ long tcpbench_w = 0;
+ double tcpbench_time = 0;
+ unsigned int time_ms;
+
+ count++;
+
+ if (ev & PICO_SOCK_EV_RD) {
+ }
+
+ if (ev & PICO_SOCK_EV_CONN) {
+ if (tcpbench_mode == TCP_BENCH_TX)
+ mprintf("tb> Connection established with server.\r\n");
+ }
+
+ if (ev & PICO_SOCK_EV_FIN) {
+ mprintf("tb> Socket closed. Exit normally. \r\n");
+ }
+
+ if (ev & PICO_SOCK_EV_ERR) {
+ mprintf("tb> Socket Error received: %s. Bailing out.\r\n", strerror(pico_err));
+ }
+
+ if (ev & PICO_SOCK_EV_CLOSE) {
+ mprintf("tb> event close\r\n");
+ pico_socket_close(s);
+ return;
+ }
+
+ if (ev & PICO_SOCK_EV_WR) {
+
+ if (tcpbench_wr_size < TCPSIZ && tcpbench_mode == TCP_BENCH_TX) {
+ do {
+ tcpbench_w = pico_socket_write(tcpbench_sock, buffer0, TCPSIZ-tcpbench_wr_size);
+ if (tcpbench_w > 0) {
+ tcpbench_wr_size += tcpbench_w;
+ //mprintf("Written : %d \n",tcpbench_wr_size);
+ //mprintf("tb> SOCKET WRITTEN - %d\r\n",tcpbench_w);
+ }
+ if (tcpbench_w < 0) {
+ mprintf("tb> Socket Error received: %s. Bailing out.\r\n", strerror(pico_err));
+ exit(5);
+ }
+ if (tcpbench_time_start == 0)
+ tcpbench_time_start = PICO_TIME_MS();
+ } while(tcpbench_w > 0);
+ //mprintf("tcpbench_wr_size = %d \r\n", tcpbench_wr_size);
+ } else {
+ if (!closed && tcpbench_mode == TCP_BENCH_TX) {
+ tcpbench_time_end = PICO_TIME_MS();
+ pico_socket_shutdown(s, PICO_SHUT_WR);
+ mprintf("tb> TCPSIZ written\r\n");
+ mprintf("tb> Called shutdown()\r\n");
+ tcpbench_time = (tcpbench_time_end - tcpbench_time_start)/1000.0; /* get number of seconds */
+ time_ms = (unsigned int)(tcpbench_time * 1000);
+ mprintf("tb> Transmitted %u bytes in %u milliseconds\r\n",TCPSIZ, time_ms);
+ mprintf("tb> average write throughput %u kbit/sec\r\n",( (TCPSIZ/time_ms) * 8) );
+ closed = 1;
+ }
+ }
+ }
+}
+
+void app_tcpbench(void)
+{
+ struct pico_socket *s;
+ uint16_t port_be = short_be(4404);
+ uint16_t local_port;
+ struct pico_ip4 server_addr;
+ struct pico_ip4 local_addr;
+ memset(buffer0,'a',2000);
+ tcpbench_mode = TCP_BENCH_TX;
+
+ mprintf("Opening socket...\r\n");
+ s = pico_socket_open(PICO_PROTO_IPV4, PICO_PROTO_TCP, &cb_tcpbench);
+ if (!s)
+ {
+ mprintf("Socket was not opened...\r\n");
+ exit(1);
+ }
+
+ local_port = short_be(6666);
+ pico_string_to_ipv4("192.168.100.1", &local_addr.addr);
+ pico_string_to_ipv4("192.168.100.2", &server_addr.addr);
+ pico_socket_bind(s, &local_addr, &local_port);
+
+ tcpbench_sock = s;
+ pico_socket_connect(s, &server_addr, port_be);
+
+ return;
+}
TASS Belgium

