tempcommit 13/05

Committer:
tijl
Date:
Wed May 15 13:39:22 2019 +0000
Revision:
2:048e163245b7
Parent:
0:73f2160fef5a
blub 15/05;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ruben_Heintjens 0:73f2160fef5a 1 /* mbed Microcontroller Library
Ruben_Heintjens 0:73f2160fef5a 2 * Copyright (c) 2018 ARM Limited
Ruben_Heintjens 0:73f2160fef5a 3 * SPDX-License-Identifier: Apache-2.0
Ruben_Heintjens 0:73f2160fef5a 4 */
Ruben_Heintjens 0:73f2160fef5a 5
Ruben_Heintjens 0:73f2160fef5a 6 #ifndef STATS_REPORT_H
Ruben_Heintjens 0:73f2160fef5a 7 #define STATS_REPORT
Ruben_Heintjens 0:73f2160fef5a 8
Ruben_Heintjens 0:73f2160fef5a 9 #include "mbed.h"
Ruben_Heintjens 0:73f2160fef5a 10
Ruben_Heintjens 0:73f2160fef5a 11 /**
Ruben_Heintjens 0:73f2160fef5a 12 * System Reporting library. Provides runtime information on device:
Ruben_Heintjens 0:73f2160fef5a 13 * - CPU sleep, idle, and wake times
Ruben_Heintjens 0:73f2160fef5a 14 * - Heap and stack usage
Ruben_Heintjens 0:73f2160fef5a 15 * - Thread information
Ruben_Heintjens 0:73f2160fef5a 16 * - Static system information
Ruben_Heintjens 0:73f2160fef5a 17 */
Ruben_Heintjens 0:73f2160fef5a 18 class SystemReport {
Ruben_Heintjens 0:73f2160fef5a 19 mbed_stats_heap_t heap_stats;
Ruben_Heintjens 0:73f2160fef5a 20 mbed_stats_cpu_t cpu_stats;
Ruben_Heintjens 0:73f2160fef5a 21 mbed_stats_sys_t sys_stats;
Ruben_Heintjens 0:73f2160fef5a 22
Ruben_Heintjens 0:73f2160fef5a 23 mbed_stats_thread_t *thread_stats;
Ruben_Heintjens 0:73f2160fef5a 24 uint8_t thread_count;
Ruben_Heintjens 0:73f2160fef5a 25 uint8_t max_thread_count;
Ruben_Heintjens 0:73f2160fef5a 26 uint32_t sample_time_ms;
Ruben_Heintjens 0:73f2160fef5a 27
Ruben_Heintjens 0:73f2160fef5a 28 public:
Ruben_Heintjens 0:73f2160fef5a 29 /**
Ruben_Heintjens 0:73f2160fef5a 30 * SystemReport - Sample rate in ms is required to handle the CPU percent awake logic
Ruben_Heintjens 0:73f2160fef5a 31 */
Ruben_Heintjens 0:73f2160fef5a 32 SystemReport(uint32_t sample_rate) : max_thread_count(8), sample_time_ms(sample_rate)
Ruben_Heintjens 0:73f2160fef5a 33 {
Ruben_Heintjens 0:73f2160fef5a 34 thread_stats = new mbed_stats_thread_t[max_thread_count];
Ruben_Heintjens 0:73f2160fef5a 35
Ruben_Heintjens 0:73f2160fef5a 36 // Collect the static system information
Ruben_Heintjens 0:73f2160fef5a 37 mbed_stats_sys_get(&sys_stats);
Ruben_Heintjens 0:73f2160fef5a 38
Ruben_Heintjens 0:73f2160fef5a 39 printf("=============================== SYSTEM INFO ================================\r\n");
Ruben_Heintjens 0:73f2160fef5a 40 printf("Mbed OS Version: %ld \r\n", sys_stats.os_version);
Ruben_Heintjens 0:73f2160fef5a 41 printf("CPU ID: 0x%lx \r\n", sys_stats.cpu_id);
Ruben_Heintjens 0:73f2160fef5a 42 printf("Compiler ID: %d \r\n", sys_stats.compiler_id);
Ruben_Heintjens 0:73f2160fef5a 43 printf("Compiler Version: %ld \r\n", sys_stats.compiler_version);
Ruben_Heintjens 0:73f2160fef5a 44
Ruben_Heintjens 0:73f2160fef5a 45 for (int i = 0; i < MBED_MAX_MEM_REGIONS; i++) {
Ruben_Heintjens 0:73f2160fef5a 46 if (sys_stats.ram_size[i] != 0) {
Ruben_Heintjens 0:73f2160fef5a 47 printf("RAM%d: Start 0x%lx Size: 0x%lx \r\n", i, sys_stats.ram_start[i], sys_stats.ram_size[i]);
Ruben_Heintjens 0:73f2160fef5a 48 }
Ruben_Heintjens 0:73f2160fef5a 49 }
Ruben_Heintjens 0:73f2160fef5a 50 for (int i = 0; i < MBED_MAX_MEM_REGIONS; i++) {
Ruben_Heintjens 0:73f2160fef5a 51 if (sys_stats.rom_size[i] != 0) {
Ruben_Heintjens 0:73f2160fef5a 52 printf("ROM%d: Start 0x%lx Size: 0x%lx \r\n", i, sys_stats.rom_start[i], sys_stats.rom_size[i]);
Ruben_Heintjens 0:73f2160fef5a 53 }
Ruben_Heintjens 0:73f2160fef5a 54 }
Ruben_Heintjens 0:73f2160fef5a 55 }
Ruben_Heintjens 0:73f2160fef5a 56
Ruben_Heintjens 0:73f2160fef5a 57 ~SystemReport(void)
Ruben_Heintjens 0:73f2160fef5a 58 {
Ruben_Heintjens 0:73f2160fef5a 59 free(thread_stats);
Ruben_Heintjens 0:73f2160fef5a 60 }
Ruben_Heintjens 0:73f2160fef5a 61
Ruben_Heintjens 0:73f2160fef5a 62 /**
Ruben_Heintjens 0:73f2160fef5a 63 * Report on each Mbed OS Platform stats API
Ruben_Heintjens 0:73f2160fef5a 64 */
Ruben_Heintjens 0:73f2160fef5a 65 void report_state(void)
Ruben_Heintjens 0:73f2160fef5a 66 {
Ruben_Heintjens 0:73f2160fef5a 67 report_cpu_stats();
Ruben_Heintjens 0:73f2160fef5a 68 report_heap_stats();
Ruben_Heintjens 0:73f2160fef5a 69 report_thread_stats();
Ruben_Heintjens 0:73f2160fef5a 70
Ruben_Heintjens 0:73f2160fef5a 71 // Clear next line to separate subsequent report logs
Ruben_Heintjens 0:73f2160fef5a 72 printf("\r\n");
Ruben_Heintjens 0:73f2160fef5a 73 }
Ruben_Heintjens 0:73f2160fef5a 74
Ruben_Heintjens 0:73f2160fef5a 75 /**
Ruben_Heintjens 0:73f2160fef5a 76 * Report CPU idle and awake time in terms of percentage
Ruben_Heintjens 0:73f2160fef5a 77 */
Ruben_Heintjens 0:73f2160fef5a 78 void report_cpu_stats(void)
Ruben_Heintjens 0:73f2160fef5a 79 {
Ruben_Heintjens 0:73f2160fef5a 80 static uint64_t prev_idle_time = 0;
Ruben_Heintjens 0:73f2160fef5a 81
Ruben_Heintjens 0:73f2160fef5a 82 printf("================= CPU STATS =================\r\n");
Ruben_Heintjens 0:73f2160fef5a 83
Ruben_Heintjens 0:73f2160fef5a 84 // Collect and print cpu stats
Ruben_Heintjens 0:73f2160fef5a 85 mbed_stats_cpu_get(&cpu_stats);
Ruben_Heintjens 0:73f2160fef5a 86
Ruben_Heintjens 0:73f2160fef5a 87 uint64_t diff = (cpu_stats.idle_time - prev_idle_time);
Ruben_Heintjens 0:73f2160fef5a 88 uint8_t idle = (diff * 100) / (sample_time_ms * 1000); // usec;
Ruben_Heintjens 0:73f2160fef5a 89 uint8_t usage = 100 - ((diff * 100) / (sample_time_ms * 1000)); // usec;;
Ruben_Heintjens 0:73f2160fef5a 90 prev_idle_time = cpu_stats.idle_time;
Ruben_Heintjens 0:73f2160fef5a 91
Ruben_Heintjens 0:73f2160fef5a 92 printf("Idle: %d%% Usage: %d%% \r\n", idle, usage);
Ruben_Heintjens 0:73f2160fef5a 93 }
Ruben_Heintjens 0:73f2160fef5a 94
Ruben_Heintjens 0:73f2160fef5a 95 /**
Ruben_Heintjens 0:73f2160fef5a 96 * Report current heap stats. Current heap refers to the current amount of
Ruben_Heintjens 0:73f2160fef5a 97 * allocated heap. Max heap refers to the highest amount of heap allocated
Ruben_Heintjens 0:73f2160fef5a 98 * since reset.
Ruben_Heintjens 0:73f2160fef5a 99 */
Ruben_Heintjens 0:73f2160fef5a 100 void report_heap_stats(void)
Ruben_Heintjens 0:73f2160fef5a 101 {
Ruben_Heintjens 0:73f2160fef5a 102 printf("================ HEAP STATS =================\r\n");
Ruben_Heintjens 0:73f2160fef5a 103
Ruben_Heintjens 0:73f2160fef5a 104 // Collect and print heap stats
Ruben_Heintjens 0:73f2160fef5a 105 mbed_stats_heap_get(&heap_stats);
Ruben_Heintjens 0:73f2160fef5a 106
Ruben_Heintjens 0:73f2160fef5a 107 printf("Current heap: %lu\r\n", heap_stats.current_size);
Ruben_Heintjens 0:73f2160fef5a 108 printf("Max heap size: %lu\r\n", heap_stats.max_size);
Ruben_Heintjens 0:73f2160fef5a 109 }
Ruben_Heintjens 0:73f2160fef5a 110
Ruben_Heintjens 0:73f2160fef5a 111 /**
Ruben_Heintjens 0:73f2160fef5a 112 * Report active thread stats
Ruben_Heintjens 0:73f2160fef5a 113 */
Ruben_Heintjens 0:73f2160fef5a 114 void report_thread_stats(void)
Ruben_Heintjens 0:73f2160fef5a 115 {
Ruben_Heintjens 0:73f2160fef5a 116 printf("================ THREAD STATS ===============\r\n");
Ruben_Heintjens 0:73f2160fef5a 117
Ruben_Heintjens 0:73f2160fef5a 118 // Collect and print running thread stats
Ruben_Heintjens 0:73f2160fef5a 119 int count = mbed_stats_thread_get_each(thread_stats, max_thread_count);
Ruben_Heintjens 0:73f2160fef5a 120
Ruben_Heintjens 0:73f2160fef5a 121 for (int i = 0; i < count; i++) {
Ruben_Heintjens 0:73f2160fef5a 122 printf("ID: 0x%lx \r\n", thread_stats[i].id);
Ruben_Heintjens 0:73f2160fef5a 123 printf("Name: %s \r\n", thread_stats[i].name);
Ruben_Heintjens 0:73f2160fef5a 124 printf("State: %ld \r\n", thread_stats[i].state);
Ruben_Heintjens 0:73f2160fef5a 125 printf("Priority: %ld \r\n", thread_stats[i].priority);
Ruben_Heintjens 0:73f2160fef5a 126 printf("Stack Size: %ld \r\n", thread_stats[i].stack_size);
Ruben_Heintjens 0:73f2160fef5a 127 printf("Stack Space: %ld \r\n", thread_stats[i].stack_space);
Ruben_Heintjens 0:73f2160fef5a 128 }
Ruben_Heintjens 0:73f2160fef5a 129 }
Ruben_Heintjens 0:73f2160fef5a 130 };
Ruben_Heintjens 0:73f2160fef5a 131
Ruben_Heintjens 0:73f2160fef5a 132 #endif // STATS_REPORT_H