TASS Belgium / Mbed 2 deprecated Pico_MEM_Test

Dependencies:   PicoTCP lpc1768-picotcp-eth mbed-rtos mbed

Committer:
tass
Date:
Tue Jul 09 07:59:55 2013 +0000
Revision:
2:59703c8ca07e
Parent:
1:f014c48d0517
Child:
3:8892f28e2e58
Added field for current free memory.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tass 0:ebcbe44e53dd 1 #include <mbed.h>
tass 0:ebcbe44e53dd 2 #include <stdarg.h>
tass 0:ebcbe44e53dd 3 #include "EthernetInterface.h"
tass 0:ebcbe44e53dd 4
tass 0:ebcbe44e53dd 5 #define ECHO_SERVER_PORT 7
tass 0:ebcbe44e53dd 6 #define BUFFER_QUANTITY (1024*1024)
tass 0:ebcbe44e53dd 7
tass 0:ebcbe44e53dd 8 struct MemoryUsage
tass 0:ebcbe44e53dd 9 {
tass 2:59703c8ca07e 10 uint32_t curFreeRam;
tass 0:ebcbe44e53dd 11 uint32_t minFreeRam;
tass 0:ebcbe44e53dd 12 uint32_t maxFreeRam;
tass 0:ebcbe44e53dd 13 uint32_t avgFreeRam;
tass 0:ebcbe44e53dd 14 uint32_t stackPointer;
tass 0:ebcbe44e53dd 15 uint32_t cntSamples;
tass 0:ebcbe44e53dd 16 };
tass 0:ebcbe44e53dd 17
tass 2:59703c8ca07e 18 struct MemoryUsage memoryStats = {0,0xFFFFFFFF,0,0,0};
tass 0:ebcbe44e53dd 19
tass 0:ebcbe44e53dd 20 int fakePrintf(void* pvHeapInfo, char const* pFormatString, ...)
tass 0:ebcbe44e53dd 21 {
tass 0:ebcbe44e53dd 22 struct MemoryUsage * memStat = (struct MemoryUsage *)pvHeapInfo;
tass 0:ebcbe44e53dd 23 static const char* freeRamFormat = "%d bytes in";
tass 0:ebcbe44e53dd 24 va_list valist;
tass 0:ebcbe44e53dd 25
tass 0:ebcbe44e53dd 26 if(memcmp(pFormatString,freeRamFormat,strlen(freeRamFormat)) == 0)
tass 0:ebcbe44e53dd 27 {
tass 0:ebcbe44e53dd 28 va_start(valist, pFormatString);
tass 0:ebcbe44e53dd 29 unsigned long freeSize = va_arg(valist, unsigned long);
tass 2:59703c8ca07e 30 memStat->curFreeRam = freeSize;
tass 0:ebcbe44e53dd 31 if(memStat->minFreeRam > freeSize)
tass 0:ebcbe44e53dd 32 memStat->minFreeRam = freeSize;
tass 0:ebcbe44e53dd 33
tass 0:ebcbe44e53dd 34 if(memStat->maxFreeRam < freeSize)
tass 0:ebcbe44e53dd 35 memStat->maxFreeRam = freeSize;
tass 0:ebcbe44e53dd 36
tass 0:ebcbe44e53dd 37 memStat->avgFreeRam = ((memStat->avgFreeRam * memStat->cntSamples) + freeSize)/(++memStat->cntSamples);
tass 0:ebcbe44e53dd 38 }
tass 0:ebcbe44e53dd 39 else
tass 0:ebcbe44e53dd 40 {
tass 0:ebcbe44e53dd 41 // ignore format
tass 0:ebcbe44e53dd 42 }
tass 0:ebcbe44e53dd 43 return 0;
tass 0:ebcbe44e53dd 44 }
tass 0:ebcbe44e53dd 45
tass 1:f014c48d0517 46 void inline printMemoryStats(void)
tass 1:f014c48d0517 47 {
tass 1:f014c48d0517 48 if(memoryStats.cntSamples == 1)
tass 1:f014c48d0517 49 printf("\n\n***** Initial Memory Report *****\n");
tass 1:f014c48d0517 50 else
tass 1:f014c48d0517 51 printf("\n\n********* Memory Report *********\n");
tass 1:f014c48d0517 52
tass 2:59703c8ca07e 53 printf("Current free memory : %d bytes\n",memoryStats.curFreeRam);
tass 1:f014c48d0517 54 printf("Maximum free memory : %d bytes\n",memoryStats.maxFreeRam);
tass 1:f014c48d0517 55 printf("Minimum free memory : %d bytes\n",memoryStats.minFreeRam);
tass 2:59703c8ca07e 56 printf("Average free memory : %d bytes\n",memoryStats.avgFreeRam);
tass 1:f014c48d0517 57 printf("Stack pointer address : %d\n",memoryStats.stackPointer);
tass 1:f014c48d0517 58 printf("****************************\n");
tass 1:f014c48d0517 59 }
tass 1:f014c48d0517 60
tass 0:ebcbe44e53dd 61 void inline memoryStamp(void)
tass 0:ebcbe44e53dd 62 {
tass 0:ebcbe44e53dd 63 __heapstats((__heapprt)fakePrintf, &memoryStats);
tass 0:ebcbe44e53dd 64 }
tass 0:ebcbe44e53dd 65
tass 0:ebcbe44e53dd 66 void inline stackPtrSnapshot(void)
tass 0:ebcbe44e53dd 67 {
tass 0:ebcbe44e53dd 68 memoryStats.stackPointer = __current_sp();
tass 0:ebcbe44e53dd 69 }
tass 0:ebcbe44e53dd 70
tass 0:ebcbe44e53dd 71 int main() {
tass 0:ebcbe44e53dd 72
tass 0:ebcbe44e53dd 73 printf("Ethernet Interface memory test....\n");
tass 1:f014c48d0517 74
tass 1:f014c48d0517 75 // Initial memory status
tass 1:f014c48d0517 76 memoryStamp();
tass 0:ebcbe44e53dd 77 stackPtrSnapshot(); // snapshot of the stack pointer before starting benchmark to see the SP.
tass 1:f014c48d0517 78 printMemoryStats();
tass 1:f014c48d0517 79
tass 0:ebcbe44e53dd 80 EthernetInterface eth;
tass 0:ebcbe44e53dd 81 int connections = 0;
tass 0:ebcbe44e53dd 82 eth.init(); //Use DHCP
tass 0:ebcbe44e53dd 83 eth.connect();
tass 0:ebcbe44e53dd 84 printf("IP Address %s\n", eth.getIPAddress());
tass 0:ebcbe44e53dd 85
tass 0:ebcbe44e53dd 86 TCPSocketServer server;
tass 0:ebcbe44e53dd 87 server.bind(ECHO_SERVER_PORT);
tass 0:ebcbe44e53dd 88 server.listen();
tass 0:ebcbe44e53dd 89
tass 0:ebcbe44e53dd 90 while (true) {
tass 0:ebcbe44e53dd 91 printf("\nWait for new connection...\n");
tass 0:ebcbe44e53dd 92 printf("Client number %d\n",++connections);
tass 0:ebcbe44e53dd 93 TCPSocketConnection client;
tass 0:ebcbe44e53dd 94 server.accept(client);
tass 0:ebcbe44e53dd 95 client.set_blocking(false, 1500); // Timeout after (1.5)s
tass 0:ebcbe44e53dd 96 printf("Connection from: %s\n", client.get_address());
tass 0:ebcbe44e53dd 97 char buffer[1024];
tass 0:ebcbe44e53dd 98 while (true) {
tass 0:ebcbe44e53dd 99
tass 0:ebcbe44e53dd 100 int dataReceived = 0;
tass 0:ebcbe44e53dd 101 int dataSent = 0;
tass 0:ebcbe44e53dd 102
tass 0:ebcbe44e53dd 103 printf("\n\n\nStarting the receiving part...\n");
tass 0:ebcbe44e53dd 104 while(dataReceived < BUFFER_QUANTITY)
tass 0:ebcbe44e53dd 105 {
tass 0:ebcbe44e53dd 106 int n = client.receive(buffer, sizeof(buffer));
tass 0:ebcbe44e53dd 107 if (n <= 0) {
tass 0:ebcbe44e53dd 108 printf("Receive error\n");
tass 0:ebcbe44e53dd 109 break;
tass 0:ebcbe44e53dd 110 }
tass 0:ebcbe44e53dd 111 dataReceived += n;
tass 0:ebcbe44e53dd 112 memoryStamp();
tass 0:ebcbe44e53dd 113 }
tass 0:ebcbe44e53dd 114
tass 0:ebcbe44e53dd 115
tass 0:ebcbe44e53dd 116 printf("Received : %d bytes\nExpected : %d bytes\n",dataReceived,BUFFER_QUANTITY);
tass 0:ebcbe44e53dd 117 if(dataReceived < BUFFER_QUANTITY)
tass 0:ebcbe44e53dd 118 {
tass 0:ebcbe44e53dd 119 printf("Receiving part of the test has failed. Exiting connection.\n");
tass 0:ebcbe44e53dd 120 break;
tass 0:ebcbe44e53dd 121 }
tass 0:ebcbe44e53dd 122 else{
tass 0:ebcbe44e53dd 123 printf("Receiving has passed...\n");
tass 0:ebcbe44e53dd 124 }
tass 0:ebcbe44e53dd 125
tass 0:ebcbe44e53dd 126 printf("\n\n\nStarting the sending part...\n");
tass 0:ebcbe44e53dd 127 while(dataSent < BUFFER_QUANTITY)
tass 0:ebcbe44e53dd 128 {
tass 0:ebcbe44e53dd 129 int n = client.send_all(buffer, sizeof(buffer));
tass 0:ebcbe44e53dd 130 if (n <= 0) {
tass 0:ebcbe44e53dd 131 printf("Send error\n");
tass 0:ebcbe44e53dd 132 break;
tass 0:ebcbe44e53dd 133 }
tass 0:ebcbe44e53dd 134 dataSent += n;
tass 0:ebcbe44e53dd 135 memoryStamp();
tass 0:ebcbe44e53dd 136 }
tass 0:ebcbe44e53dd 137
tass 0:ebcbe44e53dd 138 printf("Sent : %d bytes\nExpected : %d bytes\n",dataSent,BUFFER_QUANTITY);
tass 0:ebcbe44e53dd 139 if(dataSent < BUFFER_QUANTITY)
tass 0:ebcbe44e53dd 140 {
tass 0:ebcbe44e53dd 141 printf("Sending part of the test has failed. Exiting connection.\n");
tass 0:ebcbe44e53dd 142 break;
tass 0:ebcbe44e53dd 143 }
tass 0:ebcbe44e53dd 144 else
tass 0:ebcbe44e53dd 145 {
tass 0:ebcbe44e53dd 146 printf("Sending test has passed...\n");
tass 0:ebcbe44e53dd 147 }
tass 0:ebcbe44e53dd 148
tass 0:ebcbe44e53dd 149
tass 0:ebcbe44e53dd 150 printf("\n\n\nStarting echo part...\n");
tass 0:ebcbe44e53dd 151 dataReceived = dataSent = 0;
tass 0:ebcbe44e53dd 152 while((dataReceived+dataSent) < 2*BUFFER_QUANTITY)
tass 0:ebcbe44e53dd 153 {
tass 0:ebcbe44e53dd 154 int n = client.receive(buffer, sizeof(buffer));
tass 0:ebcbe44e53dd 155 if (n <= 0) {
tass 0:ebcbe44e53dd 156 printf("Receive error\n");
tass 0:ebcbe44e53dd 157 break;
tass 0:ebcbe44e53dd 158 }
tass 0:ebcbe44e53dd 159 dataReceived += n;
tass 0:ebcbe44e53dd 160
tass 0:ebcbe44e53dd 161 n = client.send_all(buffer, n);
tass 0:ebcbe44e53dd 162 if (n <= 0) {
tass 0:ebcbe44e53dd 163 printf("Send error\n");
tass 0:ebcbe44e53dd 164 break;
tass 0:ebcbe44e53dd 165 }
tass 0:ebcbe44e53dd 166 dataSent += n;
tass 0:ebcbe44e53dd 167 memoryStamp();
tass 0:ebcbe44e53dd 168 }
tass 0:ebcbe44e53dd 169
tass 0:ebcbe44e53dd 170 printf("Echo size : %d bytes\nExpected : %d bytes\n",(dataReceived+dataSent),2*BUFFER_QUANTITY);
tass 0:ebcbe44e53dd 171 if((dataReceived+dataSent) < 2*BUFFER_QUANTITY)
tass 0:ebcbe44e53dd 172 {
tass 0:ebcbe44e53dd 173 printf("Echo test has failed.Exiting connection...\n");
tass 0:ebcbe44e53dd 174 break;
tass 0:ebcbe44e53dd 175 }
tass 0:ebcbe44e53dd 176 else
tass 0:ebcbe44e53dd 177 {
tass 0:ebcbe44e53dd 178 printf("Echo test has passed...\n");
tass 0:ebcbe44e53dd 179 }
tass 0:ebcbe44e53dd 180 }
tass 0:ebcbe44e53dd 181 client.close();
tass 1:f014c48d0517 182 printf("Test was finished...\n");
tass 1:f014c48d0517 183 printMemoryStats();
tass 0:ebcbe44e53dd 184 }
tass 0:ebcbe44e53dd 185
tass 0:ebcbe44e53dd 186 return 0;
tass 0:ebcbe44e53dd 187 }