From 281c0f68d5c4bdf955d4cefceb4de6d0e0321363 Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Sat, 12 Apr 2025 18:40:26 -0400 Subject: [PATCH] calculate cpu usage with a hardware timer had to bump the display stack size to keep snprintf from crashing --- main.c | 33 +++++++++++++++++++++++++++++++-- rtos.cfg | 4 ++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/main.c b/main.c index 5982e95..a59aac4 100644 --- a/main.c +++ b/main.c @@ -36,6 +36,8 @@ uint32_t gSystemClock = 120000000; // [Hz] system clock frequency tContext sContext; +uint32_t cputime_unloaded; + #define LOCAL_BUF_LEN 128 uint16_t adc_buffer_sample[LOCAL_BUF_LEN]; // copy of g adc buffer uint8_t adc_buffer_processed[LOCAL_BUF_LEN]; // copy of g adc buffer @@ -100,6 +102,26 @@ void start_signal() { PWMGenEnable(PWM0_BASE, PWM_GEN_1); } +uint32_t cpu_load_count(void) +{ + uint32_t i = 0; + TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT); + TimerEnable(TIMER1_BASE, TIMER_A); // start one-shot timer + while (!(TimerIntStatus(TIMER1_BASE, false) & TIMER_TIMA_TIMEOUT)) + i++; + return i; +} + +void start_cputimer() { + // initialize timer 1 in one-shot mode for polled timing + SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); + TimerDisable(TIMER1_BASE, TIMER_BOTH); + TimerConfigure(TIMER1_BASE, TIMER_CFG_ONE_SHOT); + TimerLoadSet(TIMER1_BASE, TIMER_A, gSystemClock/100); // 10ms interval + // baseline load + cputime_unloaded = cpu_load_count(); +} + /* * ======== main ======== */ @@ -111,6 +133,7 @@ int main(void) start_signal(); start_sampler(); ButtonInit(); + start_cputimer(); Crystalfontz128x128_Init(); // Initialize the LCD display driver Crystalfontz128x128_SetOrientation(LCD_ORIENTATION_UP); // set screen orientation @@ -215,6 +238,12 @@ void display_waveform(UArg arg1, UArg arg2) while(1) { Semaphore_pend(display_sem, BIOS_WAIT_FOREVER); + // calculate cpu usage + uint32_t cputime_loaded; + cputime_loaded = cpu_load_count(); + float usage_percent; + usage_percent = (1.0 - (float) cputime_loaded / (float) cputime_unloaded) * (float) 100.; + GrContextForegroundSet(&sContext, ClrBlack); GrRectFill(&sContext, &rectFullScreen); // fill screen with black @@ -235,8 +264,8 @@ void display_waveform(UArg arg1, UArg arg2) GrContextForegroundSet(&sContext, ClrWheat); GrStringDraw(&sContext, gVoltageScaleStr[voltage_scale], /*length*/ -1, /*x*/ 0, /*y*/ 0, /*opaque*/ false); GrStringDraw(&sContext, gTimeScaleStr[time_scale], /*length*/ -1, /*x*/ 60, /*y*/ 0, /*opaque*/ false); - //snprintf(str, sizeof(str), "CPU Load %.1f%%", usage_percent); - //GrStringDraw(&sContext, str, /*length*/ -1, /*x*/ 0, /*y*/ HEIGHT - 10, /*opaque*/ false); + snprintf(str, sizeof(str), "CPU Load %.1f%%", usage_percent); + GrStringDraw(&sContext, str, /*length*/ -1, /*x*/ 0, /*y*/ HEIGHT - 10, /*opaque*/ false); switch (trigger_mode) { case 1: diff --git a/rtos.cfg b/rtos.cfg index e9cb9ab..6f06a7a 100644 --- a/rtos.cfg +++ b/rtos.cfg @@ -567,7 +567,7 @@ Program.global.processing = Task.create("&process_waveform", task2Params); var task3Params = new Task.Params(); task3Params.instance.name = "display"; task3Params.priority = 5; -task3Params.stackSize = 1024; +task3Params.stackSize = 2048; Program.global.display = Task.create("&display_waveform", task3Params); var semaphore2Params0 = new Semaphore.Params(); semaphore2Params0.instance.name = "display_sem"; @@ -591,5 +591,5 @@ mailbox0Params.instance.name = "button_mailbox"; Program.global.button_mailbox = Mailbox.create(1, 9, mailbox0Params); var task5Params = new Task.Params(); task5Params.instance.name = "user_input"; -task5Params.priority = 4; +task5Params.priority = 6; Program.global.user_input = Task.create("&handle_user_input", task5Params);