From f8e7bb03ca44710b753e8a0d5bf78932e97abb3e Mon Sep 17 00:00:00 2001 From: Hudson Ayers Date: Sun, 31 Mar 2024 22:30:51 -0700 Subject: [PATCH] Add cycle counter driver and test app --- examples/tests/cycle_count/Makefile | 11 +++++++++ examples/tests/cycle_count/README.md | 5 ++++ examples/tests/cycle_count/main.c | 36 ++++++++++++++++++++++++++++ libtock/cycle_counter.c | 29 ++++++++++++++++++++++ libtock/cycle_counter.h | 19 +++++++++++++++ 5 files changed, 100 insertions(+) create mode 100644 examples/tests/cycle_count/Makefile create mode 100644 examples/tests/cycle_count/README.md create mode 100644 examples/tests/cycle_count/main.c create mode 100644 libtock/cycle_counter.c create mode 100644 libtock/cycle_counter.h diff --git a/examples/tests/cycle_count/Makefile b/examples/tests/cycle_count/Makefile new file mode 100644 index 000000000..54d6a7969 --- /dev/null +++ b/examples/tests/cycle_count/Makefile @@ -0,0 +1,11 @@ +# Makefile for user application + +# Specify this directory relative to the current application. +TOCK_USERLAND_BASE_DIR = ../../.. + +# Which files to compile. +C_SRCS := $(wildcard *.c) + +# Include userland master makefile. Contains rules and flags for actually +# building the application. +include $(TOCK_USERLAND_BASE_DIR)/AppMakefile.mk diff --git a/examples/tests/cycle_count/README.md b/examples/tests/cycle_count/README.md new file mode 100644 index 000000000..ae552f58d --- /dev/null +++ b/examples/tests/cycle_count/README.md @@ -0,0 +1,5 @@ +Test `cycle_count` +==================== + +This tests the cycle counter capsule. +It will print the number of cycles required to toggle an LED. diff --git a/examples/tests/cycle_count/main.c b/examples/tests/cycle_count/main.c new file mode 100644 index 000000000..6658018f2 --- /dev/null +++ b/examples/tests/cycle_count/main.c @@ -0,0 +1,36 @@ +#include + +#include +#include +#include + +int main(void) { + uint64_t cycles = 0; + + int rc = cycle_counter_reset(); + if (rc == RETURNCODE_ENOSUPPORT) { + printf("Cycle counter not available\n"); + } else if (rc == RETURNCODE_ERESERVE) { + printf("Cycle counter claimed by another app\n"); + } else if (rc != 0) { + printf("Cycle counter: other error: %d\n", rc); + } + + if (rc != 0) { + return 0; + } + + cycle_counter_start(); + led_toggle(0); + cycle_counter_stop(); + cycle_counter_read(&cycles); + printf("cycles to toggle led first time: %d\n", cycles); + + cycle_counter_reset(); + cycle_counter_start(); + led_toggle(0); + cycle_counter_stop(); + cycle_counter_read(&cycles); + printf("cycles to toggle led second time: %d\n", cycles); + return 0; +} diff --git a/libtock/cycle_counter.c b/libtock/cycle_counter.c new file mode 100644 index 000000000..d7887a0aa --- /dev/null +++ b/libtock/cycle_counter.c @@ -0,0 +1,29 @@ +#include "cycle_counter.h" + +bool cycle_counter_exists(void) { + return driver_exists(DRIVER_NUM_CYCLE_COUNTER); +} + +// Start the cycle counter +int cycle_counter_start(void) { + syscall_return_t rval = command(DRIVER_NUM_CYCLE_COUNTER, 1, 0, 0); + return tock_command_return_novalue_to_returncode(rval); +} + +// Get the current cycle count +int cycle_counter_read(uint64_t* count) { + syscall_return_t rval = command(DRIVER_NUM_CYCLE_COUNTER, 2, 0, 0); + return tock_command_return_u64_to_returncode(rval, (uint64_t*) count); +} + +// Reset the cycle counter +int cycle_counter_reset(void) { + syscall_return_t rval = command(DRIVER_NUM_CYCLE_COUNTER, 3, 0, 0); + return tock_command_return_novalue_to_returncode(rval); +} + +// Stop the cycle counter +int cycle_counter_stop(void) { + syscall_return_t rval = command(DRIVER_NUM_CYCLE_COUNTER, 4, 0, 0); + return tock_command_return_novalue_to_returncode(rval); +} diff --git a/libtock/cycle_counter.h b/libtock/cycle_counter.h new file mode 100644 index 000000000..a39057abb --- /dev/null +++ b/libtock/cycle_counter.h @@ -0,0 +1,19 @@ +#pragma once + +#include "tock.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define DRIVER_NUM_CYCLE_COUNTER 0x00090008 + +bool cycle_counter_exists(void); +int cycle_counter_start(void); +int cycle_counter_stop(void); +int cycle_counter_reset(void); +int cycle_counter_read(int *count); + +#ifdef __cplusplus +} +#endif