RTC auf true
platform/mbed_stats.c@2:7aab896b1a3b, 2019-03-13 (annotated)
- Committer:
- kevman
- Date:
- Wed Mar 13 11:03:24 2019 +0000
- Revision:
- 2:7aab896b1a3b
- Parent:
- 0:38ceb79fef03
2019-03-13
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kevman | 0:38ceb79fef03 | 1 | #include "mbed_assert.h" |
kevman | 0:38ceb79fef03 | 2 | #include "mbed_stats.h" |
kevman | 0:38ceb79fef03 | 3 | #include "mbed_power_mgmt.h" |
kevman | 0:38ceb79fef03 | 4 | #include "mbed_version.h" |
kevman | 0:38ceb79fef03 | 5 | #include <string.h> |
kevman | 0:38ceb79fef03 | 6 | #include <stdlib.h> |
kevman | 0:38ceb79fef03 | 7 | |
kevman | 0:38ceb79fef03 | 8 | #include "device.h" |
kevman | 0:38ceb79fef03 | 9 | #ifdef MBED_CONF_RTOS_PRESENT |
kevman | 0:38ceb79fef03 | 10 | #include "cmsis_os2.h" |
kevman | 0:38ceb79fef03 | 11 | #include "rtos_idle.h" |
kevman | 0:38ceb79fef03 | 12 | #elif defined(MBED_STACK_STATS_ENABLED) || defined(MBED_THREAD_STATS_ENABLED) || defined(MBED_CPU_STATS_ENABLED) |
kevman | 0:38ceb79fef03 | 13 | #warning Statistics are currently not supported without the rtos. |
kevman | 0:38ceb79fef03 | 14 | #endif |
kevman | 0:38ceb79fef03 | 15 | |
kevman | 0:38ceb79fef03 | 16 | #if defined(MBED_CPU_STATS_ENABLED) && (!defined(DEVICE_LPTICKER) || !defined(DEVICE_SLEEP)) |
kevman | 0:38ceb79fef03 | 17 | #warning CPU statistics are not supported without low power timer support. |
kevman | 0:38ceb79fef03 | 18 | #endif |
kevman | 0:38ceb79fef03 | 19 | |
kevman | 0:38ceb79fef03 | 20 | void mbed_stats_cpu_get(mbed_stats_cpu_t *stats) |
kevman | 0:38ceb79fef03 | 21 | { |
kevman | 0:38ceb79fef03 | 22 | MBED_ASSERT(stats != NULL); |
kevman | 0:38ceb79fef03 | 23 | memset(stats, 0, sizeof(mbed_stats_cpu_t)); |
kevman | 0:38ceb79fef03 | 24 | #if defined(MBED_CPU_STATS_ENABLED) && defined(DEVICE_LPTICKER) && defined(DEVICE_SLEEP) |
kevman | 0:38ceb79fef03 | 25 | stats->uptime = mbed_uptime(); |
kevman | 0:38ceb79fef03 | 26 | stats->idle_time = mbed_time_idle(); |
kevman | 0:38ceb79fef03 | 27 | stats->sleep_time = mbed_time_sleep(); |
kevman | 0:38ceb79fef03 | 28 | stats->deep_sleep_time = mbed_time_deepsleep(); |
kevman | 0:38ceb79fef03 | 29 | #endif |
kevman | 0:38ceb79fef03 | 30 | } |
kevman | 0:38ceb79fef03 | 31 | |
kevman | 0:38ceb79fef03 | 32 | // note: mbed_stats_heap_get defined in mbed_alloc_wrappers.cpp |
kevman | 0:38ceb79fef03 | 33 | void mbed_stats_stack_get(mbed_stats_stack_t *stats) |
kevman | 0:38ceb79fef03 | 34 | { |
kevman | 0:38ceb79fef03 | 35 | MBED_ASSERT(stats != NULL); |
kevman | 0:38ceb79fef03 | 36 | memset(stats, 0, sizeof(mbed_stats_stack_t)); |
kevman | 0:38ceb79fef03 | 37 | |
kevman | 0:38ceb79fef03 | 38 | #if defined(MBED_STACK_STATS_ENABLED) && defined(MBED_CONF_RTOS_PRESENT) |
kevman | 0:38ceb79fef03 | 39 | uint32_t thread_n = osThreadGetCount(); |
kevman | 0:38ceb79fef03 | 40 | unsigned i; |
kevman | 0:38ceb79fef03 | 41 | osThreadId_t *threads; |
kevman | 0:38ceb79fef03 | 42 | |
kevman | 0:38ceb79fef03 | 43 | threads = malloc(sizeof(osThreadId_t) * thread_n); |
kevman | 0:38ceb79fef03 | 44 | // Don't fail on lack of memory |
kevman | 0:38ceb79fef03 | 45 | if (!threads) { |
kevman | 0:38ceb79fef03 | 46 | return; |
kevman | 0:38ceb79fef03 | 47 | } |
kevman | 0:38ceb79fef03 | 48 | |
kevman | 0:38ceb79fef03 | 49 | osKernelLock(); |
kevman | 0:38ceb79fef03 | 50 | thread_n = osThreadEnumerate(threads, thread_n); |
kevman | 0:38ceb79fef03 | 51 | |
kevman | 0:38ceb79fef03 | 52 | for (i = 0; i < thread_n; i++) { |
kevman | 0:38ceb79fef03 | 53 | uint32_t stack_size = osThreadGetStackSize(threads[i]); |
kevman | 0:38ceb79fef03 | 54 | stats->max_size += stack_size - osThreadGetStackSpace(threads[i]); |
kevman | 0:38ceb79fef03 | 55 | stats->reserved_size += stack_size; |
kevman | 0:38ceb79fef03 | 56 | stats->stack_cnt++; |
kevman | 0:38ceb79fef03 | 57 | } |
kevman | 0:38ceb79fef03 | 58 | osKernelUnlock(); |
kevman | 0:38ceb79fef03 | 59 | |
kevman | 0:38ceb79fef03 | 60 | free(threads); |
kevman | 0:38ceb79fef03 | 61 | #endif |
kevman | 0:38ceb79fef03 | 62 | } |
kevman | 0:38ceb79fef03 | 63 | |
kevman | 0:38ceb79fef03 | 64 | size_t mbed_stats_stack_get_each(mbed_stats_stack_t *stats, size_t count) |
kevman | 0:38ceb79fef03 | 65 | { |
kevman | 0:38ceb79fef03 | 66 | MBED_ASSERT(stats != NULL); |
kevman | 0:38ceb79fef03 | 67 | memset(stats, 0, count * sizeof(mbed_stats_stack_t)); |
kevman | 0:38ceb79fef03 | 68 | |
kevman | 0:38ceb79fef03 | 69 | size_t i = 0; |
kevman | 0:38ceb79fef03 | 70 | |
kevman | 0:38ceb79fef03 | 71 | #if defined(MBED_STACK_STATS_ENABLED) && defined(MBED_CONF_RTOS_PRESENT) |
kevman | 0:38ceb79fef03 | 72 | osThreadId_t *threads; |
kevman | 0:38ceb79fef03 | 73 | |
kevman | 0:38ceb79fef03 | 74 | threads = malloc(sizeof(osThreadId_t) * count); |
kevman | 0:38ceb79fef03 | 75 | // Don't fail on lack of memory |
kevman | 0:38ceb79fef03 | 76 | if (!threads) { |
kevman | 0:38ceb79fef03 | 77 | return 0; |
kevman | 0:38ceb79fef03 | 78 | } |
kevman | 0:38ceb79fef03 | 79 | |
kevman | 0:38ceb79fef03 | 80 | osKernelLock(); |
kevman | 0:38ceb79fef03 | 81 | count = osThreadEnumerate(threads, count); |
kevman | 0:38ceb79fef03 | 82 | |
kevman | 0:38ceb79fef03 | 83 | for (i = 0; i < count; i++) { |
kevman | 0:38ceb79fef03 | 84 | uint32_t stack_size = osThreadGetStackSize(threads[i]); |
kevman | 0:38ceb79fef03 | 85 | stats[i].max_size = stack_size - osThreadGetStackSpace(threads[i]); |
kevman | 0:38ceb79fef03 | 86 | stats[i].reserved_size = stack_size; |
kevman | 0:38ceb79fef03 | 87 | stats[i].thread_id = (uint32_t)threads[i]; |
kevman | 0:38ceb79fef03 | 88 | stats[i].stack_cnt = 1; |
kevman | 0:38ceb79fef03 | 89 | } |
kevman | 0:38ceb79fef03 | 90 | osKernelUnlock(); |
kevman | 0:38ceb79fef03 | 91 | |
kevman | 0:38ceb79fef03 | 92 | free(threads); |
kevman | 0:38ceb79fef03 | 93 | #endif |
kevman | 0:38ceb79fef03 | 94 | |
kevman | 0:38ceb79fef03 | 95 | return i; |
kevman | 0:38ceb79fef03 | 96 | } |
kevman | 0:38ceb79fef03 | 97 | |
kevman | 0:38ceb79fef03 | 98 | size_t mbed_stats_thread_get_each(mbed_stats_thread_t *stats, size_t count) |
kevman | 0:38ceb79fef03 | 99 | { |
kevman | 0:38ceb79fef03 | 100 | MBED_ASSERT(stats != NULL); |
kevman | 0:38ceb79fef03 | 101 | memset(stats, 0, count * sizeof(mbed_stats_thread_t)); |
kevman | 0:38ceb79fef03 | 102 | size_t i = 0; |
kevman | 0:38ceb79fef03 | 103 | |
kevman | 0:38ceb79fef03 | 104 | #if defined(MBED_THREAD_STATS_ENABLED) && defined(MBED_CONF_RTOS_PRESENT) |
kevman | 0:38ceb79fef03 | 105 | osThreadId_t *threads; |
kevman | 0:38ceb79fef03 | 106 | |
kevman | 0:38ceb79fef03 | 107 | threads = malloc(sizeof(osThreadId_t) * count); |
kevman | 0:38ceb79fef03 | 108 | MBED_ASSERT(threads != NULL); |
kevman | 0:38ceb79fef03 | 109 | |
kevman | 0:38ceb79fef03 | 110 | osKernelLock(); |
kevman | 0:38ceb79fef03 | 111 | count = osThreadEnumerate(threads, count); |
kevman | 0:38ceb79fef03 | 112 | |
kevman | 0:38ceb79fef03 | 113 | for (i = 0; i < count; i++) { |
kevman | 0:38ceb79fef03 | 114 | stats[i].id = (uint32_t)threads[i]; |
kevman | 0:38ceb79fef03 | 115 | stats[i].state = (uint32_t)osThreadGetState(threads[i]); |
kevman | 0:38ceb79fef03 | 116 | stats[i].priority = (uint32_t)osThreadGetPriority(threads[i]); |
kevman | 0:38ceb79fef03 | 117 | stats[i].stack_size = osThreadGetStackSize(threads[i]); |
kevman | 0:38ceb79fef03 | 118 | stats[i].stack_space = osThreadGetStackSpace(threads[i]); |
kevman | 0:38ceb79fef03 | 119 | stats[i].name = osThreadGetName(threads[i]); |
kevman | 0:38ceb79fef03 | 120 | } |
kevman | 0:38ceb79fef03 | 121 | osKernelUnlock(); |
kevman | 0:38ceb79fef03 | 122 | free(threads); |
kevman | 0:38ceb79fef03 | 123 | #endif |
kevman | 0:38ceb79fef03 | 124 | return i; |
kevman | 0:38ceb79fef03 | 125 | } |
kevman | 0:38ceb79fef03 | 126 | |
kevman | 0:38ceb79fef03 | 127 | void mbed_stats_sys_get(mbed_stats_sys_t *stats) |
kevman | 0:38ceb79fef03 | 128 | { |
kevman | 0:38ceb79fef03 | 129 | MBED_ASSERT(stats != NULL); |
kevman | 0:38ceb79fef03 | 130 | memset(stats, 0, sizeof(mbed_stats_sys_t)); |
kevman | 0:38ceb79fef03 | 131 | |
kevman | 0:38ceb79fef03 | 132 | #if defined(MBED_SYS_STATS_ENABLED) |
kevman | 0:38ceb79fef03 | 133 | stats->os_version = MBED_VERSION; |
kevman | 0:38ceb79fef03 | 134 | #if defined(__CORTEX_M) |
kevman | 0:38ceb79fef03 | 135 | stats->cpu_id = SCB->CPUID; |
kevman | 0:38ceb79fef03 | 136 | #endif |
kevman | 0:38ceb79fef03 | 137 | #if defined(__IAR_SYSTEMS_ICC__) |
kevman | 0:38ceb79fef03 | 138 | stats->compiler_id = IAR; |
kevman | 0:38ceb79fef03 | 139 | stats->compiler_version = __VER__; |
kevman | 0:38ceb79fef03 | 140 | #elif defined(__CC_ARM) |
kevman | 0:38ceb79fef03 | 141 | stats->compiler_id = ARM; |
kevman | 0:38ceb79fef03 | 142 | stats->compiler_version = __ARMCC_VERSION; |
kevman | 0:38ceb79fef03 | 143 | #elif defined(__GNUC__) |
kevman | 0:38ceb79fef03 | 144 | stats->compiler_id = GCC_ARM; |
kevman | 0:38ceb79fef03 | 145 | stats->compiler_version = (__GNUC__ * 10000 + __GNUC_MINOR__ * 100); |
kevman | 0:38ceb79fef03 | 146 | #endif |
kevman | 0:38ceb79fef03 | 147 | |
kevman | 0:38ceb79fef03 | 148 | #endif |
kevman | 0:38ceb79fef03 | 149 | return; |
kevman | 0:38ceb79fef03 | 150 | } |