public Test program for usbhostmsd looking at ridiculous resource usage
Dependencies: test_USBHost mbed
Fork of USBHostMSD_HelloWorld by
ramstats.cpp@9:d86a5e08abcd, 2015-03-19 (annotated)
- 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?
User | Revision | Line number | New 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 | // *********************************************************************** |