mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
188:bcfe06ba3d64
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anna Bridge 186:707f6e361f3e 1 #include "mbed_assert.h"
<> 152:9a67f0b066fc 2 #include "mbed_stats.h"
Anna Bridge 186:707f6e361f3e 3 #include "mbed_power_mgmt.h"
AnnaBridge 187:0387e8f68319 4 #include "mbed_version.h"
<> 152:9a67f0b066fc 5 #include <string.h>
AnnaBridge 167:e84263d55307 6 #include <stdlib.h>
Anna Bridge 186:707f6e361f3e 7
Anna Bridge 186:707f6e361f3e 8 #include "device.h"
Anna Bridge 186:707f6e361f3e 9 #ifdef MBED_CONF_RTOS_PRESENT
Anna Bridge 186:707f6e361f3e 10 #include "cmsis_os2.h"
Anna Bridge 186:707f6e361f3e 11 #include "rtos_idle.h"
Anna Bridge 186:707f6e361f3e 12 #elif defined(MBED_STACK_STATS_ENABLED) || defined(MBED_THREAD_STATS_ENABLED) || defined(MBED_CPU_STATS_ENABLED)
Anna Bridge 186:707f6e361f3e 13 #warning Statistics are currently not supported without the rtos.
Anna Bridge 186:707f6e361f3e 14 #endif
<> 152:9a67f0b066fc 15
AnnaBridge 189:f392fc9709a3 16 #if defined(MBED_CPU_STATS_ENABLED) && (!DEVICE_LPTICKER || !DEVICE_SLEEP)
Anna Bridge 186:707f6e361f3e 17 #warning CPU statistics are not supported without low power timer support.
<> 152:9a67f0b066fc 18 #endif
<> 152:9a67f0b066fc 19
Anna Bridge 186:707f6e361f3e 20 void mbed_stats_cpu_get(mbed_stats_cpu_t *stats)
Anna Bridge 186:707f6e361f3e 21 {
Anna Bridge 186:707f6e361f3e 22 MBED_ASSERT(stats != NULL);
Anna Bridge 186:707f6e361f3e 23 memset(stats, 0, sizeof(mbed_stats_cpu_t));
AnnaBridge 189:f392fc9709a3 24 #if defined(MBED_CPU_STATS_ENABLED) && DEVICE_LPTICKER && DEVICE_SLEEP
Anna Bridge 186:707f6e361f3e 25 stats->uptime = mbed_uptime();
Anna Bridge 186:707f6e361f3e 26 stats->idle_time = mbed_time_idle();
Anna Bridge 186:707f6e361f3e 27 stats->sleep_time = mbed_time_sleep();
Anna Bridge 186:707f6e361f3e 28 stats->deep_sleep_time = mbed_time_deepsleep();
Anna Bridge 186:707f6e361f3e 29 #endif
Anna Bridge 186:707f6e361f3e 30 }
Anna Bridge 186:707f6e361f3e 31
<> 152:9a67f0b066fc 32 // note: mbed_stats_heap_get defined in mbed_alloc_wrappers.cpp
<> 152:9a67f0b066fc 33 void mbed_stats_stack_get(mbed_stats_stack_t *stats)
<> 152:9a67f0b066fc 34 {
Anna Bridge 186:707f6e361f3e 35 MBED_ASSERT(stats != NULL);
<> 152:9a67f0b066fc 36 memset(stats, 0, sizeof(mbed_stats_stack_t));
<> 152:9a67f0b066fc 37
Anna Bridge 186:707f6e361f3e 38 #if defined(MBED_STACK_STATS_ENABLED) && defined(MBED_CONF_RTOS_PRESENT)
AnnaBridge 167:e84263d55307 39 uint32_t thread_n = osThreadGetCount();
AnnaBridge 167:e84263d55307 40 unsigned i;
AnnaBridge 167:e84263d55307 41 osThreadId_t *threads;
<> 152:9a67f0b066fc 42
AnnaBridge 167:e84263d55307 43 threads = malloc(sizeof(osThreadId_t) * thread_n);
AnnaBridge 188:bcfe06ba3d64 44 // Don't fail on lack of memory
AnnaBridge 188:bcfe06ba3d64 45 if (!threads) {
AnnaBridge 188:bcfe06ba3d64 46 return;
AnnaBridge 188:bcfe06ba3d64 47 }
AnnaBridge 167:e84263d55307 48
AnnaBridge 167:e84263d55307 49 osKernelLock();
AnnaBridge 167:e84263d55307 50 thread_n = osThreadEnumerate(threads, thread_n);
<> 152:9a67f0b066fc 51
Anna Bridge 186:707f6e361f3e 52 for (i = 0; i < thread_n; i++) {
AnnaBridge 167:e84263d55307 53 uint32_t stack_size = osThreadGetStackSize(threads[i]);
AnnaBridge 167:e84263d55307 54 stats->max_size += stack_size - osThreadGetStackSpace(threads[i]);
AnnaBridge 167:e84263d55307 55 stats->reserved_size += stack_size;
AnnaBridge 167:e84263d55307 56 stats->stack_cnt++;
AnnaBridge 167:e84263d55307 57 }
AnnaBridge 167:e84263d55307 58 osKernelUnlock();
<> 152:9a67f0b066fc 59
AnnaBridge 167:e84263d55307 60 free(threads);
<> 152:9a67f0b066fc 61 #endif
<> 152:9a67f0b066fc 62 }
<> 152:9a67f0b066fc 63
<> 152:9a67f0b066fc 64 size_t mbed_stats_stack_get_each(mbed_stats_stack_t *stats, size_t count)
<> 152:9a67f0b066fc 65 {
Anna Bridge 186:707f6e361f3e 66 MBED_ASSERT(stats != NULL);
Anna Bridge 186:707f6e361f3e 67 memset(stats, 0, count * sizeof(mbed_stats_stack_t));
Anna Bridge 186:707f6e361f3e 68
<> 152:9a67f0b066fc 69 size_t i = 0;
<> 152:9a67f0b066fc 70
Anna Bridge 186:707f6e361f3e 71 #if defined(MBED_STACK_STATS_ENABLED) && defined(MBED_CONF_RTOS_PRESENT)
AnnaBridge 167:e84263d55307 72 osThreadId_t *threads;
<> 152:9a67f0b066fc 73
AnnaBridge 167:e84263d55307 74 threads = malloc(sizeof(osThreadId_t) * count);
AnnaBridge 188:bcfe06ba3d64 75 // Don't fail on lack of memory
AnnaBridge 188:bcfe06ba3d64 76 if (!threads) {
AnnaBridge 188:bcfe06ba3d64 77 return 0;
AnnaBridge 188:bcfe06ba3d64 78 }
AnnaBridge 167:e84263d55307 79
AnnaBridge 167:e84263d55307 80 osKernelLock();
AnnaBridge 167:e84263d55307 81 count = osThreadEnumerate(threads, count);
<> 152:9a67f0b066fc 82
Anna Bridge 186:707f6e361f3e 83 for (i = 0; i < count; i++) {
AnnaBridge 167:e84263d55307 84 uint32_t stack_size = osThreadGetStackSize(threads[i]);
AnnaBridge 167:e84263d55307 85 stats[i].max_size = stack_size - osThreadGetStackSpace(threads[i]);
AnnaBridge 167:e84263d55307 86 stats[i].reserved_size = stack_size;
AnnaBridge 167:e84263d55307 87 stats[i].thread_id = (uint32_t)threads[i];
AnnaBridge 167:e84263d55307 88 stats[i].stack_cnt = 1;
AnnaBridge 167:e84263d55307 89 }
AnnaBridge 167:e84263d55307 90 osKernelUnlock();
<> 152:9a67f0b066fc 91
AnnaBridge 167:e84263d55307 92 free(threads);
<> 152:9a67f0b066fc 93 #endif
<> 152:9a67f0b066fc 94
<> 152:9a67f0b066fc 95 return i;
<> 152:9a67f0b066fc 96 }
<> 152:9a67f0b066fc 97
Anna Bridge 186:707f6e361f3e 98 size_t mbed_stats_thread_get_each(mbed_stats_thread_t *stats, size_t count)
Anna Bridge 186:707f6e361f3e 99 {
Anna Bridge 186:707f6e361f3e 100 MBED_ASSERT(stats != NULL);
Anna Bridge 186:707f6e361f3e 101 memset(stats, 0, count * sizeof(mbed_stats_thread_t));
Anna Bridge 186:707f6e361f3e 102 size_t i = 0;
Anna Bridge 186:707f6e361f3e 103
Anna Bridge 186:707f6e361f3e 104 #if defined(MBED_THREAD_STATS_ENABLED) && defined(MBED_CONF_RTOS_PRESENT)
Anna Bridge 186:707f6e361f3e 105 osThreadId_t *threads;
Anna Bridge 186:707f6e361f3e 106
Anna Bridge 186:707f6e361f3e 107 threads = malloc(sizeof(osThreadId_t) * count);
Anna Bridge 186:707f6e361f3e 108 MBED_ASSERT(threads != NULL);
Anna Bridge 186:707f6e361f3e 109
Anna Bridge 186:707f6e361f3e 110 osKernelLock();
Anna Bridge 186:707f6e361f3e 111 count = osThreadEnumerate(threads, count);
Anna Bridge 186:707f6e361f3e 112
Anna Bridge 186:707f6e361f3e 113 for (i = 0; i < count; i++) {
Anna Bridge 186:707f6e361f3e 114 stats[i].id = (uint32_t)threads[i];
Anna Bridge 186:707f6e361f3e 115 stats[i].state = (uint32_t)osThreadGetState(threads[i]);
Anna Bridge 186:707f6e361f3e 116 stats[i].priority = (uint32_t)osThreadGetPriority(threads[i]);
Anna Bridge 186:707f6e361f3e 117 stats[i].stack_size = osThreadGetStackSize(threads[i]);
Anna Bridge 186:707f6e361f3e 118 stats[i].stack_space = osThreadGetStackSpace(threads[i]);
Anna Bridge 186:707f6e361f3e 119 stats[i].name = osThreadGetName(threads[i]);
Anna Bridge 186:707f6e361f3e 120 }
Anna Bridge 186:707f6e361f3e 121 osKernelUnlock();
Anna Bridge 186:707f6e361f3e 122 free(threads);
<> 152:9a67f0b066fc 123 #endif
Anna Bridge 186:707f6e361f3e 124 return i;
Anna Bridge 186:707f6e361f3e 125 }
Anna Bridge 186:707f6e361f3e 126
Anna Bridge 186:707f6e361f3e 127 void mbed_stats_sys_get(mbed_stats_sys_t *stats)
Anna Bridge 186:707f6e361f3e 128 {
Anna Bridge 186:707f6e361f3e 129 MBED_ASSERT(stats != NULL);
Anna Bridge 186:707f6e361f3e 130 memset(stats, 0, sizeof(mbed_stats_sys_t));
Anna Bridge 186:707f6e361f3e 131
Anna Bridge 186:707f6e361f3e 132 #if defined(MBED_SYS_STATS_ENABLED)
AnnaBridge 187:0387e8f68319 133 stats->os_version = MBED_VERSION;
AnnaBridge 189:f392fc9709a3 134 #if defined(MBED_RAM_START) && defined(MBED_RAM_SIZE)
AnnaBridge 189:f392fc9709a3 135 stats->ram_start[0] = MBED_RAM_START;
AnnaBridge 189:f392fc9709a3 136 stats->ram_size[0] = MBED_RAM_SIZE;
AnnaBridge 189:f392fc9709a3 137 #endif
AnnaBridge 189:f392fc9709a3 138 #if defined(MBED_ROM_START) && defined(MBED_ROM_SIZE)
AnnaBridge 189:f392fc9709a3 139 stats->rom_start[0] = MBED_ROM_START;
AnnaBridge 189:f392fc9709a3 140 stats->rom_size[0] = MBED_ROM_SIZE;
AnnaBridge 189:f392fc9709a3 141 #endif
AnnaBridge 189:f392fc9709a3 142 #if defined(MBED_RAM1_START) && defined(MBED_RAM1_SIZE)
AnnaBridge 189:f392fc9709a3 143 stats->ram_start[1] = MBED_RAM1_START;
AnnaBridge 189:f392fc9709a3 144 stats->ram_size[1] = MBED_RAM1_SIZE;
AnnaBridge 189:f392fc9709a3 145 #endif
AnnaBridge 189:f392fc9709a3 146 #if defined(MBED_RAM2_START) && defined(MBED_RAM2_SIZE)
AnnaBridge 189:f392fc9709a3 147 stats->ram_start[2] = MBED_RAM2_START;
AnnaBridge 189:f392fc9709a3 148 stats->ram_size[2] = MBED_RAM2_SIZE;
AnnaBridge 189:f392fc9709a3 149 #endif
AnnaBridge 189:f392fc9709a3 150 #if defined(MBED_RAM3_START) && defined(MBED_RAM3_SIZE)
AnnaBridge 189:f392fc9709a3 151 stats->ram_start[3] = MBED_RAM3_START;
AnnaBridge 189:f392fc9709a3 152 stats->ram_size[3] = MBED_RAM3_SIZE;
AnnaBridge 189:f392fc9709a3 153 #endif
AnnaBridge 189:f392fc9709a3 154 #if defined(MBED_ROM1_START) && defined(MBED_ROM1_SIZE)
AnnaBridge 189:f392fc9709a3 155 stats->rom_start[1] = MBED_ROM1_START;
AnnaBridge 189:f392fc9709a3 156 stats->rom_size[1] = MBED_ROM1_SIZE;
AnnaBridge 189:f392fc9709a3 157 #endif
AnnaBridge 189:f392fc9709a3 158 #if defined(MBED_ROM2_START) && defined(MBED_ROM2_SIZE)
AnnaBridge 189:f392fc9709a3 159 stats->rom_start[2] = MBED_ROM2_START;
AnnaBridge 189:f392fc9709a3 160 stats->rom_size[2] = MBED_ROM2_SIZE;
AnnaBridge 189:f392fc9709a3 161 #endif
AnnaBridge 189:f392fc9709a3 162 #if defined(MBED_ROM3_START) && defined(MBED_ROM3_SIZE)
AnnaBridge 189:f392fc9709a3 163 stats->rom_start[3] = MBED_ROM3_START;
AnnaBridge 189:f392fc9709a3 164 stats->rom_size[3] = MBED_ROM3_SIZE;
AnnaBridge 189:f392fc9709a3 165 #endif
AnnaBridge 189:f392fc9709a3 166
Anna Bridge 186:707f6e361f3e 167 #if defined(__CORTEX_M)
Anna Bridge 186:707f6e361f3e 168 stats->cpu_id = SCB->CPUID;
Anna Bridge 186:707f6e361f3e 169 #endif
Anna Bridge 186:707f6e361f3e 170 #if defined(__IAR_SYSTEMS_ICC__)
Anna Bridge 186:707f6e361f3e 171 stats->compiler_id = IAR;
Anna Bridge 186:707f6e361f3e 172 stats->compiler_version = __VER__;
Anna Bridge 186:707f6e361f3e 173 #elif defined(__CC_ARM)
Anna Bridge 186:707f6e361f3e 174 stats->compiler_id = ARM;
Anna Bridge 186:707f6e361f3e 175 stats->compiler_version = __ARMCC_VERSION;
Anna Bridge 186:707f6e361f3e 176 #elif defined(__GNUC__)
Anna Bridge 186:707f6e361f3e 177 stats->compiler_id = GCC_ARM;
Anna Bridge 186:707f6e361f3e 178 stats->compiler_version = (__GNUC__ * 10000 + __GNUC_MINOR__ * 100);
Anna Bridge 186:707f6e361f3e 179 #endif
Anna Bridge 186:707f6e361f3e 180
Anna Bridge 186:707f6e361f3e 181 #endif
Anna Bridge 186:707f6e361f3e 182 return;
Anna Bridge 186:707f6e361f3e 183 }