blob: b9cba6bee5d118955ad8f3eaded559c81e5e2fda [file] [log] [blame]
/*
* Copyright (c) 2012-2014 Wind River Systems, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef _LATENCY_MEASURE_UNIT_H
#define _LATENCY_MEASURE_UNIT_H
/*
* @brief This file contains function declarations, macros and inline functions
* used in latency measurement.
*/
#include <zephyr/timing/timing.h>
#include <zephyr/sys/printk.h>
#include <stdio.h>
#include <zephyr/timestamp.h>
#include <zephyr/app_memory/app_memdomain.h>
#define START_STACK_SIZE (1024 + CONFIG_TEST_EXTRA_STACK_SIZE)
#define ALT_STACK_SIZE (1024 + CONFIG_TEST_EXTRA_STACK_SIZE)
#ifdef CONFIG_USERSPACE
#define BENCH_BMEM K_APP_BMEM(bench_mem_partition)
#else
#define BENCH_BMEM
#endif
struct timestamp_data {
uint64_t cycles;
timing_t sample;
};
K_THREAD_STACK_DECLARE(start_stack, START_STACK_SIZE);
K_THREAD_STACK_DECLARE(alt_stack, ALT_STACK_SIZE);
extern struct k_thread start_thread;
extern struct k_thread alt_thread;
extern struct k_sem pause_sem;
extern struct timestamp_data timestamp;
#ifdef CONFIG_USERSPACE
extern uint64_t user_timestamp_overhead;
#endif
extern uint64_t timestamp_overhead;
extern int error_count;
#define TICK_OCCURRENCE_ERROR "Error: Tick Occurred"
#ifdef CSV_FORMAT_OUTPUT
#define FORMAT_STR "%-94s,%s,%s,%s\n"
#define CYCLE_FORMAT "%8u"
#define NSEC_FORMAT "%8u"
#else
#define FORMAT_STR "%-94s:%s , %s : %s\n"
#define CYCLE_FORMAT "%8u cycles"
#define NSEC_FORMAT "%8u ns"
#endif
/**
* @brief Display a line of statistics
*
* This macro displays the following:
* 1. Test description summary
* 2. Number of cycles - See Note
* 3. Number of nanoseconds - See Note
* 4. Additional notes describing the nature of any errors
*
* Note - If the @a error parameter is not false, then the test has no
* numerical information to print and it will instead print "FAILED".
*/
#define PRINT_F(summary, cycles, nsec, error, notes) \
do { \
char cycle_str[32]; \
char nsec_str[32]; \
\
if (!error) { \
snprintk(cycle_str, 30, CYCLE_FORMAT, cycles); \
snprintk(nsec_str, 30, NSEC_FORMAT, nsec); \
} else { \
snprintk(cycle_str, 30, "%15s", "FAILED"); \
snprintk(nsec_str, 30, "%15s", "FAILED"); \
} \
printk(FORMAT_STR, summary, cycle_str, nsec_str, notes); \
} while (0)
#define PRINT_STATS(summary, value, error, notes) \
PRINT_F(summary, value, \
(uint32_t)timing_cycles_to_ns(value), \
error, notes)
#define PRINT_STATS_AVG(summary, value, counter, error, notes) \
PRINT_F(summary, value / counter, \
(uint32_t)timing_cycles_to_ns_avg(value, counter), \
error, notes);
#endif