/** ****************************************************************************** * * @file pios_instrumentation.c * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2014. * @brief PiOS instrumentation infrastructure * Allow to collects performance indexes and execution times * @see The GNU Public License (GPL) Version 3 * *****************************************************************************/ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include pios_perf_counter_t *pios_instrumentation_perf_counters = NULL; int8_t pios_instrumentation_max_counters = -1; int8_t pios_instrumentation_last_used_counter = -1; void PIOS_Instrumentation_Init(int8_t maxCounters) { PIOS_Assert(maxCounters >= 0); if (maxCounters > 0) { pios_instrumentation_perf_counters = (pios_perf_counter_t *)pvPortMalloc(sizeof(pios_perf_counter_t) * maxCounters); PIOS_Assert(pios_instrumentation_perf_counters); memset(pios_instrumentation_perf_counters, 0, sizeof(pios_perf_counter_t) * maxCounters); pios_instrumentation_max_counters = maxCounters; } else { pios_instrumentation_perf_counters = NULL; pios_instrumentation_max_counters = -1; } } int8_t PIOS_Instrumentation_CreateCounter(uint32_t id) { PIOS_Assert(pios_instrumentation_perf_counters && (pios_instrumentation_max_counters > pios_instrumentation_last_used_counter)); int8_t idx = ++pios_instrumentation_last_used_counter; pios_instrumentation_perf_counters[idx].id = id; pios_instrumentation_perf_counters[idx].max = INT32_MIN; pios_instrumentation_perf_counters[idx].min = INT32_MAX; return idx; } int8_t PIOS_Instrumentation_SearchCounter(uint32_t id) { PIOS_Assert(pios_instrumentation_perf_counters); uint8_t i = 0; while (i < pios_instrumentation_last_used_counter && pios_instrumentation_perf_counters[i].id != id) {} if (pios_instrumentation_perf_counters[i].id != id) { return -1; } return i; } void PIOS_Instrumentation_ForEachCounter(InstrumentationCounterCallback callback, void *context) { PIOS_Assert(pios_instrumentation_perf_counters); for (int8_t index = 0; index < pios_instrumentation_last_used_counter + 1; index++) { const pios_perf_counter_t *counter = &pios_instrumentation_perf_counters[index]; callback(counter, index, context); } }