Skip to content

Commit

Permalink
Add cycle counter driver and test app
Browse files Browse the repository at this point in the history
  • Loading branch information
hudson-ayers committed Apr 6, 2024
1 parent e5c540b commit f8e7bb0
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 0 deletions.
11 changes: 11 additions & 0 deletions examples/tests/cycle_count/Makefile
Original file line number Diff line number Diff line change
@@ -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
5 changes: 5 additions & 0 deletions examples/tests/cycle_count/README.md
Original file line number Diff line number Diff line change
@@ -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.
36 changes: 36 additions & 0 deletions examples/tests/cycle_count/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#include <stdio.h>

#include <cycle_counter.h>
#include <led.h>
#include <tock.h>

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;
}
29 changes: 29 additions & 0 deletions libtock/cycle_counter.c
Original file line number Diff line number Diff line change
@@ -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);
}
19 changes: 19 additions & 0 deletions libtock/cycle_counter.h
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit f8e7bb0

Please sign in to comment.