From 024b43dfa339c114d7d6d6b52ce7d9a941408c27 Mon Sep 17 00:00:00 2001 From: Jon Trulson Date: Mon, 5 Dec 2016 13:38:51 -0700 Subject: [PATCH] utilities: fix new Zephyr k_timer based implementation - Fixed the Zephyr kernel version checks to check for 0.1.6 rather than 1.6.0. - fixed the k_timer implementation to actually work. None of these were being called correctly. - due to the fact that the k_timer API only has a 1ms resolution, re-implement upm_delay_us() (on 0.1.6 version of zephyr) as a busy loop using a upm_clock_t. Signed-off-by: Jon Trulson --- src/utilities/upm_utilities.c | 39 ++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/utilities/upm_utilities.c b/src/utilities/upm_utilities.c index 74aff7c8..3c74acd6 100644 --- a/src/utilities/upm_utilities.c +++ b/src/utilities/upm_utilities.c @@ -30,12 +30,16 @@ void upm_delay(int time){ #if defined(UPM_PLATFORM_LINUX) sleep(time); #elif defined(UPM_PLATFORM_ZEPHYR) -# if SYS_KERNEL_VER_MAJOR(KERNEL_VERSION_NUMBER) == 1 && \ - SYS_KERNEL_VER_MINOR(KERNEL_VERSION_NUMBER) >= 6 +# if SYS_KERNEL_VER_MAJOR(KERNEL_VERSION_NUMBER) == 0 && \ + SYS_KERNEL_VER_MINOR(KERNEL_VERSION_NUMBER) == 1 && \ + SYS_KERNEL_VER_PATCHLEVEL(KERNEL_VERSION_NUMBER) >= 6 + + if (time <= 0) + time = 1; struct k_timer timer; k_timer_init(&timer, NULL, NULL); - k_timer_start(&timer, SECONDS(time) + 1, 0); + k_timer_start(&timer, time * 1000, 0); k_timer_status_sync(&timer); # else @@ -55,12 +59,16 @@ void upm_delay_ms(int time){ #if defined(UPM_PLATFORM_LINUX) usleep(1000 * time); #elif defined(UPM_PLATFORM_ZEPHYR) -# if SYS_KERNEL_VER_MAJOR(KERNEL_VERSION_NUMBER) == 1 && \ - SYS_KERNEL_VER_MINOR(KERNEL_VERSION_NUMBER) >= 6 +# if SYS_KERNEL_VER_MAJOR(KERNEL_VERSION_NUMBER) == 0 && \ + SYS_KERNEL_VER_MINOR(KERNEL_VERSION_NUMBER) == 1 && \ + SYS_KERNEL_VER_PATCHLEVEL(KERNEL_VERSION_NUMBER) >= 6 + + if (time <= 0) + time = 1; struct k_timer timer; k_timer_init(&timer, NULL, NULL); - k_timer_start(&timer, MSEC(time) + 1, 0); + k_timer_start(&timer, time, 0); k_timer_status_sync(&timer); # else @@ -79,13 +87,20 @@ void upm_delay_us(int time){ #if defined(UPM_PLATFORM_LINUX) usleep(time); #elif defined(UPM_PLATFORM_ZEPHYR) -# if SYS_KERNEL_VER_MAJOR(KERNEL_VERSION_NUMBER) == 1 && \ - SYS_KERNEL_VER_MINOR(KERNEL_VERSION_NUMBER) >= 6 +# if SYS_KERNEL_VER_MAJOR(KERNEL_VERSION_NUMBER) == 0 && \ + SYS_KERNEL_VER_MINOR(KERNEL_VERSION_NUMBER) == 1 && \ + SYS_KERNEL_VER_PATCHLEVEL(KERNEL_VERSION_NUMBER) >= 6 - struct k_timer timer; - k_timer_init(&timer, NULL, NULL); - k_timer_start(&timer, USEC(time) + 1, 0); - k_timer_status_sync(&timer); + // we will use a upm_clock to do microsecond timings here as k_timer has + // only a millisecond resolution. So we init a clock and spin. + + if (time <= 0) + time = 1; + + upm_clock_t timer; + upm_clock_init(&timer); + while (upm_elapsed_us(&timer) < time) + ; // spin # else