public Test program for usbhostmsd looking at ridiculous resource usage

Dependencies:   test_USBHost mbed

Fork of USBHostMSD_HelloWorld by Samuel Mokrani

Committer:
sbts
Date:
Thu Mar 19 02:11:22 2015 +0000
Revision:
9:d86a5e08abcd
public Test program for usbhostmsd looking at ridiculous resource usage

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sbts 9:d86a5e08abcd 1 #include "ramstats.h"
sbts 9:d86a5e08abcd 2 #include "mbed.h"
sbts 9:d86a5e08abcd 3 #include <stdarg.h>
sbts 9:d86a5e08abcd 4
sbts 9:d86a5e08abcd 5 //extern USBSerial DebugComms;
sbts 9:d86a5e08abcd 6
sbts 9:d86a5e08abcd 7 //_sys_clock();
sbts 9:d86a5e08abcd 8
sbts 9:d86a5e08abcd 9 /*int myfprintf(FILE *stream, const char *format, const char *arg1) {
sbts 9:d86a5e08abcd 10 int done;
sbts 9:d86a5e08abcd 11 const char *arg;
sbts 9:d86a5e08abcd 12 concat(art1
sbts 9:d86a5e08abcd 13 done=fprintf(stream,format,arg);
sbts 9:d86a5e08abcd 14 return done;
sbts 9:d86a5e08abcd 15 }*/
sbts 9:d86a5e08abcd 16 int myfprintf(FILE *stream, const char *format, ...) {
sbts 9:d86a5e08abcd 17 va_list arg;
sbts 9:d86a5e08abcd 18 int done;
sbts 9:d86a5e08abcd 19 va_start (arg, format);
sbts 9:d86a5e08abcd 20 done=vfprintf(stream,format,arg);
sbts 9:d86a5e08abcd 21 va_end (arg);
sbts 9:d86a5e08abcd 22 fprintf(stream,"\r");
sbts 9:d86a5e08abcd 23 fflush(stream);
sbts 9:d86a5e08abcd 24 return done;
sbts 9:d86a5e08abcd 25 }
sbts 9:d86a5e08abcd 26 // Displays the size of static allocations for each RAM bank as indicated by
sbts 9:d86a5e08abcd 27 // ARM linker to stdout.
sbts 9:d86a5e08abcd 28 //static void DisplayRAMBanks(void)
sbts 9:d86a5e08abcd 29 void DisplayRAMBanks(char * header)
sbts 9:d86a5e08abcd 30 {
sbts 9:d86a5e08abcd 31 //void __heapstats(int (*dprint)( void*param, char const *format,...), void* param);
sbts 9:d86a5e08abcd 32 printf("\e[2J\e[1;33;44m %s",header); // clear the screen before starting
sbts 9:d86a5e08abcd 33 printf("\r\n==== Heap Stats ====\r\n");
sbts 9:d86a5e08abcd 34 __heapstats((__heapprt)myfprintf,stdout);
sbts 9:d86a5e08abcd 35 printf("\r\n==== Heap Valid ====\r\n");
sbts 9:d86a5e08abcd 36 __heapvalid((__heapprt)myfprintf,stdout, 1);
sbts 9:d86a5e08abcd 37 printf("\r\n==== Current Stack Pointer ====");
sbts 9:d86a5e08abcd 38 printf("==== %10x ====\r\n\n",__current_sp());
sbts 9:d86a5e08abcd 39
sbts 9:d86a5e08abcd 40 printf("Static RAM bank allocations\r\n");
sbts 9:d86a5e08abcd 41 printf(" Main RAM = %5u %04x\r\n", (unsigned int)&Image$$RW_IRAM1$$ZI$$Limit - (unsigned int)&Image$$RW_IRAM1$$Base, (unsigned int)&Image$$RW_IRAM1$$ZI$$Limit - (unsigned int)&Image$$RW_IRAM1$$Base);
sbts 9:d86a5e08abcd 42 printf(" RAM0 = %5u %04x\r\n", (unsigned int)&Image$$RW_IRAM2$$ZI$$Limit - (unsigned int)&Image$$RW_IRAM2$$Base, (unsigned int)&Image$$RW_IRAM2$$ZI$$Limit - (unsigned int)&Image$$RW_IRAM2$$Base);
sbts 9:d86a5e08abcd 43 printf(" RAM1 = %5u %04x\r\n", (unsigned int)&Image$$RW_IRAM3$$ZI$$Limit - (unsigned int)&Image$$RW_IRAM3$$Base, (unsigned int)&Image$$RW_IRAM3$$ZI$$Limit - (unsigned int)&Image$$RW_IRAM3$$Base);
sbts 9:d86a5e08abcd 44 // printf("\r\n\nPress 'M' to resume");
sbts 9:d86a5e08abcd 45 printf("\r\n\n");
sbts 9:d86a5e08abcd 46
sbts 9:d86a5e08abcd 47 }
sbts 9:d86a5e08abcd 48
sbts 9:d86a5e08abcd 49
sbts 9:d86a5e08abcd 50 /*
sbts 9:d86a5e08abcd 51 To move a global from main RAM to the RAM0/RAM1 bank, you can declare it something like:
sbts 9:d86a5e08abcd 52 __attribute((section("AHBSRAM0"),aligned)) char LargeBuffer[1024];
sbts 9:d86a5e08abcd 53 __attribute((section("AHBSRAM1"),aligned)) char LargeBuffer[1024];
sbts 9:d86a5e08abcd 54 char bufA[10000] __attribute__((section("AHBSRAM1")));
sbts 9:d86a5e08abcd 55
sbts 9:d86a5e08abcd 56 */
sbts 9:d86a5e08abcd 57
sbts 9:d86a5e08abcd 58
sbts 9:d86a5e08abcd 59 // ***********************************************************************
sbts 9:d86a5e08abcd 60 // ***********************************************************************
sbts 9:d86a5e08abcd 61 // ***********************************************************************
sbts 9:d86a5e08abcd 62 // Examples of Alternative methods to capture and process this info....
sbts 9:d86a5e08abcd 63 // ***********************************************************************
sbts 9:d86a5e08abcd 64 // ***********************************************************************
sbts 9:d86a5e08abcd 65 // ***********************************************************************
sbts 9:d86a5e08abcd 66 // the first two are from http://developer.mbed.org/forum/mbed/topic/2702/
sbts 9:d86a5e08abcd 67 /*
sbts 9:d86a5e08abcd 68 #include <mbed.h>
sbts 9:d86a5e08abcd 69 #include <stdarg.h>
sbts 9:d86a5e08abcd 70
sbts 9:d86a5e08abcd 71 int CaptureLine(void* pBuffer, char const* pFormatString, ...)
sbts 9:d86a5e08abcd 72 {
sbts 9:d86a5e08abcd 73 char* pStringEnd = (char*)pBuffer + strlen((char*)pBuffer);
sbts 9:d86a5e08abcd 74 va_list valist;
sbts 9:d86a5e08abcd 75
sbts 9:d86a5e08abcd 76 va_start(valist, pFormatString);
sbts 9:d86a5e08abcd 77
sbts 9:d86a5e08abcd 78 return vsprintf(pStringEnd, pFormatString, valist);
sbts 9:d86a5e08abcd 79 }
sbts 9:d86a5e08abcd 80
sbts 9:d86a5e08abcd 81 int main()
sbts 9:d86a5e08abcd 82 {
sbts 9:d86a5e08abcd 83 char OutputBuffer[256];
sbts 9:d86a5e08abcd 84
sbts 9:d86a5e08abcd 85 printf("\r\nBefore malloc.\r\n");
sbts 9:d86a5e08abcd 86 OutputBuffer[0] = '\0';
sbts 9:d86a5e08abcd 87 __heapstats(CaptureLine, OutputBuffer);
sbts 9:d86a5e08abcd 88 printf("%s", OutputBuffer);
sbts 9:d86a5e08abcd 89
sbts 9:d86a5e08abcd 90 void* pvTest = malloc(1024);
sbts 9:d86a5e08abcd 91
sbts 9:d86a5e08abcd 92 printf("After malloc.\r\n");
sbts 9:d86a5e08abcd 93 OutputBuffer[0] = '\0';
sbts 9:d86a5e08abcd 94 __heapstats(CaptureLine, OutputBuffer);
sbts 9:d86a5e08abcd 95 printf("%s", OutputBuffer);
sbts 9:d86a5e08abcd 96
sbts 9:d86a5e08abcd 97 free(pvTest);
sbts 9:d86a5e08abcd 98
sbts 9:d86a5e08abcd 99 printf("After free.\r\n");
sbts 9:d86a5e08abcd 100 OutputBuffer[0] = '\0';
sbts 9:d86a5e08abcd 101 __heapstats(CaptureLine, OutputBuffer);
sbts 9:d86a5e08abcd 102 printf("%s", OutputBuffer);
sbts 9:d86a5e08abcd 103
sbts 9:d86a5e08abcd 104 return 0;
sbts 9:d86a5e08abcd 105 }
sbts 9:d86a5e08abcd 106 */
sbts 9:d86a5e08abcd 107
sbts 9:d86a5e08abcd 108 // ***********************************************************************
sbts 9:d86a5e08abcd 109 // ***********************************************************************
sbts 9:d86a5e08abcd 110 /*
sbts 9:d86a5e08abcd 111 #include <mbed.h>
sbts 9:d86a5e08abcd 112 #include <stdarg.h>
sbts 9:d86a5e08abcd 113
sbts 9:d86a5e08abcd 114 struct SHeapInfo
sbts 9:d86a5e08abcd 115 {
sbts 9:d86a5e08abcd 116 const char* HighestAllocBlock;
sbts 9:d86a5e08abcd 117 const char* HighestFreeBlock;
sbts 9:d86a5e08abcd 118 };
sbts 9:d86a5e08abcd 119
sbts 9:d86a5e08abcd 120 int CaptureLine(void* pvHeapInfo, char const* pFormatString, ...)
sbts 9:d86a5e08abcd 121 {
sbts 9:d86a5e08abcd 122 static const char* pAllocFormatString = "alloc block %p size %3lx";
sbts 9:d86a5e08abcd 123 static const char* pFreeFormatString = "free block %p size %3lx next=%p";
sbts 9:d86a5e08abcd 124 static const char* pCompleteFormatString = "------- heap validation complete";
sbts 9:d86a5e08abcd 125 SHeapInfo* pHeapInfo = (SHeapInfo*)pvHeapInfo;
sbts 9:d86a5e08abcd 126 va_list valist;
sbts 9:d86a5e08abcd 127
sbts 9:d86a5e08abcd 128 va_start(valist, pFormatString);
sbts 9:d86a5e08abcd 129
sbts 9:d86a5e08abcd 130 if (pFormatString == strstr(pFormatString, pAllocFormatString))
sbts 9:d86a5e08abcd 131 {
sbts 9:d86a5e08abcd 132 const char* pBlock = va_arg(valist, const char*);
sbts 9:d86a5e08abcd 133 unsigned long BlockSize = va_arg(valist, unsigned long);
sbts 9:d86a5e08abcd 134 const char* pBlockLastByte = pBlock + BlockSize - 1;
sbts 9:d86a5e08abcd 135
sbts 9:d86a5e08abcd 136 if (pBlockLastByte > pHeapInfo->HighestAllocBlock)
sbts 9:d86a5e08abcd 137 {
sbts 9:d86a5e08abcd 138 pHeapInfo->HighestAllocBlock = pBlockLastByte;
sbts 9:d86a5e08abcd 139 }
sbts 9:d86a5e08abcd 140 }
sbts 9:d86a5e08abcd 141 else if (pFormatString == strstr(pFormatString, pFreeFormatString))
sbts 9:d86a5e08abcd 142 {
sbts 9:d86a5e08abcd 143 const char* pBlock = va_arg(valist, const char*);
sbts 9:d86a5e08abcd 144 unsigned long BlockSize = va_arg(valist, unsigned long);
sbts 9:d86a5e08abcd 145 const char* pBlockLastByte = pBlock + BlockSize - 1;
sbts 9:d86a5e08abcd 146
sbts 9:d86a5e08abcd 147 if (pBlockLastByte > pHeapInfo->HighestFreeBlock)
sbts 9:d86a5e08abcd 148 {
sbts 9:d86a5e08abcd 149 pHeapInfo->HighestFreeBlock = pBlockLastByte;
sbts 9:d86a5e08abcd 150 }
sbts 9:d86a5e08abcd 151 }
sbts 9:d86a5e08abcd 152 else if (pFormatString == strstr(pFormatString, pCompleteFormatString))
sbts 9:d86a5e08abcd 153 {
sbts 9:d86a5e08abcd 154 // Ignoring end of dump string.
sbts 9:d86a5e08abcd 155 }
sbts 9:d86a5e08abcd 156 else
sbts 9:d86a5e08abcd 157 {
sbts 9:d86a5e08abcd 158 // Unrecognized format string.
sbts 9:d86a5e08abcd 159 printf("Unrecognized format of %s", pFormatString);
sbts 9:d86a5e08abcd 160 }
sbts 9:d86a5e08abcd 161
sbts 9:d86a5e08abcd 162 return 1;
sbts 9:d86a5e08abcd 163 }
sbts 9:d86a5e08abcd 164
sbts 9:d86a5e08abcd 165 void DisplayAndClearHeapInfo(SHeapInfo* pHeapInfo)
sbts 9:d86a5e08abcd 166 {
sbts 9:d86a5e08abcd 167 printf("Highest allocated block address: %p\r\n", pHeapInfo->HighestAllocBlock);
sbts 9:d86a5e08abcd 168 printf("Highest free block address: %p\r\n", pHeapInfo->HighestFreeBlock);
sbts 9:d86a5e08abcd 169
sbts 9:d86a5e08abcd 170 memset(pHeapInfo, 0, sizeof(*pHeapInfo));
sbts 9:d86a5e08abcd 171 }
sbts 9:d86a5e08abcd 172
sbts 9:d86a5e08abcd 173 int main()
sbts 9:d86a5e08abcd 174 {
sbts 9:d86a5e08abcd 175 SHeapInfo HeapInfo = { 0, 0 };
sbts 9:d86a5e08abcd 176
sbts 9:d86a5e08abcd 177 printf("\r\nBefore malloc.\r\n");
sbts 9:d86a5e08abcd 178 __heapvalid(CaptureLine, &HeapInfo, 1);
sbts 9:d86a5e08abcd 179 DisplayAndClearHeapInfo(&HeapInfo);
sbts 9:d86a5e08abcd 180
sbts 9:d86a5e08abcd 181 void* pvTest = malloc(1024);
sbts 9:d86a5e08abcd 182
sbts 9:d86a5e08abcd 183 printf("After malloc.\r\n");
sbts 9:d86a5e08abcd 184 __heapvalid(CaptureLine, &HeapInfo, 1);
sbts 9:d86a5e08abcd 185 DisplayAndClearHeapInfo(&HeapInfo);
sbts 9:d86a5e08abcd 186
sbts 9:d86a5e08abcd 187 free(pvTest);
sbts 9:d86a5e08abcd 188
sbts 9:d86a5e08abcd 189 printf("After free.\r\n");
sbts 9:d86a5e08abcd 190 __heapvalid(CaptureLine, &HeapInfo, 1);
sbts 9:d86a5e08abcd 191 DisplayAndClearHeapInfo(&HeapInfo);
sbts 9:d86a5e08abcd 192
sbts 9:d86a5e08abcd 193 return 0;
sbts 9:d86a5e08abcd 194 }
sbts 9:d86a5e08abcd 195 */
sbts 9:d86a5e08abcd 196
sbts 9:d86a5e08abcd 197 // ***********************************************************************
sbts 9:d86a5e08abcd 198 // ***********************************************************************